[インデックス 12831] ファイルの概要
このコミットは、Go言語のビルドシステムにおけるテスト実行前の環境設定に関する変更です。具体的には、テストが正しく実行されるように、GOROOT_FINAL
環境変数をテスト実行前に解除する修正が加えられています。これにより、特にruntime/debug
パッケージがソースコードに正しくアクセスできるようになり、ビルドの安定性が向上します。
コミット
commit 34ace1043ea17eccc48777144ad6b62d31a00690
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Wed Apr 4 23:14:54 2012 +0800
build: unset GOROOT_FINAL before tests
Fix the builders.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5976068
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/34ace1043ea17eccc48777144ad6b62d31a00690
元コミット内容
build: unset GOROOT_FINAL before tests
Fix the builders.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5976068
変更の背景
この変更の背景には、Go言語のビルドシステム、特にテスト実行環境における特定の課題がありました。Goのビルドプロセスでは、GOROOT
という環境変数がGoのインストールディレクトリを指し示します。しかし、クロスコンパイルや特定のデプロイメントシナリオでは、最終的なGoのルートディレクトリを示すGOROOT_FINAL
という環境変数が設定されることがあります。
問題は、GOROOT_FINAL
が設定された状態でテストを実行すると、runtime/debug
パッケージのような、実行時にソースコードやデバッグ情報にアクセスする必要があるパッケージが正しく機能しない場合があることでした。runtime/debug
パッケージは、スタックトレースの取得やデバッグ情報の表示など、実行中のプログラムの内部状態を検査する機能を提供します。これらの機能が正しく動作するためには、Goのソースコードが期待されるパスに存在し、アクセス可能である必要があります。
GOROOT_FINAL
が設定されていると、システムはGoのソースコードが最終的なデプロイメントパスにあると解釈しますが、テスト環境では開発中のソースツリーを参照する必要があるため、パスの不一致が発生し、テストが失敗する原因となっていました。このコミットは、この問題を解決し、Goのビルドシステム(特にCI/CD環境の「ビルダー」)が安定してテストを実行できるようにするために導入されました。
前提知識の解説
Go言語の環境変数 (GOROOT
, GOPATH
, GOROOT_FINAL
)
GOROOT
: Goのインストールディレクトリを指す環境変数です。Goのコンパイラ、標準ライブラリ、ツールなどがこのディレクトリに配置されます。Goのツールチェーンは、このGOROOT
を基準に動作します。GOPATH
: Goのワークスペースディレクトリを指す環境変数です。Goのソースコード、パッケージ、バイナリなどがこのディレクトリに配置されます。Go 1.11以降のGo Modulesの導入により、GOPATH
の重要性は以前ほどではなくなりましたが、依然として一部のレガシーなビルドシステムや特定のツールで使用されることがあります。GOROOT_FINAL
: これはGoのビルドプロセスにおいて、最終的にGoがインストールされるパスを示すために使用される環境変数です。特に、GoのソースコードからGo自体をビルドする際(ブートストラップビルド)や、クロスコンパイルされたGoバイナリが特定の場所にデプロイされることを想定している場合に設定されることがあります。この変数が設定されていると、Goのツールは、実行時に参照するべきGoのルートディレクトリがGOROOT_FINAL
で指定されたパスであると解釈します。
runtime/debug
パッケージ
runtime/debug
パッケージは、Goプログラムの実行時デバッグ情報にアクセスするための機能を提供します。主な機能には以下のようなものがあります。
PrintStack()
: 現在のゴルーチンのスタックトレースを標準エラー出力に表示します。Stack()
: 現在のゴルーチンのスタックトレースをバイトスライスとして返します。FreeOSMemory()
: オペレーティングシステムに未使用のメモリを解放するよう要求します。SetGCPercent()
: ガベージコレクションのトリガーとなるヒープサイズの増加率を設定します。
これらの機能、特にスタックトレースの生成などは、Goのソースコードの行番号やファイル名といった情報に依存することがあります。GOROOT_FINAL
が設定されていると、runtime/debug
が期待するソースコードのパスと実際のパスが異なり、デバッグ情報の取得に失敗する可能性がありました。
ビルドシステムとCI/CD (Continuous Integration/Continuous Deployment)
Goのプロジェクトでは、go build
やgo test
といったコマンドを使用してビルドやテストを行います。大規模なプロジェクトでは、これらのプロセスはJenkins, Travis CI, GitHub ActionsなどのCI/CDシステム上で自動化されています。これらのシステムは「ビルダー」と呼ばれ、コードの変更がプッシュされるたびに自動的にビルドとテストを実行し、問題がないことを確認します。このコミットは、これらの自動化されたビルド環境でのテストの信頼性を高めることを目的としています。
技術的詳細
このコミットは、Goのビルドスクリプトであるsrc/run.bash
(Unix系システム用)とsrc/run.bat
(Windows系システム用)に修正を加えています。
変更の核心は、go test std
コマンドを実行する前にGOROOT_FINAL
環境変数を明示的に解除することです。
-
src/run.bash
: Unixシェルスクリプトでは、環境変数を解除するためにunset
コマンドを使用します。# we must unset GOROOT_FINAL before tests, because runtime/debug requires # correct access to source code, so if we have GOROOT_FINAL in effect, # at least runtime/debug test will fail. unset GOROOT_FINAL
この行は、
go test std
コマンドが実行される直前に挿入されています。これにより、テストプロセスが開始される際にはGOROOT_FINAL
が設定されていない状態となり、runtime/debug
などのパッケージがGoのソースコードを正しく参照できるようになります。 -
src/run.bat
: Windowsバッチスクリプトでは、環境変数を解除するためにset VARNAME=
のように空の値を設定します。:: we must unset GOROOT_FINAL before tests, because runtime/debug requires :: correct access to source code, so if we have GOROOT_FINAL in effect, :: at least runtime/debug test will fail. set GOROOT_FINAL=
同様に、この行も
go test std
コマンドの実行前に挿入されています。
この修正により、GOROOT_FINAL
が設定されている環境(例えば、Goのブートストラップビルド環境や特定のCI/CDパイプライン)でも、runtime/debug
パッケージを含むGoの標準ライブラリのテストが安定して実行されるようになります。これは、Goのビルドシステムの堅牢性を高める上で重要な変更です。
コアとなるコードの変更箇所
src/run.bash
--- a/src/run.bash
+++ b/src/run.bash
@@ -24,6 +24,11 @@ else
echo
fi
+# we must unset GOROOT_FINAL before tests, because runtime/debug requires
+# correct access to source code, so if we have GOROOT_FINAL in effect,
+# at least runtime/debug test will fail.
+unset GOROOT_FINAL
+
echo '# Testing packages.'
time go test std -short -timeout=120s
echo
src/run.bat
--- a/src/run.bat
+++ b/src/run.bat
@@ -25,6 +25,11 @@ if errorlevel 1 goto fail
echo.
:norebuild
+:: we must unset GOROOT_FINAL before tests, because runtime/debug requires
+:: correct access to source code, so if we have GOROOT_FINAL in effect,
+:: at least runtime/debug test will fail.
+set GOROOT_FINAL=
+
echo # Testing packages.
go test std -short -timeout=120s
if errorlevel 1 goto fail
コアとなるコードの解説
上記のコード変更は、Goのテスト実行スクリプトに、GOROOT_FINAL
環境変数をテスト開始前に解除するロジックを追加しています。
-
src/run.bash
(Unix/Linux/macOS):unset GOROOT_FINAL
: このコマンドは、現在のシェルセッションからGOROOT_FINAL
という名前の環境変数を削除します。これにより、その後に実行されるgo test
コマンドや、テスト対象のGoプログラムは、GOROOT_FINAL
が設定されていない状態(つまり、通常のGOROOT
やデフォルトのGoインストールパスを参照する状態)で動作します。- 追加されたコメントは、この変更の理由を明確に説明しています。「
runtime/debug
がソースコードへの正しいアクセスを必要とするため、テストの前にGOROOT_FINAL
を解除しなければならない。もしGOROOT_FINAL
が有効なままだと、少なくともruntime/debug
のテストは失敗するだろう。」
-
src/run.bat
(Windows):set GOROOT_FINAL=
: Windowsのバッチファイルでは、環境変数を解除する一般的な方法は、その変数に空の文字列を割り当てることです。これにより、GOROOT_FINAL
は実質的に未設定の状態になります。- 追加されたコメントは、
run.bash
と同様に、この変更の必要性を説明しています。Windowsのコメントは::
で始まります。
この修正は、Goのビルドシステムが様々な環境で一貫して動作することを保証するために重要です。特に、GoのソースコードからGo自体をビルドするような複雑なシナリオや、CI/CDパイプラインで特定の環境変数が設定されている場合に、テストの信頼性を確保します。
関連リンク
- Go言語の環境変数に関する公式ドキュメント(当時のものとは異なる可能性がありますが、概念は共通です): https://go.dev/doc/code
runtime/debug
パッケージの公式ドキュメント: https://pkg.go.dev/runtime/debug- Goのブートストラップビルドに関する情報(GoのソースコードからGoをビルドするプロセス): https://go.dev/doc/install/source
参考にした情報源リンク
- Go言語の公式ドキュメント (go.dev)
- Go言語のソースコードリポジトリ (github.com/golang/go)
- Goの環境変数に関する一般的な知識
- シェルスクリプトおよびバッチファイルの環境変数操作に関する知識
runtime/debug
パッケージの機能に関する知識- コミットメッセージとコードの差分
- Goのコードレビューシステム (Gerrit) のCLリンク (https://golang.org/cl/5976068) - 現在はGitHubに移行しているため、直接アクセスしても当時の情報が得られない可能性があります。
[インデックス 12831] ファイルの概要
このコミットは、Go言語のビルドシステムにおけるテスト実行前の環境設定に関する重要な修正です。具体的には、Goのテストスイートが実行される前に、GOROOT_FINAL
という環境変数を解除する変更がsrc/run.bash
とsrc/run.bat
の両方のスクリプトに適用されました。この修正の目的は、runtime/debug
パッケージのように、実行時にGoのソースコードへの正しいアクセスを必要とするテストが、GOROOT_FINAL
が設定されている環境でも確実に成功するようにすることです。これにより、Goのビルドシステム、特に自動化されたCI/CD環境(「ビルダー」)の安定性と信頼性が向上しました。
コミット
commit 34ace1043ea17eccc48777144ad6b62d31a00690
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Wed Apr 4 23:14:54 2012 +0800
build: unset GOROOT_FINAL before tests
Fix the builders.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5976068
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/34ace1043ea17eccc48777144ad6b62d31a00690
元コミット内容
build: unset GOROOT_FINAL before tests
Fix the builders.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5976068
変更の背景
このコミットが導入された背景には、Go言語のビルドおよびテストプロセスにおける特定の環境変数の挙動が関係しています。Goのビルドシステムでは、Goのインストールパスを示すGOROOT
という環境変数が中心的な役割を果たします。しかし、GoのソースコードからGo自体をビルドする「ブートストラップビルド」や、特定のデプロイメントシナリオにおいては、最終的なGoのインストール先を示すGOROOT_FINAL
という環境変数が設定されることがありました。
問題は、GOROOT_FINAL
が設定された状態でGoのテスト、特にruntime/debug
パッケージに関連するテストを実行すると、テストが失敗するという事象が発生していたことです。runtime/debug
パッケージは、スタックトレースの生成など、実行時にGoのソースコードのパスやデバッグ情報にアクセスする必要があります。GOROOT_FINAL
が設定されていると、Goツールチェーンはソースコードの場所をGOROOT_FINAL
が指すパスにあると解釈しますが、テスト環境では開発中のソースツリー内の実際のパスを参照する必要があるため、パスの不一致が生じ、runtime/debug
がソースコードを正しく見つけられずにテストが失敗していました。
この問題は、Goの継続的インテグレーション(CI)システム、特にGoプロジェクトの「ビルダー」と呼ばれる自動テスト環境で顕著でした。テストの失敗は、コードの品質保証プロセスを妨げ、開発のボトルネックとなるため、この問題を解決し、ビルダーの安定性を確保することが急務でした。このコミットは、テスト実行前にGOROOT_FINAL
を解除することで、このパスの不一致問題を解消し、テストの信頼性を回復することを目的としています。
前提知識の解説
Go言語の環境変数 (GOROOT
, GOPATH
, GOROOT_FINAL
)
GOROOT
: Goのインストールディレクトリを指す環境変数です。Goのコンパイラ、標準ライブラリ、ツールなどがこのディレクトリに配置されます。Goのツールチェーンは、このGOROOT
を基準に動作します。GOPATH
: Goのワークスペースディレクトリを指す環境変数です。Goのソースコード、パッケージ、バイナリなどがこのディレクトリに配置されます。Go 1.11以降のGo Modulesの導入により、GOPATH
の重要性は以前ほどではなくなりましたが、依然として一部のレガシーなビルドシステムや特定のツールで使用されることがあります。GOROOT_FINAL
: これはGoのビルドプロセスにおいて、最終的にGoがインストールされるパスを示すために使用される環境変数でした。特に、GoのソースコードからGo自体をビルドする際(ブートストラップビルド)や、クロスコンパイルされたGoバイナリが特定の場所にデプロイされることを想定している場合に設定されることがありました。この変数が設定されていると、Goのツールは、実行時に参照するべきGoのルートディレクトリがGOROOT_FINAL
で指定されたパスであると解釈します。 補足: Web検索の結果によると、Go 1.23以降、GOROOT_FINAL
環境変数を設定してもGoツールチェーンには影響がなくなりました。これは、インストールプロセスを簡素化し、再現可能なビルドに貢献するために実装された変更であり、GOROOT_FINAL
が複雑さとバグの原因となっていたため、Goプロジェクトは使用を非推奨にしています。このコミットが作成された2012年時点では、GOROOT_FINAL
はまだGoのビルドシステムにおいて重要な役割を担っていました。
runtime/debug
パッケージ
runtime/debug
パッケージは、Goプログラムの実行時デバッグ情報にアクセスするための機能を提供します。主な機能には以下のようなものがあります。
PrintStack()
: 現在のゴルーチンのスタックトレースを標準エラー出力に表示します。Stack()
: 現在のゴルーチンのスタックトレースをバイトスライスとして返します。FreeOSMemory()
: オペレーティングシステムに未使用のメモリを解放するよう要求します。SetGCPercent()
: ガベージコレクションのトリガーとなるヒープサイズの増加率を設定します。
これらの機能、特にスタックトレースの生成などは、Goのソースコードのファイル名や行番号といった情報に依存することがあります。GOROOT_FINAL
が設定されていると、runtime/debug
が期待するソースコードのパスと実際のパスが異なり、デバッグ情報の取得に失敗する可能性がありました。
ビルドシステムとCI/CD (Continuous Integration/Continuous Deployment)
Goのプロジェクトでは、go build
やgo test
といったコマンドを使用してビルドやテストを行います。大規模なプロジェクトでは、これらのプロセスはJenkins, Travis CI, GitHub ActionsなどのCI/CDシステム上で自動化されています。これらのシステムは「ビルダー」と呼ばれ、コードの変更がプッシュされるたびに自動的にビルドとテストを実行し、問題がないことを確認します。このコミットは、これらの自動化されたビルド環境でのテストの信頼性を高めることを目的としています。
技術的詳細
このコミットは、Goのビルドスクリプトであるsrc/run.bash
(Unix系システム用)とsrc/run.bat
(Windows系システム用)に修正を加えています。これらのスクリプトは、Goの標準ライブラリのテストを実行する際に使用されます。
変更の核心は、go test std
コマンドを実行する前にGOROOT_FINAL
環境変数を明示的に解除することです。
-
src/run.bash
: Unixシェルスクリプトでは、環境変数を解除するためにunset
コマンドを使用します。# we must unset GOROOT_FINAL before tests, because runtime/debug requires # correct access to source code, so if we have GOROOT_FINAL in effect, # at least runtime/debug test will fail. unset GOROOT_FINAL
この行は、
go test std
コマンドが実行される直前に挿入されています。これにより、テストプロセスが開始される際にはGOROOT_FINAL
が設定されていない状態となり、runtime/debug
などのパッケージがGoのソースコードを正しく参照できるようになります。 -
src/run.bat
: Windowsバッチスクリプトでは、環境変数を解除するためにset VARNAME=
のように空の値を設定します。:: we must unset GOROOT_FINAL before tests, because runtime/debug requires :: correct access to source code, so if we have GOROOT_FINAL in effect, :: at least runtime/debug test will fail. set GOROOT_FINAL=
同様に、この行も
go test std
コマンドの実行前に挿入されています。
この修正により、GOROOT_FINAL
が設定されている環境(例えば、Goのブートストラップビルド環境や特定のCI/CDパイプライン)でも、runtime/debug
パッケージを含むGoの標準ライブラリのテストが安定して実行されるようになります。これは、Goのビルドシステムの堅牢性を高める上で重要な変更です。
コアとなるコードの変更箇所
src/run.bash
--- a/src/run.bash
+++ b/src/run.bash
@@ -24,6 +24,11 @@ else
echo
fi
+# we must unset GOROOT_FINAL before tests, because runtime/debug requires
+# correct access to source code, so if we have GOROOT_FINAL in effect,
+# at least runtime/debug test will fail.
+unset GOROOT_FINAL
+
echo '# Testing packages.'
time go test std -short -timeout=120s
echo
src/run.bat
--- a/src/run.bat
+++ b/src/run.bat
@@ -25,6 +25,11 @@ if errorlevel 1 goto fail
echo.
:norebuild
+:: we must unset GOROOT_FINAL before tests, because runtime/debug requires
+:: correct access to source code, so if we have GOROOT_FINAL in effect,
+:: at least runtime/debug test will fail.
+set GOROOT_FINAL=
+
echo # Testing packages.
go test std -short -timeout=120s
if errorlevel 1 goto fail
コアとなるコードの解説
上記のコード変更は、Goのテスト実行スクリプトに、GOROOT_FINAL
環境変数をテスト開始前に解除するロジックを追加しています。
-
src/run.bash
(Unix/Linux/macOS):unset GOROOT_FINAL
: このコマンドは、現在のシェルセッションからGOROOT_FINAL
という名前の環境変数を削除します。これにより、その後に実行されるgo test
コマンドや、テスト対象のGoプログラムは、GOROOT_FINAL
が設定されていない状態(つまり、通常のGOROOT
やデフォルトのGoインストールパスを参照する状態)で動作します。- 追加されたコメントは、この変更の理由を明確に説明しています。「
runtime/debug
がソースコードへの正しいアクセスを必要とするため、テストの前にGOROOT_FINAL
を解除しなければならない。もしGOROOT_FINAL
が有効なままだと、少なくともruntime/debug
のテストは失敗するだろう。」
-
src/run.bat
(Windows):set GOROOT_FINAL=
: Windowsのバッチファイルでは、環境変数を解除する一般的な方法は、その変数に空の文字列を割り当てることです。これにより、GOROOT_FINAL
は実質的に未設定の状態になります。- 追加されたコメントは、
run.bash
と同様に、この変更の必要性を説明しています。Windowsのコメントは::
で始まります。
この修正は、Goのビルドシステムが様々な環境で一貫して動作することを保証するために重要です。特に、GoのソースコードからGo自体をビルドするような複雑なシナリオや、CI/CDパイプラインで特定の環境変数が設定されている場合に、テストの信頼性を確保します。
関連リンク
- Go言語の環境変数に関する公式ドキュメント(当時のものとは異なる可能性がありますが、概念は共通です): https://go.dev/doc/code
runtime/debug
パッケージの公式ドキュメント: https://pkg.go.dev/runtime/debug- Goのブートストラップビルドに関する情報(GoのソースコードからGoをビルドするプロセス): https://go.dev/doc/install/source
参考にした情報源リンク
- Go言語の公式ドキュメント (go.dev)
- Go言語のソースコードリポジトリ (github.com/golang/go)
- コミットメッセージとコードの差分
- Goのコードレビューシステム (Gerrit) のCLリンク (https://golang.org/cl/5976068)
- Web検索結果:
GOROOT_FINAL
の歴史的背景とGo 1.23以降の非推奨化に関する情報