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

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

このコミットは、src/run.bash ファイルに変更を加えています。

コミット

commit a5b2623dab33d4e54b9995d0f0cfd4b95b439683
Author: Russ Cox <rsc@golang.org>
Date:   Fri Mar 15 12:39:14 2013 -0400

    build: skip benchmarks on OpenBSD
    
    They are making the build die. I want to be able to see that everything else is okay.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/7546049

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

https://github.com/golang/go/commit/a5b2623dab33d4e54b9995d0f0cfd4b95b439683

元コミット内容

build: skip benchmarks on OpenBSD

They are making the build die. I want to be able to see that everything else is okay.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7546049

変更の背景

このコミットは、OpenBSD 環境で Go のベンチマークテストを実行するとビルドプロセス全体が失敗するという問題に対処するために行われました。コミットメッセージには「They are making the build die. I want to be able to see that everything else is okay.(それらがビルドを停止させている。他のすべてが問題ないことを確認したい。)」と明記されており、ベンチマークテストが原因でビルドが中断されるため、他のテストやビルドの健全性を確認できない状況を回避することが目的です。

具体的には、golang.org/issue/5057 に関連する問題として言及されています。このイシューは、Go プロジェクトのビルドおよびテストインフラストラクチャ内の bash サブシェルにおける set -e コマンドの動作に関連するもので、Go 言語自体のバグではなく、ビルドスクリプトの運用上の詳細に関するものです。OpenBSD 環境でのベンチマーク実行時に特定の条件下でスクリプトが異常終了し、それがビルド全体の失敗につながっていたと考えられます。

この変更により、OpenBSD 環境ではベンチマークテストをスキップすることで、ビルドプロセスが正常に完了し、他の重要なテストやビルドの検証が可能になります。これは、特定の環境における一時的な回避策として導入されたものです。

前提知識の解説

  • Go 言語: Google が開発したオープンソースのプログラミング言語。シンプルさ、効率性、並行処理のサポートが特徴です。
  • go test: Go 言語の標準テストツール。パッケージ内のテスト関数を実行し、結果を報告します。ベンチマークテストもこのツールで実行されます。
  • go build: Go 言語の標準ビルドツール。Go のソースコードをコンパイルして実行可能ファイルやライブラリを生成します。
  • src/run.bash: Go プロジェクトのルートディレクトリにあるシェルスクリプト。Go のビルド、テスト、ベンチマーク実行など、プロジェクト全体のCI/CDパイプラインや開発環境のセットアップに関連するタスクを自動化するために使用されます。
  • OpenBSD: セキュリティとコードの品質に重点を置いた、UNIX ベースのフリーなオープンソースオペレーティングシステム。Go のようなクロスプラットフォーム言語は、様々なOSで動作するようにテストされます。
  • ベンチマーク (Benchmarks): ソフトウェアの性能を測定するためのテスト。Go の場合、go test -bench=. のように実行され、関数の実行時間やメモリ使用量などを測定します。
  • set -e (Bash): Bash シェルスクリプトのオプションの一つで、コマンドが失敗(ゼロ以外の終了ステータスを返す)した場合にスクリプトを即座に終了させるようにします。これにより、エラーが発生した際にスクリプトが予期せぬ動作を続けることを防ぎ、早期に問題を検出できます。しかし、特定の状況下(例えば、サブシェルやパイプライン内でのエラーハンドリング)では、意図しないスクリプトの終了を引き起こすことがあります。
  • GOOS 環境変数: Go のビルドシステムで使用される環境変数で、ターゲットとなるオペレーティングシステムを指定します。例えば、GOOS=linux は Linux 向け、GOOS=openbsd は OpenBSD 向けにビルドすることを意味します。

技術的詳細

このコミットは、src/run.bash スクリプトに条件付きの実行ロジックを追加することで、OpenBSD 環境でのベンチマークテストの実行をスキップします。

変更の核心は、以下の bash スクリプトの構文にあります。

[ "$GOOS" == openbsd ] || # golang.org/issue/5057
(
echo
echo '#' ../test/bench/go1
go test ../test/bench/go1
) || exit $?

このコードブロックは、以下の要素で構成されています。

  1. [ "$GOOS" == openbsd ]: これは bash の条件式です。環境変数 GOOS の値が文字列 openbsd と等しいかどうかを評価します。
    • もし GOOSopenbsd であれば、この条件式は真となり、終了ステータス 0 を返します。
    • もし GOOSopenbsd でなければ、この条件式は偽となり、終了ステータス 1 を返します。
  2. ||: これは bash の論理 OR 演算子です。左側のコマンド(この場合は [ "$GOOS" == openbsd ])が失敗(ゼロ以外の終了ステータスを返す)した場合にのみ、右側のコマンドを実行します。
  3. ( ... ): これはサブシェルを作成します。サブシェル内で実行されるコマンドは、親シェルの環境に影響を与えません(ただし、終了ステータスは親シェルに伝播します)。このサブシェル内では、ベンチマークテストを実行するコマンドが含まれています。
    • echo
    • echo '#' ../test/bench/go1
    • go test ../test/bench/go1
  4. || exit $?: この部分も論理 OR 演算子を使用しています。サブシェル ( ... ) の実行が失敗(ゼロ以外の終了ステータスを返す)した場合にのみ、exit $? が実行されます。$? は直前のコマンドの終了ステータスを表す特殊変数です。これにより、ベンチマークテストが失敗した場合にスクリプト全体が終了するようになっています。

動作のロジック:

  • GOOSopenbsd の場合:
    • [ "$GOOS" == openbsd ] は真となり、終了ステータス 0 を返します。
    • 論理 OR 演算子 || の左側が成功したため、右側のサブシェル ( ... )実行されません
    • 結果として、OpenBSD 環境ではベンチマークテストがスキップされます。
  • GOOSopenbsd ではない場合:
    • [ "$GOOS" == openbsd ] は偽となり、終了ステータス 1 を返します。
    • 論理 OR 演算子 || の左側が失敗したため、右側のサブシェル ( ... )実行されます
    • サブシェル内で go test ../test/bench/go1 が実行され、ベンチマークテストが行われます。
    • ベンチマークテストが成功すればサブシェルは成功し、スクリプトは続行されます。失敗すれば || exit $? によってスクリプトが終了します。

この変更により、OpenBSD 環境でのビルドの安定性が向上し、ベンチマークテストの失敗がビルド全体の失敗を引き起こすことを防ぎます。

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

--- a/src/run.bash
+++ b/src/run.bash
@@ -116,9 +116,12 @@ go build ../misc/dashboard/builder ../misc/goplay
 ./timing.sh -test
 ) || exit $?\n 
+[ "$GOOS" == openbsd ] || # golang.org/issue/5057
+(\n echo
 echo '#\' ../test/bench/go1
 go test ../test/bench/go1
+) || exit $?\n 
 \n (xcd ../test
 unset GOMAXPROCS

コアとなるコードの解説

変更は src/run.bash ファイルの116行目以降に集中しています。

追加された行は以下の通りです。

+[ "$GOOS" == openbsd ] || # golang.org/issue/5057
+(\
 echo
 echo '#\' ../test/bench/go1
 go test ../test/bench/go1
+) || exit $?\
  • + で始まる行が追加された行を示しています。
  • [ "$GOOS" == openbsd ] || : この部分が、GOOS 環境変数が openbsd であるかどうかをチェックする条件分岐です。もし GOOSopenbsd であれば、この条件式は成功し、|| の右側のコマンド(ベンチマークテストの実行)はスキップされます。
  • # golang.org/issue/5057: これはコメントで、この変更が golang.org/issue/5057 に関連していることを示しています。
  • () で囲まれたブロックはサブシェルです。このサブシェル内で、ベンチマークテスト (go test ../test/bench/go1) が実行されます。
  • || exit $?: サブシェルの実行が失敗した場合(ベンチマークテストが失敗した場合)、スクリプト全体がその終了ステータスで終了します。

この変更により、OpenBSD 環境でのみベンチマークテストが実行されなくなり、ビルドの安定性が確保されます。

関連リンク

参考にした情報源リンク

  • golang.org/issue/5057 に関するウェブ検索結果:
    • googlesource.com (https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGXPom6sy_DAB3A1cKeGjysDc5FBTfs-b3ZI2aTgY2oRt4vMf8m7o5CT6qTOKAJ46BCqK_R2wtd001bPDBgalsntgpQiDD51ytnIimQb2OWybHag_-9jWyktAmh7ZrhQtA5gbeFaZbvGCJ4on2G3DXOkj-ePoYkgSHJXOE1L0zfuIM=)
    • googlesource.com (https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHLEJ4LT1HSim7tajb4wx3DMwhx2uRMTlu4qj5J7Uh7C7KrbZYeWBmvaqx5uu0RbmapRgiLAhW2-k6SINOeoBvGkJBlU07W2R9RD_Q3QRTHRoCCEfGQWUsuRnGmM4Y_-0mUh76ei0_VB65NLoEPRa9Zb7VWSf0d_MMK33SkadPW_zHWTFjXiyY)
  • Bash の条件式 [ および論理演算子 || に関する一般的な情報。
  • Go のビルドシステムと環境変数 GOOS に関する一般的な情報。
  • Go のテストとベンチマークに関する一般的な情報。