[インデックス 16915] ファイルの概要
このコミットは、Goプロジェクトのビルドスクリプト src/run.bash
における問題を修正するものです。具体的には、テストがすべて成功したにもかかわらず、スクリプトが常にエラー終了コード(exit 1
)を返してしまうという誤った挙動を修正し、ビルドプロセスが正しく成功を示すように変更しています。
コミット
- コミットハッシュ:
fdb69cb0a32c6eb0a2ff8f4fdce170b982faf26e
- 作者: Russ Cox rsc@golang.org
- コミット日時: Mon Jul 29 16:52:40 2013 -0400
- コミットメッセージ:
build: fix build As promised. TBR=dvyukov CC=golang-dev https://golang.org/cl/12063043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/fdb69cb0a32c6eb0a2ff8f4fdce170b982faf26e
元コミット内容
build: fix build
As promised.
TBR=dvyukov
CC=golang-dev
https://golang.org/cl/12063043
変更の背景
このコミットの背景には、Goプロジェクトのビルドおよびテストスクリプトである src/run.bash
が、テストの実行結果に関わらず常に失敗を示す終了コードを返していたという問題があります。コミットメッセージの「As promised.」という記述から、この問題が以前から認識されており、修正が約束されていたことが伺えます。
通常、シェルスクリプトでは、コマンドの成功は終了コード 0
で示され、失敗は 0
以外の終了コードで示されます。src/run.bash
はGoプロジェクトのテストスイートを実行する役割を担っており、テストがすべて成功した場合には、スクリプト自体も成功を示すべきです。しかし、このコミット以前のバージョンでは、スクリプトの最後に無条件に exit 1
が記述されており、これによりテストが成功してもビルドシステムやCI/CDパイプラインが誤って失敗と判断してしまう状況が発生していました。
この修正は、ビルドプロセスの健全性を確保し、テスト結果が正確に反映されるようにするために不可欠でした。
前提知識の解説
シェルスクリプトの終了コード (exit
コマンド)
シェルスクリプトにおいて、exit
コマンドはスクリプトの実行を終了し、指定された終了コード(ステータスコード)を返します。
exit 0
: 慣例的に、コマンドやスクリプトが正常に終了したことを示します。exit N
(Nは0以外の整数): 慣例的に、コマンドやスクリプトが何らかのエラーや異常な状態で終了したことを示します。1
は一般的なエラー、2
は誤った使用法など、特定の意味を持つ場合がありますが、基本的には非ゼロであれば失敗と見なされます。
ビルドシステムやCI/CDツールは、実行されたコマンドやスクリプトの終了コードをチェックして、その成否を判断します。
src/run.bash
の役割
src/run.bash
は、Goプロジェクトのソースコードリポジトリに含まれるシェルスクリプトであり、Goのビルドプロセスの一部として、または開発者が手動でテストを実行する際に使用される主要なスクリプトの一つです。このスクリプトは、Goのツールチェーン(go tool
コマンドなど)を利用して、APIの整合性チェックや各種テストの実行など、Goプロジェクトの健全性を検証するための様々なタスクを実行します。スクリプトの出力には、テストの進行状況や結果が表示され、最終的に「ALL TESTS PASSED」というメッセージが表示されることで、すべてのテストが成功したことを示します。
Goのビルドシステム
Goのビルドシステムは、Go言語で書かれたプログラムをコンパイルし、実行可能なバイナリを生成するための仕組みです。go build
や go test
といったコマンドがその中心を担いますが、Goプロジェクト自体の開発においては、より複雑なテストや検証プロセスが必要となるため、src/run.bash
のような補助的なスクリプトが用いられます。これらのスクリプトは、Goのソースコードをビルドし、テストを実行し、その結果を報告する役割を担っています。
技術的詳細
このコミットの技術的な詳細は、非常にシンプルながらも重要なロジックの修正にあります。
src/run.bash
スクリプトの元のバージョンでは、スクリプトの末尾に以下の行が存在していました。
echo
echo ALL TESTS PASSED
-
-exit 1
このコードブロックは、echo ALL TESTS PASSED
というメッセージを出力した後、無条件に exit 1
を実行していました。
echo ALL TESTS PASSED
: この行は、その直前のGoツールAPIチェックが成功し、すべてのテストがパスしたことをユーザーに通知するためのものです。これは、スクリプトが意図したタスクを正常に完了したことを示す肯定的なメッセージです。exit 1
: しかし、この肯定的なメッセージの直後にexit 1
が続くことで、スクリプトは常に「失敗」の終了コードを返していました。これは、テストが実際にすべて成功したとしても、スクリプトの実行結果としてはエラーとして扱われることを意味します。
この挙動は、自動化されたビルドシステムやCI/CDパイプラインにとって問題となります。これらのシステムは、スクリプトの終了コードが 0
であることを期待して成功と判断するため、exit 1
が返されると、たとえテストがすべてパスしていてもビルドが失敗したと報告されてしまいます。
このコミットでは、単にこの誤った exit 1
の行を削除することで、この問題を解決しています。シェルスクリプトでは、明示的な exit
コマンドがない場合、最後に実行されたコマンドの終了コードがスクリプト全体の終了コードとなります。src/run.bash
の場合、go tool api
コマンドやその他のテストコマンドが正常に終了すれば、スクリプト全体も 0
の終了コードを返すことになります。これにより、テストが成功した場合にはビルドも成功と正しく報告されるようになります。
コアとなるコードの変更箇所
変更は src/run.bash
ファイルの1箇所のみです。
--- a/src/run.bash
+++ b/src/run.bash
@@ -185,5 +185,3 @@ go tool api -c $GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt -next $GOROOT/api/next.
echo
echo ALL TESTS PASSED
-
-exit 1
コアとなるコードの解説
変更された行は、src/run.bash
スクリプトの末尾近くに位置していました。
元のコード:
echo
echo ALL TESTS PASSED
exit 1
変更後:
echo
echo ALL TESTS PASSED
削除された exit 1
は、スクリプトが正常に完了したことを示す echo ALL TESTS PASSED
の直後に配置されていました。この exit 1
が削除されたことにより、スクリプトはテストが成功した場合に、最後に実行されたコマンド(この場合は echo ALL TESTS PASSED
の前の go tool api
コマンドなど)の終了コードを継承するようになります。Goのテストやビルドツールが成功すれば 0
を返すため、スクリプト全体も 0
で終了し、ビルドの成功が正しく伝達されるようになります。
関連リンク
コミットメッセージに https://golang.org/cl/12063043
というChange List (CL) へのリンクが記載されていますが、このCL番号は現在アクセスできないか、古い形式のものである可能性があります。GoのCLは通常、6桁の数字で構成されます。
参考にした情報源リンク
- Go GitHubコミット: https://github.com/golang/go/commit/fdb69cb0a32c6eb0a2ff8f4fdce170b982faf26e
- シェルスクリプトの
exit
コマンドに関する一般的な知識 - Goプロジェクトのビルドおよびテストプロセスの一般的な理解