[インデックス 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 test
やgo 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
を返します。
技術的詳細
このコミットの技術的詳細は、主に以下の点に集約されます。
-
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のテストフレームワークが提供するベンチマーク機能が活用されるようになります。
-
test/bench/go1
ディレクトリの整理:Makefile
が削除されました。これは、run.bash
がgo test
を直接呼び出すようになったため、このMakefile
が不要になったことを意味します。dummy.go
ファイルも削除されました。このファイルは、_test
ファイルにすべてのロジックがあることを示すためのプレースホルダーでしたが、Makefile
の削除とテスト実行方法の変更に伴い、その存在意義がなくなりました。
-
test/bench/go1/gzip_test.go
の修正:gzip.NewWriter
の呼び出しからエラーハンドリング(if err != nil { panic(err) }
)が削除されました。これは、gzip.NewWriter
がGo 1.0の時点ではエラーを返さない設計であったため、不要なコードが削除されたと考えられます。当時のGoのAPI設計では、エラーを返す関数と返さない関数が混在しており、この変更はそのAPIの特性に合わせたものです。ioutil.Discard
への書き込みも同様にエラーハンドリングが削除されています。
-
.hgignore
の修正:doc/codelab/wiki/*.bin
がdoc/articles/wiki/*.bin
に、misc/dashboard/builder/gobuilder
がmisc/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/Makefile
とdummy.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/
にリダイレクトされます)
参考にした情報源リンク
- Go Command
go test
: https://go.dev/cmd/go/#hdr-Test_packages - Go Command
go build
: https://go.dev/cmd/go/#hdr-Compile_packages_and_dependencies - Go
compress/gzip
package: https://go.dev/pkg/compress/gzip/ - Go
io/ioutil
package (deprecated, nowio
): https://go.dev/pkg/io/ioutil/ - Mercurial
.hgignore
documentation: https://www.mercurial-scm.org/wiki/hgignore - Shell scripting basics (for
run.bash
context): https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html - Makefiles tutorial: https://www.gnu.org/software/make/manual/make.html