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

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

このコミットは、Go言語のダッシュボードシステムにおいて、ビルドが失敗した状態を迅速に記録するための新しい機能「gobuilder -fail モード」を追加するものです。これは、特定のビルド環境(例: Windows)でビルドプロセスがハングアップした場合に、手動でビルドを「失敗」としてマークする手間と時間を削減することを目的としています。

コミット

commit ee3e24f2d7da60d28c1f6321fa6faddff9b26eec
Author: Russ Cox <rsc@golang.org>
Date:   Thu Feb 9 23:46:48 2012 -0500

    dashboard: add gobuilder -fail mode
    
    This is for filling a column with "fail", like I just did for
    Windows, when the builder would get stuck running that
    build.  (We have safeguards against the tests getting stuck
    but this was the bootstrap build getting stuck.)
    
    I usually use -cmd=/bin/false, but this avoids the Mercurial
    checkouts, which means it runs instantly instead of requiring
    ~1 minute per "fail".
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/5649049

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

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

元コミット内容

Go言語のダッシュボードシステムに、gobuilderの新しいモードとして -fail オプションを追加します。このモードは、ビルドがハングアップするなどして正常に完了しない場合に、そのビルドを「失敗」として迅速にマークするために使用されます。これにより、ビルドが実際に実行されるのを待つことなく、ダッシュボードに失敗ステータスを反映させることができます。特に、Mercurialリポジトリのチェックアウトに時間がかかる環境(例: Windows)で、ビルドがスタックした場合に有効です。

変更の背景

この変更の背景には、Go言語の継続的インテグレーション(CI)システムにおける特定の課題がありました。コミットメッセージによると、Windows環境でのビルドが「スタック」する(ハングアップする、応答しなくなる)問題が発生していました。通常のテストがスタックするのを防ぐためのセーフガードは存在していましたが、この問題は「ブートストラップビルド」がスタックすることに起因していました。

このような状況では、ビルドが完了するのを待つか、手動で介入してビルドを停止し、失敗としてマークする必要がありました。しかし、これには時間がかかり、特にMercurialリポジトリのチェックアウトが伴う場合、1回の「失敗」を記録するのに約1分を要していました。

以前は、gobuilder -cmd=/bin/false のようなコマンドを使用して、ビルドを即座に失敗させる方法が使われていました。しかし、この方法でもMercurialのチェックアウトプロセスは実行されるため、完全に時間を節約できるわけではありませんでした。

そこで、ビルドが実際に実行されることなく、即座に「失敗」として記録できる専用の -fail モードが提案されました。これにより、ビルドがスタックした場合でも、ダッシュボードのステータスを迅速に更新し、問題のあるビルド環境を特定・対処するまでの時間を短縮することが可能になります。

前提知識の解説

このコミットを理解するためには、以下の概念について知っておく必要があります。

  • Go言語のダッシュボード (Go Dashboard): Go言語プロジェクトでは、多数のプラットフォームやアーキテクチャでのビルドとテストの状況を監視するために、中央集権的なダッシュボードシステムが運用されています。これは、継続的インテグレーション(CI)システムの一部であり、各コミットが様々な環境で正常に動作するかどうかを可視化します。
  • gobuilder: Go言語のダッシュボードシステムの一部として機能する、ビルドエージェントまたはビルドクライアントのプログラムです。gobuilder は、Goリポジトリの最新のコミットを取得し、指定された環境でビルドとテストを実行し、その結果をダッシュボードに報告する役割を担っています。
  • 継続的インテグレーション (CI): ソフトウェア開発手法の一つで、開発者がコードの変更を頻繁に共有リポジトリに統合(マージ)し、そのたびに自動的にビルドとテストを実行することで、早期に問題を検出することを目的とします。Go言語のダッシュボードと gobuilder は、このCIプロセスを支える重要なコンポーネントです。
  • ビルドシステム: ソースコードをコンパイルし、実行可能なプログラムやライブラリを生成するプロセスを自動化するツールや環境の総称です。gobuilder は、このビルドシステムの一部として機能します。
  • Mercurial (Hg): Gitと同様の分散型バージョン管理システムです。Go言語プロジェクトは、初期にはMercurialを使用していましたが、後にGitに移行しました。このコミットが作成された2012年時点では、まだMercurialが使用されており、そのチェックアウトプロセスがビルド時間やスタックの問題に影響を与えていました。
  • ブートストラップビルド: ソフトウェア開発において、より複雑なシステムを構築するために必要な、基本的なコンポーネントやツールを最初にビルドするプロセスを指します。Go言語の場合、Goコンパイラ自体をビルドするプロセスなどがこれに該当する場合があります。

技術的詳細

このコミットは、misc/dashboard/builder/main.go ファイルに新しいコマンドラインフラグ -fail と、それに対応するロジックを追加することで、gobuilder の機能を拡張しています。

  1. -fail フラグの追加: var failAll = flag.Bool("fail", false, "fail all builds") この行により、gobuilder コマンドに -fail というブール型のフラグが追加されます。このフラグが true に設定されると、gobuilder は通常のビルドプロセスを実行せず、代わりに「失敗モード」に入ります。

  2. main 関数での -fail モードの分岐: if *failAll { failMode(builders); return } main 関数内で、failAll フラグが true の場合、通常のビルド設定や環境準備の前に failMode 関数が呼び出され、その後プログラムが終了します。これにより、ビルド環境のセットアップやMercurialのチェックアウトといった時間のかかる前処理をスキップし、即座に失敗を記録することが可能になります。

  3. failMode 関数の実装: func failMode(builders []*Builder) この関数は、gobuilder が「失敗モード」で動作する際の主要なロジックを含んでいます。

    • 無限ループ for {} を使用して、新しいコミットが検出されるたびに失敗を記録し続けます。
    • Builder オブジェクト(異なるビルド構成に対応)に対して b.failBuild() を呼び出します。
    • !built (何も失敗するものがなかった場合) にループを抜けることで、不要な処理を避けます。
  4. failBuild メソッドの実装: func (b *Builder) failBuild() bool このメソッドは、個々のビルド構成(Builder)に対して失敗を記録する具体的な処理を行います。

    • b.todo("build-go-commit", "", "") を呼び出して、新しいコミットハッシュがあるかどうかを確認します。これは、ダッシュボードシステムから次にビルドすべきコミット情報を取得するメカニズムです。
    • 新しいコミットハッシュが取得できた場合(hash != "")、そのハッシュとビルダ名をログに出力します。
    • b.recordResult(false, "", hash, "", "auto-fail mode run by " + os.Getenv("USER"), 0) を呼び出して、ビルド結果をダッシュボードに記録します。ここで false はビルドが失敗したことを示し、メッセージには「auto-fail mode run by [ユーザー名]」が含まれます。
    • ビルドが「試行された」(つまり、新しいコミットが検出され、失敗が記録された)場合は true を返します。

この変更により、管理者は特定のビルド環境が問題を起こしている際に、手動で gobuilder -fail コマンドを実行するだけで、その環境でのビルドを即座に失敗としてマークし、ダッシュボードのステータスを最新の状態に保つことができるようになります。これにより、問題の診断と解決までの時間が短縮されます。

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

変更は misc/dashboard/builder/main.go ファイルに集中しています。

--- a/misc/dashboard/builder/main.go
+++ b/misc/dashboard/builder/main.go
@@ -54,6 +54,7 @@ var (
 	buildRelease  = flag.Bool("release", false, "Build and upload binary release archives")
 	buildRevision = flag.String("rev", "", "Build specified revision and exit")
 	buildCmd      = flag.String("cmd", filepath.Join(".", allCmd), "Build command (specify relative to go/src/)")
+	failAll = flag.Bool("fail", false, "fail all builds")
 	external      = flag.Bool("external", false, "Build external packages")
 	parallel      = flag.Bool("parallel", false, "Build multiple targets in parallel")
 	verbose       = flag.Bool("v", false, "verbose")
@@ -87,6 +88,11 @@ func main() {
 		}
 		builders[i] = b
 	}\n+\t\n+\tif *failAll {\n+\t\tfailMode(builders)\n+\t\treturn\n+\t}\n \n 	// set up work environment
 	if err := os.RemoveAll(*buildroot); err != nil {
@@ -161,6 +167,21 @@ func main() {
 	}
 }\n \n+// go continuous fail mode
+// check for new commits and FAIL them
+func failMode(builders []*Builder) {
+\tfor {\n+\t\tbuilt := false\n+\t\tfor _, b := range builders {\n+\t\t\tbuilt = b.failBuild() || built
+\t\t}\n+\t\t// stop if there was nothing to fail
+\t\tif !built {\n+\t\t\tbreak
+\t\t}\n+\t}\n+}\n+\n func NewBuilder(builder string) (*Builder, error) {
 \tb := &Builder{name: builder}\n \n@@ -350,6 +371,27 @@ func (b *Builder) buildHash(hash string) error {
 	return nil
 }\n \n+// failBuild checks for a new commit for this builder
+// and fails it if one is found. 
+// It returns true if a build was "attempted".
+func (b *Builder) failBuild() bool {
+\thash, err := b.todo("build-go-commit", "", "")
+\tif err != nil {
+\t\tlog.Println(err)
+\t\treturn false
+\t}\n+\tif hash == "" {\n+\t\treturn false
+\t}\n+\t\n+\tlog.Printf("fail %s %s\\n", b.name, hash)\n+\n+\tif err := b.recordResult(false, "", hash, "", "auto-fail mode run by " + os.Getenv("USER"), 0); err != nil {
+\t\tlog.Print(err)
+\t}\n+\treturn true
+}\n+\n func (b *Builder) buildSubrepos(goRoot, goHash string) {
 \tfor _, pkg := range dashboardPackages("subrepo") {
 \t\t// get the latest todo for this package

コアとなるコードの解説

  1. var failAll = flag.Bool("fail", false, "fail all builds"):

    • この行は、Goの flag パッケージを使用して、コマンドライン引数 -fail を定義しています。
    • flag.Bool は、ブール型のフラグを作成し、デフォルト値を false に設定します。
    • "fail all builds" は、このフラグの簡単な説明です。
    • これにより、gobuilder -fail のようにコマンドを実行できるようになります。
  2. if *failAll { failMode(builders); return }:

    • main 関数内で、コマンドラインで -fail フラグが指定されたかどうか(*failAlltrue かどうか)をチェックします。
    • もし true であれば、通常のビルド処理をスキップし、新しく定義された failMode 関数を呼び出します。
    • return ステートメントにより、main 関数の残りの部分(実際のビルド環境のセットアップやビルド実行ロジック)は実行されずにプログラムが終了します。
  3. func failMode(builders []*Builder):

    • この関数は、-fail モードが有効になったときに実行されるメインのロジックをカプセル化しています。
    • for {} ループは、新しいコミットがダッシュボードから提供されなくなるまで、継続的に失敗を記録しようとします。
    • built := false は、今回のイテレーションで何らかのビルドが「試行された」(つまり、失敗が記録された)かどうかを追跡するためのフラグです。
    • for _, b := range builders ループは、設定されている各ビルダ(異なるプラットフォームや構成に対応)に対して処理を行います。
    • built = b.failBuild() || built は、各ビルダの failBuild メソッドを呼び出し、その結果(ビルドが試行されたかどうか)を built フラグに反映させます。
    • if !built { break } は、もしどのビルダも新しいコミットを検出して失敗を記録しなかった場合、ループを終了します。これは、処理すべきコミットがもうないことを意味します。
  4. func (b *Builder) failBuild() bool:

    • このメソッドは、特定の Builder インスタンス(特定のビルド構成)に対して、新しいコミットを検出して失敗を記録する責任を負います。
    • hash, err := b.todo("build-go-commit", "", "") は、ダッシュボードシステムから次に処理すべきコミットのハッシュを取得しようとします。b.todo は、ビルダがダッシュボードと通信してタスクを取得するための内部メソッドです。
    • エラーが発生した場合や、処理すべき新しいコミットがない場合(hash == "")、このメソッドは false を返します。
    • log.Printf("fail %s %s\\n", b.name, hash) は、どのビルダがどのコミットを失敗として記録したかをログに出力します。
    • if err := b.recordResult(false, "", hash, "", "auto-fail mode run by " + os.Getenv("USER"), 0); err != nil { ... } は、最も重要な部分です。
      • b.recordResult は、ビルド結果をダッシュボードに送信するためのメソッドです。
      • 最初の引数 false は、ビルドが失敗したことを明示的に示します。
      • hash は、失敗として記録されるコミットのハッシュです。
      • "auto-fail mode run by " + os.Getenv("USER") は、この失敗が自動失敗モードによって記録されたこと、およびそれを実行したユーザー(環境変数 USER から取得)を示すメッセージです。これにより、ダッシュボード上でこの失敗が通常のビルド失敗とは異なる、管理上の操作によるものであることが明確になります。
    • 最後に true を返すことで、このビルダが新しいコミットを検出して失敗を記録する「試行」を行ったことを示します。

これらの変更により、gobuilder は、実際のビルドプロセスを実行することなく、ダッシュボードに「失敗」ステータスを迅速に反映させるための効率的なメカニズムを獲得しました。

関連リンク

  • Go言語の継続的インテグレーションに関する公式ドキュメントやブログ記事(当時のものがあれば)
  • Go言語のダッシュボードのソースコードリポジトリ(misc/dashboard ディレクトリ)
  • このコミットが参照しているGoの変更リスト (CL): https://golang.org/cl/5649049

参考にした情報源リンク

  • コミットメッセージの内容
  • Go言語のCI/CDシステムに関する一般的な知識
  • Mercurialバージョン管理システムに関する一般的な知識
  • Go言語の flag パッケージのドキュメント (Go標準ライブラリ)
  • Go言語の os パッケージのドキュメント (Go標準ライブラリ)
  • Go言語の log パッケージのドキュメント (Go標準ライブラリ)
  • (必要に応じて)Google検索: "Go dashboard", "gobuilder", "Go continuous integration" など# [インデックス 11772] ファイルの概要

このコミットは、Go言語のダッシュボードシステムにおいて、ビルドが失敗した状態を迅速に記録するための新しい機能「gobuilder -fail モード」を追加するものです。これは、特定のビルド環境(例: Windows)でビルドプロセスがハングアップした場合に、手動でビルドを「失敗」としてマークする手間と時間を削減することを目的としています。

コミット

commit ee3e24f2d7da60d28c1f6321fa6faddff9b26eec
Author: Russ Cox <rsc@golang.org>
Date:   Thu Feb 9 23:46:48 2012 -0500

    dashboard: add gobuilder -fail mode
    
    This is for filling a column with "fail", like I just did for
    Windows, when the builder would get stuck running that
    build.  (We have safeguards against the tests getting stuck
    but this was the bootstrap build getting stuck.)
    
    I usually use -cmd=/bin/false, but this avoids the Mercurial
    checkouts, which means it runs instantly instead of requiring
    ~1 minute per "fail".
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/5649049

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

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

元コミット内容

Go言語のダッシュボードシステムに、gobuilderの新しいモードとして -fail オプションを追加します。このモードは、ビルドがハングアップするなどして正常に完了しない場合に、そのビルドを「失敗」として迅速にマークするために使用されます。これにより、ビルドが実際に実行されるのを待つことなく、ダッシュボードに失敗ステータスを反映させることができます。特に、Mercurialリポジトリのチェックアウトに時間がかかる環境(例: Windows)で、ビルドがスタックした場合に有効です。

変更の背景

この変更の背景には、Go言語の継続的インテグレーション(CI)システムにおける特定の課題がありました。コミットメッセージによると、Windows環境でのビルドが「スタック」する(ハングアップする、応答しなくなる)問題が発生していました。通常のテストがスタックするのを防ぐためのセーフガードは存在していましたが、この問題は「ブートストラップビルド」がスタックすることに起因していました。

このような状況では、ビルドが完了するのを待つか、手動で介入してビルドを停止し、失敗としてマークする必要がありました。しかし、これには時間がかかり、特にMercurialリポジトリのチェックアウトが伴う場合、1回の「失敗」を記録するのに約1分を要していました。

以前は、gobuilder -cmd=/bin/false のようなコマンドを使用して、ビルドを即座に失敗させる方法が使われていました。しかし、この方法でもMercurialのチェックアウトプロセスは実行されるため、完全に時間を節約できるわけではありませんでした。

そこで、ビルドが実際に実行されることなく、即座に「失敗」として記録できる専用の -fail モードが提案されました。これにより、ビルドがスタックした場合でも、ダッシュボードのステータスを迅速に更新し、問題のあるビルド環境を特定・対処するまでの時間を短縮することが可能になります。

前提知識の解説

このコミットを理解するためには、以下の概念について知っておく必要があります。

  • Go言語のダッシュボード (Go Dashboard): Go言語プロジェクトでは、多数のプラットフォームやアーキテクチャでのビルドとテストの状況を監視するために、中央集権的なダッシュボードシステムが運用されています。これは、継続的インテグレーション(CI)システムの一部であり、各コミットが様々な環境で正常に動作するかどうかを可視化します。
  • gobuilder: Go言語のダッシュボードシステムの一部として機能する、ビルドエージェントまたはビルドクライアントのプログラムです。gobuilder は、Goリポジトリの最新のコミットを取得し、指定された環境でビルドとテストを実行し、その結果をダッシュボードに報告する役割を担っています。
  • 継続的インテグレーション (CI): ソフトウェア開発手法の一つで、開発者がコードの変更を頻繁に共有リポジトリに統合(マージ)し、そのたびに自動的にビルドとテストを実行することで、早期に問題を検出することを目的とします。Go言語のダッシュボードと gobuilder は、このCIプロセスを支える重要なコンポーネントです。
  • ビルドシステム: ソースコードをコンパイルし、実行可能なプログラムやライブラリを生成するプロセスを自動化するツールや環境の総称です。gobuilder は、このビルドシステムの一部として機能します。
  • Mercurial (Hg): Gitと同様の分散型バージョン管理システムです。Go言語プロジェクトは、初期にはMercurialを使用していましたが、後にGitに移行しました。このコミットが作成された2012年時点では、まだMercurialが使用されており、そのチェックアウトプロセスがビルド時間やスタックの問題に影響を与えていました。
  • ブートストラップビルド: ソフトウェア開発において、より複雑なシステムを構築するために必要な、基本的なコンポーネントやツールを最初にビルドするプロセスを指します。Go言語の場合、Goコンパイラ自体をビルドするプロセスなどがこれに該当する場合があります。

技術的詳細

このコミットは、misc/dashboard/builder/main.go ファイルに新しいコマンドラインフラグ -fail と、それに対応するロジックを追加することで、gobuilder の機能を拡張しています。

  1. -fail フラグの追加: var failAll = flag.Bool("fail", false, "fail all builds") この行により、gobuilder コマンドに -fail というブール型のフラグが追加されます。このフラグが true に設定されると、gobuilder は通常のビルドプロセスを実行せず、代わりに「失敗モード」に入ります。

  2. main 関数での -fail モードの分岐: if *failAll { failMode(builders); return } main 関数内で、failAll フラグが true の場合、通常のビルド設定や環境準備の前に failMode 関数が呼び出され、その後プログラムが終了します。これにより、ビルド環境のセットアップやMercurialのチェックアウトといった時間のかかる前処理をスキップし、即座に失敗を記録することが可能になります。

  3. failMode 関数の実装: func failMode(builders []*Builder) この関数は、gobuilder が「失敗モード」で動作する際の主要なロジックを含んでいます。

    • 無限ループ for {} を使用して、新しいコミットが検出されるたびに失敗を記録し続けます。
    • Builder オブジェクト(異なるビルド構成に対応)に対して b.failBuild() を呼び出します。
    • !built (何も失敗するものがなかった場合) にループを抜けることで、不要な処理を避けます。
  4. failBuild メソッドの実装: func (b *Builder) failBuild() bool このメソッドは、個々のビルド構成(Builder)に対して失敗を記録する具体的な処理を行います。

    • b.todo("build-go-commit", "", "") を呼び出して、新しいコミットハッシュがあるかどうかを確認します。これは、ダッシュボードシステムから次にビルドすべきコミット情報を取得するメカニズムです。
    • 新しいコミットハッシュが取得できた場合(hash != "")、そのハッシュとビルダ名をログに出力します。
    • b.recordResult(false, "", hash, "", "auto-fail mode run by " + os.Getenv("USER"), 0) を呼び出して、ビルド結果をダッシュボードに記録します。ここで false はビルドが失敗したことを示し、メッセージには「auto-fail mode run by [ユーザー名]」が含まれます。
    • ビルドが「試行された」(つまり、新しいコミットが検出され、失敗が記録された)場合は true を返します。

この変更により、管理者は特定のビルド環境が問題を起こしている際に、手動で gobuilder -fail コマンドを実行するだけで、その環境でのビルドを即座に失敗としてマークし、ダッシュボードのステータスを最新の状態に保つことができるようになります。これにより、問題の診断と解決までの時間が短縮されます。

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

変更は misc/dashboard/builder/main.go ファイルに集中しています。

--- a/misc/dashboard/builder/main.go
+++ b/misc/dashboard/builder/main.go
@@ -54,6 +54,7 @@ var (
 	buildRelease  = flag.Bool("release", false, "Build and upload binary release archives")
 	buildRevision = flag.String("rev", "", "Build specified revision and exit")
 	buildCmd      = flag.String("cmd", filepath.Join(".", allCmd), "Build command (specify relative to go/src/)")
+	failAll = flag.Bool("fail", false, "fail all builds")
 	external      = flag.Bool("external", false, "Build external packages")
 	parallel      = flag.Bool("parallel", false, "Build multiple targets in parallel")
 	verbose       = flag.Bool("v", false, "verbose")
@@ -87,6 +88,11 @@ func main() {
 		}
 		builders[i] = b
 	}\n+\t\n+\tif *failAll {\n+\t\tfailMode(builders)\n+\t\treturn\n+\t}\n \n 	// set up work environment
 	if err := os.RemoveAll(*buildroot); err != nil {
@@ -161,6 +167,21 @@ func main() {
 	}
 }\n \n+// go continuous fail mode
+// check for new commits and FAIL them
+func failMode(builders []*Builder) {
+\tfor {\n+\t\tbuilt := false\n+\t\tfor _, b := range builders {\n+\t\t\tbuilt = b.failBuild() || built
+\t\t}\n+\t\t// stop if there was nothing to fail
+\t\tif !built {\n+\t\t\tbreak
+\t\t}\n+\t}\n+}\n+\n func NewBuilder(builder string) (*Builder, error) {
 \tb := &Builder{name: builder}\n \n@@ -350,6 +371,27 @@ func (b *Builder) buildHash(hash string) error {
 	return nil
 }\n \n+// failBuild checks for a new commit for this builder
+// and fails it if one is found. 
+// It returns true if a build was "attempted".
+func (b *Builder) failBuild() bool {
+\thash, err := b.todo("build-go-commit", "", "")
+\tif err != nil {
+\t\tlog.Println(err)
+\t\treturn false
+\t}\n+\tif hash == "" {\n+\t\treturn false
+\t}\n+\t\n+\tlog.Printf("fail %s %s\\n", b.name, hash)\n+\n+\tif err := b.recordResult(false, "", hash, "", "auto-fail mode run by " + os.Getenv("USER"), 0); err != nil {
+\t\tlog.Print(err)
+\t}\n+\treturn true
+}\n+\n func (b *Builder) buildSubrepos(goRoot, goHash string) {
 \tfor _, pkg := range dashboardPackages("subrepo") {
 \t\t// get the latest todo for this package

コアとなるコードの解説

  1. var failAll = flag.Bool("fail", false, "fail all builds"):

    • この行は、Goの flag パッケージを使用して、コマンドライン引数 -fail を定義しています。
    • flag.Bool は、ブール型のフラグを作成し、デフォルト値を false に設定します。
    • "fail all builds" は、このフラグの簡単な説明です。
    • これにより、gobuilder -fail のようにコマンドを実行できるようになります。
  2. if *failAll { failMode(builders); return }:

    • main 関数内で、コマンドラインで -fail フラグが指定されたかどうか(*failAlltrue かどうか)をチェックします。
    • もし true であれば、通常のビルド処理をスキップし、新しく定義された failMode 関数を呼び出します。
    • return ステートメントにより、main 関数の残りの部分(実際のビルド環境のセットアップやビルド実行ロジック)は実行されずにプログラムが終了します。
  3. func failMode(builders []*Builder):

    • この関数は、-fail モードが有効になったときに実行されるメインのロジックをカプセル化しています。
    • for {} ループは、新しいコミットがダッシュボードから提供されなくなるまで、継続的に失敗を記録しようとします。
    • built := false は、今回のイテレーションで何らかのビルドが「試行された」(つまり、失敗が記録された)かどうかを追跡するためのフラグです。
    • for _, b := range builders ループは、設定されている各ビルダ(異なるプラットフォームや構成に対応)に対して処理を行います。
    • built = b.failBuild() || built は、各ビルダの failBuild メソッドを呼び出し、その結果(ビルドが試行されたかどうか)を built フラグに反映させます。
    • if !built { break } は、もしどのビルダも新しいコミットを検出して失敗を記録しなかった場合、ループを終了します。これは、処理すべきコミットがもうないことを意味します。
  4. func (b *Builder) failBuild() bool:

    • このメソッドは、特定の Builder インスタンス(特定のビルド構成)に対して、新しいコミットを検出して失敗を記録する責任を負います。
    • hash, err := b.todo("build-go-commit", "", "") は、ダッシュボードシステムから次に処理すべきコミットのハッシュを取得しようとします。b.todo は、ビルダがダッシュボードと通信してタスクを取得するための内部メソッドです。
    • エラーが発生した場合や、処理すべき新しいコミットがない場合(hash == "")、このメソッドは false を返します。
    • log.Printf("fail %s %s\\n", b.name, hash) は、どのビルダがどのコミットを失敗として記録したかをログに出力します。
    • if err := b.recordResult(false, "", hash, "", "auto-fail mode run by " + os.Getenv("USER"), 0); err != nil { ... } は、最も重要な部分です。
      • b.recordResult は、ビルド結果をダッシュボードに送信するためのメソッドです。
      • 最初の引数 false は、ビルドが失敗したことを明示的に示します。
      • hash は、失敗として記録されるコミットのハッシュです。
      • "auto-fail mode run by " + os.Getenv("USER") は、この失敗が自動失敗モードによって記録されたこと、およびそれを実行したユーザー(環境変数 USER から取得)を示すメッセージです。これにより、ダッシュボード上でこの失敗が通常のビルド失敗とは異なる、管理上の操作によるものであることが明確になります。
    • 最後に true を返すことで、このビルダが新しいコミットを検出して失敗を記録する「試行」を行ったことを示します。

これらの変更により、gobuilder は、実際のビルドプロセスを実行することなく、ダッシュボードに「失敗」ステータスを迅速に反映させるための効率的なメカニズムを獲得しました。

関連リンク

  • Go言語の継続的インテグレーションに関する公式ドキュメントやブログ記事(当時のものがあれば)
  • Go言語のダッシュボードのソースコードリポジトリ(misc/dashboard ディレクトリ)
  • このコミットが参照しているGoの変更リスト (CL): https://golang.org/cl/5649049

参考にした情報源リンク

  • コミットメッセージの内容
  • Go言語のCI/CDシステムに関する一般的な知識
  • Mercurialバージョン管理システムに関する一般的な知識
  • Go言語の flag パッケージのドキュメント (Go標準ライブラリ)
  • Go言語の os パッケージのドキュメント (Go標準ライブラリ)
  • Go言語の log パッケージのドキュメント (Go標準ライブラリ)
  • (必要に応じて)Google検索: "Go dashboard", "gobuilder", "Go continuous integration" など