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

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

このコミットは、Go言語のダッシュボードシステムにおけるビルダ(gobuilder)の動作を改善し、Goツリーのビルド後に外部パッケージをgoinstallする機能を追加します。具体的には、misc/dashboard/builderディレクトリ内のexec.gohttp.gomain.gopackage.goの4つのファイルが変更されています。

コミット

commit be587a4d5366ea1d53967dfdbd7539b6168c6af2
Author: Andrew Gerrand <adg@golang.org>
Date:   Thu Dec 8 10:31:06 2011 +1100

    gobuilder: goinstall packages after building go tree

    R=rsc
    CC=golang-dev
    https://golang.org/cl/5450100

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

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

元コミット内容

gobuilder: goinstall packages after building go tree

このコミットは、GoビルダがGo言語のソースツリーをビルドした後、追加のパッケージをgoinstallコマンドでインストールするように変更します。

変更の背景

Go言語のビルドシステムには、継続的インテグレーション(CI)の一部として、様々な環境でGoのソースツリー自体をビルドし、その健全性を確認するgobuilderが存在します。しかし、Goの標準ライブラリだけでなく、外部の重要なパッケージもGoの変更によって影響を受ける可能性があります。

このコミット以前は、gobuilderは主にGoツリー自体のビルドに焦点を当てていました。しかし、Goツリーの変更が外部パッケージに与える影響を早期に検知するためには、Goツリーのビルドが成功した後に、これらの外部パッケージもビルド・インストールしてテストすることが重要になります。

この変更の背景には、Goエコシステム全体の安定性を向上させるという目的があります。Goツリーの変更が外部パッケージのビルドを壊すような事態を未然に防ぐため、gobuilderの検証範囲を拡張する必要がありました。これにより、開発者はGoツリーの変更が外部パッケージに与える影響をより迅速に把握し、問題があれば早期に修正できるようになります。

前提知識の解説

  • Go Builder (gobuilder): Go言語プロジェクトにおける継続的インテグレーション(CI)システムの一部です。様々なオペレーティングシステムやアーキテクチャの組み合わせでGoのソースコードを自動的にビルドし、テストを実行することで、Go言語の安定性と互換性を保証します。ビルド結果はGoダッシュボードに報告されます。
  • Go Dashboard: Go言語プロジェクトの公式ウェブサイトの一部で、gobuilderからのビルド結果を集約し、表示するダッシュボードです。各コミットに対するビルドの成功・失敗、テスト結果などを一目で確認できます。
  • goinstallコマンド: Go 1.0以前に存在したコマンドで、Goパッケージをリモートリポジトリから取得し、ビルドしてインストールするために使用されました。Go 1.0以降はgo getコマンドに置き換えられましたが、このコミットが作成された2011年当時はまだgoinstallが使われていました。goinstallは、指定されたパッケージとその依存関係を再帰的にダウンロードし、$GOROOT/pkgまたは$GOPATH/pkgにコンパイル済みバイナリを配置します。
  • Mercurial (hg): Go言語プロジェクトが初期にバージョン管理システムとして使用していた分散型バージョン管理システムです。Gitと同様に、リポジトリのクローン、コミット、ブランチ、マージなどの操作が可能です。このコミットでは、パッケージの特定のハッシュ(リビジョン)に更新するためにhg updateコマンドが使用されています。
  • GOROOT: Go言語のインストールディレクトリを指す環境変数です。Goの標準ライブラリやツールがここに配置されます。
  • GOPATH: Goのワークスペースディレクトリを指す環境変数です。ユーザーが開発するGoプロジェクトのソースコード、パッケージ、バイナリがここに配置されます。

技術的詳細

このコミットの主要な変更点は、gobuilderがGoツリーのビルドに加えて、特定の外部パッケージのgoinstallを実行するように拡張されたことです。

  1. main.goの変更:

    • Builder.buildHash関数内で、Goツリーのビルドが成功した後(status == 0の場合)に、新しく追加されたb.buildPackages(filepath.Join(workpath, "go"), hash)が呼び出されるようになりました。これにより、Goツリーのビルドが成功した後に外部パッケージのビルドプロセスが開始されます。
    • 既存のb.buildPackages関数はb.buildExternalPackagesにリネームされ、Goツリーのビルドとは別の、リリースビルドに関連する処理を行うようになりました。これは、新しいbuildPackages関数との名前の衝突を避けるためです。
    • recordResult関数の呼び出しが変更され、パッケージパス、Goハッシュ、成功/失敗ステータスなどの詳細情報がダッシュボードに送信されるようになりました。
  2. 新しいbuildPackages関数の追加 (main.go内):

    • この関数は、dashboardPackages()(ダッシュボードで監視対象となっている外部パッケージのリストを返す関数)からパッケージのリストを取得します。
    • 各パッケージについて、b.todo(pkg, goHash)を呼び出して、そのパッケージの最新のビルド対象ハッシュを取得します。これにより、ダッシュボードが指定する特定のバージョンのパッケージをビルドできます。
    • 取得したハッシュに基づいて、b.goinstall(goRoot, pkg, hash)を呼び出し、実際にパッケージの取得、更新、ビルドを行います。
    • ビルド結果(成功/失敗、ログ)はb.recordResultを通じてダッシュボードに報告されます。
  3. 新しいgoinstall関数の追加 (main.go内):

    • この関数は、指定されたGOROOT、パッケージパス、ハッシュを使用して、外部パッケージをgoinstallするロジックをカプセル化します。
    • まず、goinstallコマンドを-dashboard=false -install=falseオプション付きで実行し、パッケージとその依存関係をフェッチします。-install=falseは、この段階ではまだビルドを行わず、ソースコードの取得のみを行うことを意味します。
    • 次に、filepath.Join(goRoot, "src/pkg", pkg)で計算されたパッケージのソースディレクトリに移動し、hg update hashを実行して、指定されたハッシュ(リビジョン)にソースコードを更新します。これにより、特定の時点のパッケージコードをビルドできます。
    • 最後に、再度goinstallコマンドを-dashboard=falseオプション付きで実行し、パッケージをビルドします。
  4. http.goの変更:

    • todo関数とrecordResult関数のシグネチャが変更され、パッケージパス(pkg)とGoツリーのハッシュ(goHash)を引数として受け取るようになりました。これにより、ダッシュボードとの通信において、どのGoツリーのバージョンでどのパッケージがビルドされたか、といったより詳細な情報をやり取りできるようになります。
    • url.ValuespackagePathgoHashが追加され、ダッシュボードへのリクエストに含まれるようになりました。
  5. exec.goの変更:

    • runLog関数で、エラーが発生した場合の戻り値がreturn b.String(), 0, errに変更されました。これは、エラーが発生した際にnilではなく実際のエラーを返すように修正されたもので、より正確なエラーハンドリングを可能にします。

これらの変更により、gobuilderはGoツリーのビルドだけでなく、そのGoツリーのバージョンで外部パッケージが正しくビルドできるかどうかも検証するようになり、Go言語全体の品質保証プロセスが強化されました。

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

このコミットのコアとなる変更は、主にmisc/dashboard/builder/main.goファイルに集中しています。

  1. main.goにおけるbuildHash関数の変更:

    --- a/misc/dashboard/builder/main.go
    +++ b/misc/dashboard/builder/main.go
    @@ -305,19 +304,22 @@ func (b *Builder) buildHash(hash string) (err error) {
     	if status != 0 {
     		// record failure
    -		return b.recordResult(buildLog, hash)
    +		return b.recordResult(false, "", hash, "", buildLog)
     	}
    
     	// record success
    -	if err = b.recordResult("", hash); err != nil {
    +	if err = b.recordResult(true, "", hash, "", ""); err != nil {
     		return fmt.Errorf("recordResult: %s", err)
     	}
    
    +	// build goinstallable packages
    +	b.buildPackages(filepath.Join(workpath, "go"), hash)
    +
     	// finish here if codeUsername and codePassword aren't set
     	if b.codeUsername == "" || b.codePassword == "" || !*buildRelease {
     		return
     	}
    

    Goツリーのビルドが成功した後(status != 0のブロックを抜けた後)に、b.buildPackagesが呼び出されている点が重要です。

  2. main.goにおける新しいbuildPackages関数の追加:

    func (b *Builder) buildPackages(goRoot, goHash string) {
    	for _, pkg := range dashboardPackages() {
    		// get the latest todo for this package
    		hash, err := b.todo(pkg, goHash)
    		if err != nil {
    			log.Printf("buildPackages %s: %v", pkg, err)
    			continue
    		}
    		if hash == "" {
    			continue
    		}
    
    		// goinstall the package
    		if *verbose {
    			log.Printf("buildPackages %s: installing %q", pkg, hash)
    		}
    		buildLog, err := b.goinstall(goRoot, pkg, hash)
    		ok := buildLog == ""
    		if err != nil {
    			ok = false
    			log.Printf("buildPackages %s: %v", pkg, err)
    		}
    
    		// record the result
    		err = b.recordResult(ok, pkg, hash, goHash, buildLog)
    		if err != nil {
    			log.Printf("buildPackages %s: %v", pkg, err)
    		}
    	}
    }
    

    この関数が外部パッケージのビルドと結果の記録をオーケストレーションしています。

  3. main.goにおける新しいgoinstall関数の追加:

    func (b *Builder) goinstall(goRoot, pkg, hash string) (string, error) {
    	bin := filepath.Join(goRoot, "bin/goinstall")
    	env := append(b.envv(), "GOROOT="+goRoot)
    
    	// fetch package and dependencies
    	log, status, err := runLog(env, "", goRoot, bin,
    		"-dashboard=false", "-install=false", pkg)
    	if err != nil || status != 0 {
    		return log, err
    	}
    
    	// hg update to the specified hash
    	pkgPath := filepath.Join(goRoot, "src/pkg", pkg)
    	if err := run(nil, pkgPath, "hg", "update", hash); err != nil {
    		return "", err
    	}
    
    	// build the package
    	log, _, err = runLog(env, "", goRoot, bin, "-dashboard=false", pkg)
    	return log, err
    }
    

    この関数がgoinstallコマンドの実行とMercurialによるバージョン管理を直接扱っています。

コアとなるコードの解説

  • buildHash関数内のb.buildPackages(...)呼び出し: Goツリー自体のビルドが成功した直後に、この新しい呼び出しが挿入されています。これは、Goツリーの変更が外部パッケージに与える影響を検証するための重要なフックとなります。filepath.Join(workpath, "go")は、ビルドされたGoツリーのルートディレクトリを指し、hashはビルドされたGoツリーのコミットハッシュです。これらの情報が、外部パッケージのビルド時にGOROOTの設定やダッシュボードへの結果報告に利用されます。

  • buildPackages関数: この関数は、Goダッシュボードが監視している外部パッケージ(dashboardPackages()で取得)を一つずつ処理します。

    1. b.todo(pkg, goHash): ダッシュボードに問い合わせて、現在処理中のGoツリーのバージョン(goHash)に対して、この特定の外部パッケージ(pkg)のどのリビジョン(hash)をビルドすべきかを取得します。これにより、ダッシュボードがビルドの優先順位や特定のパッケージバージョンを指定できるようになります。
    2. b.goinstall(goRoot, pkg, hash): 取得したパッケージのリビジョン情報を使って、実際にパッケージのgoinstallを実行します。この関数が、パッケージのソースコードの取得、指定されたリビジョンへの更新、そしてビルドという一連のプロセスを担います。
    3. b.recordResult(ok, pkg, hash, goHash, buildLog): goinstallの結果(成功/失敗、ビルドログ)をダッシュボードに報告します。これにより、ダッシュボードはGoツリーのビルド結果だけでなく、そのGoツリーで外部パッケージが正しくビルドできたかどうかの情報も保持し、表示できるようになります。
  • goinstall関数: この関数は、goinstallコマンドとMercurialコマンドを組み合わせて、外部パッケージのビルドプロセスを自動化します。

    1. パッケージのフェッチ: 最初のrunLog呼び出しで、goinstall -dashboard=false -install=false <pkg>を実行します。これにより、パッケージのソースコードとその依存関係がダウンロードされますが、まだコンパイルは行われません。-install=falseが重要なポイントで、これによりソースコードの取得のみが行われます。
    2. 指定リビジョンへの更新: hg update hashコマンドを実行することで、ダウンロードしたパッケージのソースコードを、ダッシュボードが指定した特定のリビジョン(hash)に更新します。これは、Goツリーの特定のバージョンと互換性のあるパッケージのバージョンを正確にテストするために不可欠です。
    3. パッケージのビルド: 2回目のrunLog呼び出しで、goinstall -dashboard=false <pkg>を実行します。これにより、指定されたリビジョンに更新されたパッケージが実際にビルドされ、インストールされます。

これらの変更により、gobuilderはGoツリーのビルドと外部パッケージのビルドを連携させ、Go言語の変更がエコシステム全体に与える影響をより包括的に検証できるようになりました。

関連リンク

  • Go CL 5450100: https://golang.org/cl/5450100 (このコミットに対応するGoのコードレビューシステム上のチェンジリスト)

参考にした情報源リンク

このコミットは、Go言語のダッシュボードシステムにおけるビルダ(gobuilder)の動作を改善し、Goツリーのビルド後に外部パッケージをgoinstallする機能を追加します。具体的には、misc/dashboard/builderディレクトリ内のexec.gohttp.gomain.gopackage.goの4つのファイルが変更されています。

コミット

commit be587a4d5366ea1d53967dfdbd7539b6168c6af2
Author: Andrew Gerrand <adg@golang.org>
Date:   Thu Dec 8 10:31:06 2011 +1100

    gobuilder: goinstall packages after building go tree

    R=rsc
    CC=golang-dev
    https://golang.org/cl/5450100

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

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

元コミット内容

gobuilder: goinstall packages after building go tree

このコミットは、GoビルダがGo言語のソースツリーをビルドした後、追加のパッケージをgoinstallコマンドでインストールするように変更します。

変更の背景

Go言語のビルドシステムには、継続的インテグレーション(CI)の一部として、様々な環境でGoのソースツリー自体をビルドし、その健全性を確認するgobuilderが存在します。しかし、Goの標準ライブラリだけでなく、外部の重要なパッケージもGoの変更によって影響を受ける可能性があります。

このコミット以前は、gobuilderは主にGoツリー自体のビルドに焦点を当てていました。しかし、Goツリーの変更が外部パッケージに与える影響を早期に検知するためには、Goツリーのビルドが成功した後に、これらの外部パッケージもビルド・インストールしてテストすることが重要になります。

この変更の背景には、Goエコシステム全体の安定性を向上させるという目的があります。Goツリーの変更が外部パッケージのビルドを壊すような事態を未然に防ぐため、gobuilderの検証範囲を拡張する必要がありました。これにより、開発者はGoツリーの変更が外部パッケージに与える影響をより迅速に把握し、問題があれば早期に修正できるようになります。

前提知識の解説

  • Go Builder (gobuilder): Go言語プロジェクトにおける継続的インテグレーション(CI)システムの一部です。様々なオペレーティングシステムやアーキテクチャの組み合わせでGoのソースコードを自動的にビルドし、テストを実行することで、Go言語の安定性と互換性を保証します。ビルド結果はGoダッシュボードに報告されます。
  • Go Dashboard: Go言語プロジェクトの公式ウェブサイトの一部で、gobuilderからのビルド結果を集約し、表示するダッシュボードです。各コミットに対するビルドの成功・失敗、テスト結果などを一目で確認できます。
  • goinstallコマンド: Go 1.0以前に存在したコマンドで、Goパッケージをリモートリポジトリから取得し、ビルドしてインストールするために使用されました。Go 1.0以降はgo getコマンドに置き換えられましたが、このコミットが作成された2011年当時はまだgoinstallが使われていました。goinstallは、指定されたパッケージとその依存関係を再帰的にダウンロードし、$GOROOT/pkgまたは$GOPATH/pkgにコンパイル済みバイナリを配置します。
  • Mercurial (hg): Go言語プロジェクトが初期にバージョン管理システムとして使用していた分散型バージョン管理システムです。Gitと同様に、リポジトリのクローン、コミット、ブランチ、マージなどの操作が可能です。このコミットでは、パッケージの特定のハッシュ(リビジョン)に更新するためにhg updateコマンドが使用されています。
  • GOROOT: Go言語のインストールディレクトリを指す環境変数です。Goの標準ライブラリやツールがここに配置されます。
  • GOPATH: Goのワークスペースディレクトリを指す環境変数です。ユーザーが開発するGoプロジェクトのソースコード、パッケージ、バイナリがここに配置されます。

技術的詳細

このコミットの主要な変更点は、gobuilderがGoツリーのビルドに加えて、特定の外部パッケージのgoinstallを実行するように拡張されたことです。

  1. main.goの変更:

    • Builder.buildHash関数内で、Goツリーのビルドが成功した後(status == 0の場合)に、新しく追加されたb.buildPackages(filepath.Join(workpath, "go"), hash)が呼び出されるようになりました。これにより、Goツリーのビルドが成功した後に外部パッケージのビルドプロセスが開始されます。
    • 既存のb.buildPackages関数はb.buildExternalPackagesにリネームされ、Goツリーのビルドとは別の、リリースビルドに関連する処理を行うようになりました。これは、新しいbuildPackages関数との名前の衝突を避けるためです。
    • recordResult関数の呼び出しが変更され、パッケージパス、Goハッシュ、成功/失敗ステータスなどの詳細情報がダッシュボードに送信されるようになりました。
  2. 新しいbuildPackages関数の追加 (main.go内):

    • この関数は、dashboardPackages()(ダッシュボードで監視対象となっている外部パッケージのリストを返す関数)からパッケージのリストを取得します。
    • 各パッケージについて、b.todo(pkg, goHash)を呼び出して、そのパッケージの最新のビルド対象ハッシュを取得します。これにより、ダッシュボードが指定する特定のバージョンのパッケージをビルドできます。
    • 取得したハッシュに基づいて、b.goinstall(goRoot, pkg, hash)を呼び出し、実際にパッケージの取得、更新、ビルドを行います。
    • ビルド結果(成功/失敗、ログ)はb.recordResultを通じてダッシュボードに報告されます。
  3. 新しいgoinstall関数の追加 (main.go内):

    • この関数は、指定されたGOROOT、パッケージパス、ハッシュを使用して、外部パッケージをgoinstallするロジックをカプセル化します。
    • まず、goinstallコマンドを-dashboard=false -install=falseオプション付きで実行し、パッケージとその依存関係をフェッチします。-install=falseは、この段階ではまだビルドを行わず、ソースコードの取得のみを行うことを意味します。
    • 次に、filepath.Join(goRoot, "src/pkg", pkg)で計算されたパッケージのソースディレクトリに移動し、hg update hashを実行して、指定されたハッシュ(リビジョン)にソースコードを更新します。これにより、特定の時点のパッケージコードをビルドできます。
    • 最後に、再度goinstallコマンドを-dashboard=falseオプション付きで実行し、パッケージをビルドします。
  4. http.goの変更:

    • todo関数とrecordResult関数のシグネチャが変更され、パッケージパス(pkg)とGoツリーのハッシュ(goHash)を引数として受け取るようになりました。これにより、ダッシュボードとの通信において、どのGoツリーのバージョンでどのパッケージがビルドされたか、といったより詳細な情報をやり取りできるようになります。
    • url.ValuespackagePathgoHashが追加され、ダッシュボードへのリクエストに含まれるようになりました。
  5. exec.goの変更:

    • runLog関数で、エラーが発生した場合の戻り値がreturn b.String(), 0, errに変更されました。これは、エラーが発生した際にnilではなく実際のエラーを返すように修正されたもので、より正確なエラーハンドリングを可能にします。

これらの変更により、gobuilderはGoツリーのビルドだけでなく、そのGoツリーのバージョンで外部パッケージが正しくビルドできるかどうかも検証するようになり、Go言語全体の品質保証プロセスが強化されました。

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

このコミットのコアとなる変更は、主にmisc/dashboard/builder/main.goファイルに集中しています。

  1. main.goにおけるbuildHash関数の変更:

    --- a/misc/dashboard/builder/main.go
    +++ b/misc/dashboard/builder/main.go
    @@ -305,19 +304,22 @@ func (b *Builder) buildHash(hash string) (err error) {
     	if status != 0 {
     		// record failure
    -		return b.recordResult(buildLog, hash)
    +		return b.recordResult(false, "", hash, "", buildLog)
     	}
    
     	// record success
    -	if err = b.recordResult("", hash); err != nil {
    +	if err = b.recordResult(true, "", hash, "", ""); err != nil {
     		return fmt.Errorf("recordResult: %s", err)
     	}
    
    +	// build goinstallable packages
    +	b.buildPackages(filepath.Join(workpath, "go"), hash)
    +
     	// finish here if codeUsername and codePassword aren't set
     	if b.codeUsername == "" || b.codePassword == "" || !*buildRelease {
     		return
     	}
    

    Goツリーのビルドが成功した後(status != 0のブロックを抜けた後)に、b.buildPackagesが呼び出されている点が重要です。

  2. main.goにおける新しいbuildPackages関数の追加:

    func (b *Builder) buildPackages(goRoot, goHash string) {
    	for _, pkg := range dashboardPackages() {
    		// get the latest todo for this package
    		hash, err := b.todo(pkg, goHash)
    		if err != nil {
    			log.Printf("buildPackages %s: %v", pkg, err)
    			continue
    		}
    		if hash == "" {
    			continue
    		}
    
    		// goinstall the package
    		if *verbose {
    			log.Printf("buildPackages %s: installing %q", pkg, hash)
    		}
    		buildLog, err := b.goinstall(goRoot, pkg, hash)
    		ok := buildLog == ""
    		if err != nil {
    			ok = false
    			log.Printf("buildPackages %s: %v", pkg, err)
    		}
    
    		// record the result
    		err = b.recordResult(ok, pkg, hash, goHash, buildLog)
    		if err != nil {
    			log.Printf("buildPackages %s: %v", pkg, err)
    		}
    	}
    }
    

    この関数が外部パッケージのビルドと結果の記録をオーケストレーションしています。

  3. main.goにおける新しいgoinstall関数の追加:

    func (b *Builder) goinstall(goRoot, pkg, hash string) (string, error) {
    	bin := filepath.Join(goRoot, "bin/goinstall")
    	env := append(b.envv(), "GOROOT="+goRoot)
    
    	// fetch package and dependencies
    	log, status, err := runLog(env, "", goRoot, bin,
    		"-dashboard=false", "-install=false", pkg)
    	if err != nil || status != 0 {
    		return log, err
    	}
    
    	// hg update to the specified hash
    	pkgPath := filepath.Join(goRoot, "src/pkg", pkg)
    	if err := run(nil, pkgPath, "hg", "update", hash); err != nil {
    		return "", err
    	}
    
    	// build the package
    	log, _, err = runLog(env, "", goRoot, bin, "-dashboard=false", pkg)
    	return log, err
    }
    

    この関数がgoinstallコマンドの実行とMercurialによるバージョン管理を直接扱っています。

コアとなるコードの解説

  • buildHash関数内のb.buildPackages(...)呼び出し: Goツリー自体のビルドが成功した直後に、この新しい呼び出しが挿入されています。これは、Goツリーの変更が外部パッケージに与える影響を検証するための重要なフックとなります。filepath.Join(workpath, "go")は、ビルドされたGoツリーのルートディレクトリを指し、hashはビルドされたGoツリーのコミットハッシュです。これらの情報が、外部パッケージのビルド時にGOROOTの設定やダッシュボードへの結果報告に利用されます。

  • buildPackages関数: この関数は、Goダッシュボードが監視している外部パッケージ(dashboardPackages()で取得)を一つずつ処理します。

    1. b.todo(pkg, goHash): ダッシュボードに問い合わせて、現在処理中のGoツリーのバージョン(goHash)に対して、この特定の外部パッケージ(pkg)のどのリビジョン(hash)をビルドすべきかを取得します。これにより、ダッシュボードがビルドの優先順位や特定のパッケージバージョンを指定できるようになります。
    2. b.goinstall(goRoot, pkg, hash): 取得したパッケージのリビジョン情報を使って、実際にパッケージのgoinstallを実行します。この関数が、パッケージのソースコードの取得、指定されたリビジョンへの更新、そしてビルドという一連のプロセスを担います。
    3. b.recordResult(ok, pkg, hash, goHash, buildLog): goinstallの結果(成功/失敗、ビルドログ)をダッシュボードに報告します。これにより、ダッシュボードはGoツリーのビルド結果だけでなく、そのGoツリーで外部パッケージが正しくビルドできたかどうかの情報も保持し、表示できるようになります。
  • goinstall関数: この関数は、goinstallコマンドとMercurialコマンドを組み合わせて、外部パッケージのビルドプロセスを自動化します。

    1. パッケージのフェッチ: 最初のrunLog呼び出しで、goinstall -dashboard=false -install=false <pkg>を実行します。これにより、パッケージのソースコードとその依存関係がダウンロードされますが、まだコンパイルは行われません。-install=falseが重要なポイントで、これによりソースコードの取得のみが行われます。
    2. 指定リビジョンへの更新: hg update hashコマンドを実行することで、ダウンロードしたパッケージのソースコードを、ダッシュボードが指定した特定のリビジョン(hash)に更新します。これは、Goツリーの特定のバージョンと互換性のあるパッケージのバージョンを正確にテストするために不可欠です。
    3. パッケージのビルド: 2回目のrunLog呼び出しで、goinstall -dashboard=false <pkg>を実行します。これにより、指定されたリビジョンに更新されたパッケージが実際にビルドされ、インストールされます。

これらの変更により、gobuilderはGoツリーのビルドと外部パッケージのビルドを連携させ、Go言語の変更がエコシステム全体に与える影響をより包括的に検証できるようになりました。

関連リンク

  • Go CL 5450100: https://golang.org/cl/5450100 (このコミットに対応するGoのコードレビューシステム上のチェンジリスト)

参考にした情報源リンク