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

[インデックス 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 buildgo 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桁の数字で構成されます。

参考にした情報源リンク