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

[インデックス 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 buildgo 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言語の公式ドキュメント (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.bashsrc/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 buildgo 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言語の公式ドキュメント (go.dev)
  • Go言語のソースコードリポジトリ (github.com/golang/go)
  • コミットメッセージとコードの差分
  • Goのコードレビューシステム (Gerrit) のCLリンク (https://golang.org/cl/5976068)
  • Web検索結果: GOROOT_FINALの歴史的背景とGo 1.23以降の非推奨化に関する情報