Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 12494] ファイルの概要

このコミットは、Go言語プロジェクトのビルドシステムとテストスクリプトに関する修正です。具体的には、src/run.bashスクリプト内で一時的に無効化されていたいくつかのテストを再度有効にし、関連するベンチマークテストの実行方法を改善しています。また、.hgignoreファイル内のパス修正と、test/bench/go1ディレクトリ内の古いMakefileおよびダミーファイルの削除も含まれています。

コミット

  • コミットハッシュ: 90010f8f6351256113368130a4040da78e1fe401
  • 作者: Shenghou Ma minux.ma@gmail.com
  • コミット日時: 2012年3月8日 木曜日 06:23:56 +0800

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/90010f8f6351256113368130a4040da78e1fe401

元コミット内容

build: re-enable some broken tests in run.bash
        Updates #2982.

R=rsc, rsc
CC=golang-dev
https://golang.org/cl/5759064

変更の背景

このコミットの主な背景は、Go言語のビルドおよびテストプロセスにおける効率性と正確性の向上です。コミットメッセージにあるUpdates #2982は、GoプロジェクトのIssueトラッカーにおける特定の課題(Issue 2982: run.bash should run all tests)に対応していることを示しています。

当時のrun.bashスクリプトは、何らかの理由(例えば、テストの不安定性、環境依存性、または単に一時的な無効化)により、一部のテストがBROKENフラグによってスキップされていました。これは、CI/CDパイプラインや開発者のローカル環境でのテスト実行において、本来実行されるべきテストが実行されず、潜在的なバグを見逃すリスクを意味します。

また、test/bench/go1ディレクトリ内のベンチマークテストは、Makefileを使用して実行されていましたが、Goの標準的なテストコマンドであるgo testへの移行が進んでいたと考えられます。Makefileの削除とgo testへの切り替えは、ビルドシステムの簡素化と一貫性の向上を目的としています。

さらに、.hgignoreファイル内のパスの修正は、リポジトリの管理とビルド成果物の除外設定の正確性を保つためのメンテナンス作業です。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびシェルスクリプトに関する基本的な知識が必要です。

  • run.bash: Go言語プロジェクトのルートディレクトリにあるシェルスクリプトで、Goのソースコードをビルドし、テストを実行するための主要なスクリプトです。Goの初期のビルドシステムにおいて重要な役割を担っていました。
  • go test: Go言語の標準的なテスト実行コマンドです。Goのテストファイル(_test.goで終わるファイル)を自動的に検出し、テスト関数(TestXxx)やベンチマーク関数(BenchmarkXxx)を実行します。
  • go build: Go言語の標準的なビルドコマンドです。Goのソースコードをコンパイルして実行可能ファイルを生成します。
  • Makefile: makeユーティリティが使用するビルド自動化スクリプトです。特定のターゲット(例: test, clean)に対して実行するコマンドを定義します。Goプロジェクトでは、go testgo buildが普及する以前は、ビルドやテストの自動化に広く使われていました。
  • .hgignore: Mercurialバージョン管理システムで使用される設定ファイルで、Gitの.gitignoreに相当します。バージョン管理の対象から除外するファイルやディレクトリのパターンを定義します。このコミットでは、Mercurialが使用されていた時代の名残が見られます。
  • GOMAKE: Goのビルドシステムで使用される環境変数で、makeコマンドへのパスを指すことがありました。このコミットでは、Makefileの削除に伴い、その使用が減っています。
  • GOROOT: Goのインストールディレクトリを指す環境変数です。Goのツールや標準ライブラリの場所を特定するために使用されます。
  • GOARCH: ターゲットとするCPUアーキテクチャ(例: amd64, arm)を示す環境変数です。特定のアーキテクチャに依存するテストのスキップ条件などで使用されます。
  • CGO_ENABLED: CGO(GoとC言語の相互運用機能)が有効になっているかどうかを示す環境変数です。CGOに依存するテストの実行条件などで使用されます。
  • ioutil.Discard: Goのio/ioutilパッケージ(Go 1.16以降はioパッケージに統合)にあるWriterインターフェースの実装です。書き込まれたデータをすべて破棄します。ベンチマークテストなどで、実際の出力が不要な場合にパフォーマンス測定のオーバーヘッドを避けるために使用されます。
  • compress/gzip.NewWriter: Goのcompress/gzipパッケージにある関数で、gzip形式でデータを圧縮するためのWriterを返します。

技術的詳細

このコミットの技術的詳細は、主に以下の点に集約されます。

  1. run.bashスクリプトの改善:

    • BROKEN=trueという変数が削除され、これによって制御されていたテストのスキップロジックが解除されました。これにより、以前は「壊れている」とマークされていたテストが再び実行されるようになります。
    • ../doc/codelab/wikiから../doc/articles/wikiへのパス変更が行われました。これはドキュメントの構成変更に対応したものです。また、"$GOMAKE"を使ったmakeコマンドの実行から、より直接的なmake clean./test.shの実行に変わっています。
    • ../misc/dashboard/builder../misc/goplayのビルド方法が、"$GOMAKE"を使ったmakeコマンドから、go buildコマンドに直接変更されました。これはGoの標準的なビルドツールへの移行を示しています。
    • ../test/bench/go1のベンチマークテストの実行方法が、"$GOMAKE" testからgo test ../test/bench/go1に直接変更されました。これにより、Goのテストフレームワークが提供するベンチマーク機能が活用されるようになります。
  2. test/bench/go1ディレクトリの整理:

    • Makefileが削除されました。これは、run.bashgo testを直接呼び出すようになったため、このMakefileが不要になったことを意味します。
    • dummy.goファイルも削除されました。このファイルは、_testファイルにすべてのロジックがあることを示すためのプレースホルダーでしたが、Makefileの削除とテスト実行方法の変更に伴い、その存在意義がなくなりました。
  3. test/bench/go1/gzip_test.goの修正:

    • gzip.NewWriterの呼び出しからエラーハンドリング(if err != nil { panic(err) })が削除されました。これは、gzip.NewWriterがGo 1.0の時点ではエラーを返さない設計であったため、不要なコードが削除されたと考えられます。当時のGoのAPI設計では、エラーを返す関数と返さない関数が混在しており、この変更はそのAPIの特性に合わせたものです。ioutil.Discardへの書き込みも同様にエラーハンドリングが削除されています。
  4. .hgignoreの修正:

    • doc/codelab/wiki/*.bindoc/articles/wiki/*.binに、misc/dashboard/builder/gobuildermisc/dashboard/builder/builderにそれぞれ変更されました。これは、ファイルパスの変更や、ビルド成果物の命名規則の変更に対応したものです。

これらの変更は、Goプロジェクト全体のビルドとテストのインフラストラクチャをより堅牢で、標準的で、効率的なものにするための継続的な取り組みの一環です。特に、Makefileからgo test/go buildへの移行は、Goエコシステムにおける標準ツールの採用を促進する重要なステップでした。

コアとなるコードの変更箇所

src/run.bash

--- a/src/run.bash
+++ b/src/run.bash
@@ -39,8 +39,6 @@ xcd() {
 	builtin cd "$GOROOT"/src/$1
 }
 
-BROKEN=true
-
 [ "$CGO_ENABLED" != 1 ] ||
 [ "$GOHOSTOS" == windows ] ||
 (xcd ../misc/cgo/stdio
@@ -70,33 +68,24 @@ $BROKEN ||
 time ./run
 ) || exit $?\n
-$BROKEN ||
 [ "$GOARCH" == arm ] ||  # uses network, fails under QEMU
-(xcd ../doc/codelab/wiki
-"$GOMAKE" clean
-"$GOMAKE"
-"$GOMAKE" test
+(xcd ../doc/articles/wiki
+make clean
+./test.sh
 ) || exit $?\n
-$BROKEN ||
-for i in ../misc/dashboard/builder ../misc/goplay
-do
-\t(xcd $i
-\t"$GOMAKE" clean
-\t"$GOMAKE"
-\t) || exit $?\n
-done
+echo
+echo '#' ../misc/dashboard/builder ../misc/goplay
+go build ../misc/dashboard/builder ../misc/goplay || exit $?\n
-$BROKEN ||
 [ "$GOARCH" == arm ] ||
 (xcd ../test/bench/shootout
 ./timing.sh -test
 ) || exit $?\n
-$BROKEN ||
-(xcd ../test/bench/go1
-"$GOMAKE" test
-) || exit $?\n
+echo
+echo '#' ../test/bench/go1
+go test ../test/bench/go1 || exit $?\n
 (xcd ../test
 time go run run.go

test/bench/go1/Makefile (削除)

--- a/test/bench/go1/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-
-TARG=go1
-
-test:
-	echo go1: tests disabled for now TODO

test/bench/go1/dummy.go (削除)

--- a/test/bench/go1/dummy.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package go1
-
-// Nothing to see here: everything is in the _test files.

test/bench/go1/gzip_test.go

--- a/test/bench/go1/gzip_test.go
+++ b/test/bench/go1/gzip_test.go
@@ -21,20 +21,14 @@ var (
 
 func init() {
 	var buf bytes.Buffer
-	c, err := gz.NewWriter(&buf)
-	if err != nil {
-		panic(err)
-	}
+	c := gz.NewWriter(&buf)
 	c.Write(jsongunz)
 	c.Close()
 	jsongz = buf.Bytes()
 }
 
 func gzip() {
-	c, err := gz.NewWriter(ioutil.Discard)
-	if err != nil {
-		panic(err)
-	}
+	c := gz.NewWriter(ioutil.Discard)
 	if _, err := c.Write(jsongunz); err != nil {
 		panic(err)
 	}

.hgignore

--- a/.hgignore
+++ b/.hgignore
@@ -24,10 +24,10 @@ _testmain.go
 build.out
 test.out
 doc/tmpltohtml
-doc/codelab/wiki/*.bin
+doc/articles/wiki/*.bin
 misc/cgo/life/run.out
 misc/cgo/stdio/run.out
-misc/dashboard/builder/gobuilder
+misc/dashboard/builder/builder
 misc/goplay/goplay
 misc/osx/*.pkg
 misc/osx/*.dmg

コアとなるコードの解説

  • src/run.bashの変更:

    • BROKEN=trueの削除は、このフラグによってスキップされていたテスト群が再び実行対象となることを意味します。これにより、テストカバレッジが向上し、潜在的な回帰バグの検出に役立ちます。
    • ../doc/codelab/wikiから../doc/articles/wikiへのパス変更は、Goのドキュメント構造の変更に合わせたものです。"$GOMAKE"からmake./test.shへの変更は、特定のビルドツールへの依存を減らし、より直接的なスクリプト実行に移行しています。
    • ../misc/dashboard/builder../misc/goplayのビルドをgo buildに切り替えたことは、Goの標準ビルドシステムへの移行を明確に示しています。これにより、Goプロジェクトのビルドプロセスがより一貫性のあるものになります。
    • ../test/bench/go1のベンチマークテストをgo testで実行するように変更したことは、Goの組み込みベンチマークツールを活用することを意味します。これは、ベンチマークの実行と結果の解析をより簡単かつ標準的な方法で行えるようにします。
  • test/bench/go1/Makefiledummy.goの削除:

    • これらのファイルの削除は、test/bench/go1ディレクトリのベンチマークテストがgo testコマンドによって直接管理されるようになったため、Makefileが不要になったことを示しています。dummy.goも同様に、go testの仕組みに合わせた整理の一環として削除されました。これにより、プロジェクトの依存関係が簡素化され、メンテナンスが容易になります。
  • test/bench/go1/gzip_test.goの変更:

    • gzip.NewWriterの呼び出しからエラーチェックを削除したことは、当時のcompress/gzipパッケージのAPI設計が、NewWriterがエラーを返さない(常に有効なWriterを返す)ことを前提としていたためです。これは、Goの初期のAPI設計における特徴の一つであり、後のバージョンでエラーを返すように変更される可能性もありますが、この時点では不要なコードとして削除されました。ioutil.Discardへの書き込みも同様です。
  • .hgignoreの変更:

    • パスの修正は、リポジトリ内のファイルやディレクトリの再編成に対応するためのものです。これにより、Mercurialが不要なビルド成果物や一時ファイルを適切に無視し、リポジトリのクリーンさを保つことができます。

これらの変更は全体として、Goプロジェクトのビルド、テスト、およびリポジトリ管理のプロセスを合理化し、より現代的でGoの標準ツールに準拠した形に進化させることを目的としています。

関連リンク

  • Go Change List: https://golang.org/cl/5759064
  • Go Issue 2982: run.bash should run all tests: https://go.dev/issue/2982 (当時のGo IssueトラッカーのURLはcode.google.com/p/go/issues/detail?id=2982のような形式でしたが、現在はgo.dev/issue/にリダイレクトされます)

参考にした情報源リンク