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

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

このコミットは、Goプロジェクトの継続的インテグレーション(CI)システムの一部であるmisc/dashboard/builderツールの設定変更に関するものです。具体的には、外部コマンドの実行タイムアウト時間を5分から10分に延長しています。

コミット

commit 6db195cae25904a8675804073f87c2b65e154370
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Mon Jul 29 14:31:21 2013 +1000

    misc/dashboard/builder: increase cmdTimeout to 10 minutes
    
    It takes more then 5 minutes to clone go repo
    on windows-386 builder now.
    
    R=golang-dev, dave
    CC=golang-dev
    https://golang.org/cl/12007043

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

https://github.com/golang/go/commit/6db195cae25904a8675804073f87c2b65e154370

元コミット内容

misc/dashboard/builder: increase cmdTimeout to 10 minutes

このコミットは、misc/dashboard/builderディレクトリ内のcmdTimeout変数の値を10分に増加させるものです。コミットメッセージによると、これはWindows-386ビルダでGoリポジトリのクローンに5分以上かかるようになったため、タイムアウトを回避するために行われました。

変更の背景

Goプロジェクトは、様々なプラットフォームやアーキテクチャでのビルドとテストの健全性を継続的に監視するために、独自のCIシステム(通称「Goダッシュボード」または「Goビルダー」)を運用しています。このシステムは、golang.org/x/build/dashboardパッケージの一部として提供されており、ビルドの成功または失敗を報告します。

コミットメッセージに「It takes more then 5 minutes to clone go repo on windows-386 builder now.」とあるように、特定のビルド環境(この場合はWindows-386アーキテクチャのビルダ)において、Goリポジトリをクローンする処理が以前よりも時間がかかるようになっていました。これは、リポジトリのサイズ増大、ネットワークの遅延、あるいはビルダマシンの性能低下など、様々な要因によって発生し得ます。

cmdTimeoutは、外部コマンド(この場合はgit cloneなど)の実行に許容される最大時間を定義する設定です。このタイムアウトが短すぎると、コマンドが正常に完了する前にシステムによって強制終了され、ビルドが失敗する原因となります。この問題に対処するため、タイムアウト値を5分から10分に延長することで、リポジトリのクローン処理が完了するのに十分な時間を与えることが目的です。

前提知識の解説

Goダッシュボード (Go Builder)

GoプロジェクトのCIシステムは、Goダッシュボードとして知られています。これは、世界中の様々な貢献者によってホストされている多数の「ビルダー」マシンで構成されています。これらのビルダーは、Goのソースコードの変更がコミットされるたびに、その変更をプルし、Goのビルド、テスト、およびその他の検証タスクを実行します。結果は中央のダッシュボードに報告され、開発者はGoのコードベースの健全性をリアルタイムで確認できます。

cmdTimeout

cmdTimeoutは、Goプログラムが外部のシェルコマンド(例: git, go test, go buildなど)を実行する際に、そのコマンドが完了するまで待機する最大時間を設定するためのパラメータです。Go言語では、os/execパッケージを使用して外部コマンドを実行し、contextパッケージと組み合わせてタイムアウトを制御するのが一般的です。

  • os/execパッケージ: Goプログラムから外部コマンドを実行するための機能を提供します。exec.Command関数でコマンドと引数を指定し、Run(), Output(), CombinedOutput()などのメソッドで実行します。
  • contextパッケージ: Goにおけるコンテキストは、API境界を越えて、またゴルーチン間で、デッドライン、キャンセルシグナル、およびその他のリクエストスコープの値を伝播するためのメカニズムを提供します。タイムアウトの場合、context.WithTimeoutを使用して、指定された期間後に自動的にキャンセルされるコンテキストを作成します。
  • exec.CommandContext: os/execパッケージの関数で、context.Contextを受け取ります。このコンテキストがキャンセルされると(タイムアウトなどにより)、実行中のプロセスを終了しようとします。

cmdTimeoutのような設定は、CIシステムのような長時間実行される可能性のある外部プロセスを扱うシステムにおいて非常に重要です。これにより、ハングアップしたプロセスがリソースを無期限に消費するのを防ぎ、ビルドの信頼性と効率性を向上させます。

技術的詳細

このコミットは、Goの標準ライブラリやランタイムの変更ではなく、Goプロジェクト自身のCIインフラストラクチャの一部であるmisc/dashboard/builderツールの設定変更です。

misc/dashboard/builder/main.goファイルは、Goビルダーのメインロジックを定義しています。このファイル内で、様々な設定パラメータがflagパッケージを使用して定義されています。flagパッケージは、コマンドライン引数を解析し、プログラムの動作を制御するためのGoの標準ライブラリです。

変更前は、cmdTimeout変数が5 * time.Minute(5分)に設定されていました。これは、flag.Duration関数を使って定義されており、コマンドラインから-cmdTimeoutフラグで上書きすることも可能です。

// 変更前
var (
    // ...
    cmdTimeout     = flag.Duration("cmdTimeout", 5*time.Minute, "Maximum time to wait for an external command")
    // ...
)

このコミットでは、このデフォルト値が10 * time.Minute(10分)に更新されました。

// 変更後
var (
    // ...
    cmdTimeout     = flag.Duration("cmdTimeout", 10*time.Minute, "Maximum time to wait for an external command")
    // ...
)

この変更により、Goビルダーが外部コマンド(特にGoリポジトリのクローン操作)を実行する際に、最大10分間待機するようになります。これにより、Windows-386ビルダでのリポジトリクローンに時間がかかる問題が解決され、ビルドの失敗が減少することが期待されます。

この変更は、GoのCIシステムが直面する現実的な運用上の課題(ネットワークの遅延、リポジトリサイズの増大など)に対応するための、実用的な調整と言えます。

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

変更はmisc/dashboard/builder/main.goファイルの一箇所のみです。

--- a/misc/dashboard/builder/main.go
+++ b/misc/dashboard/builder/main.go
@@ -61,7 +61,7 @@ var (
  	failAll        = flag.Bool("fail", false, "fail all builds")
  	parallel       = flag.Bool("parallel", false, "Build multiple targets in parallel")
  	buildTimeout   = flag.Duration("buildTimeout", 60*time.Minute, "Maximum time to wait for builds and tests")
-	cmdTimeout     = flag.Duration("cmdTimeout", 5*time.Minute, "Maximum time to wait for an external command")
+	cmdTimeout     = flag.Duration("cmdTimeout", 10*time.Minute, "Maximum time to wait for an external command")
  	commitInterval = flag.Duration("commitInterval", 1*time.Minute, "Time to wait between polling for new commits (0 disables commit poller)")
  	verbose        = flag.Bool("v", false, "verbose")
  )

コアとなるコードの解説

上記の差分が示すように、cmdTimeout変数の初期値が5*time.Minuteから10*time.Minuteに変更されています。

  • var (...):Go言語におけるグローバル変数の宣言ブロックです。
  • cmdTimeout = flag.Duration("cmdTimeout", 10*time.Minute, "Maximum time to wait for an external command")
    • flag.Durationflagパッケージの関数で、time.Duration型のコマンドラインフラグを定義します。
    • "cmdTimeout":コマンドラインで指定するフラグの名前です(例: -cmdTimeout=15m)。
    • 10*time.Minute:このフラグのデフォルト値です。time.MinuteはGoのtimeパッケージで定義されている定数で、1分間の期間を表します。したがって、10*time.Minuteは10分間を意味します。
    • "Maximum time to wait for an external command":このフラグの短い説明文です。

この変更は、Goビルダーが外部コマンドを実行する際に、デフォルトで許容される最大実行時間を倍増させることを意味します。これにより、特にリポジトリのクローンなど、時間がかかる可能性のある操作がタイムアウトによって中断されるリスクが低減されます。

関連リンク

参考にした情報源リンク