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

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

コミット

  • コミットハッシュ: d5f78d77c065b2c202e17b3be0d3490507cf5a4c
  • 作者: Shenghou Ma minux.ma@gmail.com
  • コミット日時: 2012年3月5日 月曜日 23:16:11 +0800

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

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

元コミット内容

builder: use short test for subrepos

R=rsc, golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5732053

変更の背景

このコミットは、Go言語プロジェクトのビルドシステム(ダッシュボードのビルダー)において、サブリポジトリのテスト実行方法を最適化することを目的としています。具体的には、go testコマンドに-shortフラグを追加することで、テストの実行時間を短縮し、継続的インテグレーション(CI)プロセスの効率を向上させています。

当時のGoプロジェクトは、Google CodeのMercurialリポジトリでホストされており、大規模なテストスイートの実行はCIシステムに大きな負荷をかけていました。特にサブリポジトリは、Go本体とは独立して開発・テストされることが多く、そのテストがCI全体のボトルネックになる可能性がありました。

また、hgUrlの変更は、GoプロジェクトがGoogle Code内で使用していたMercurialリポジトリのURL表記の変更、あるいはより一般的なプロジェクトページへのリンクへの更新を示唆しています。これは、当時のGoプロジェクトのインフラストラクチャの進化や、Google Code内でのリポジトリ管理の慣行の変化に対応したものであると考えられます。

前提知識の解説

Go言語のテスト (go test)

Go言語には、標準でテストフレームワークが組み込まれており、go testコマンドを使用してテストを実行します。_test.goというサフィックスを持つファイルにテストコードを記述し、func TestXxx(*testing.T)のような関数を定義することで、テストが自動的に発見・実行されます。

go test -short フラグ

go testコマンドの-shortフラグは、テストの実行時間を短縮するためのオプションです。このフラグが指定されると、テストコード内でtesting.Short()関数がtrueを返します。開発者はこの関数を利用して、時間のかかるテスト(例: ネットワークアクセス、ファイルI/O、大規模な計算を伴うテスト)をスキップするロジックを記述できます。これにより、開発中の迅速なフィードバックや、CI環境での高速なテスト実行が可能になります。

Go言語のサブリポジトリ (Subrepos)

Go言語のプロジェクトは、初期の頃から複数の独立したモジュールやライブラリを「サブリポジトリ」として管理していました。これらはGo本体のリポジトリとは別にバージョン管理され、go getコマンドで取得できるようになっていました。例えば、golang.org/x/netgolang.org/x/textなどがこれに該当します。これらのサブリポジトリは、Go本体のリリースサイクルとは独立して更新されることが多く、それぞれ独自のテストスイートを持っています。

Google CodeとMercurial (hg)

Go言語は、プロジェクトの初期段階でGoogle Codeをホスティングプラットフォームとして利用し、バージョン管理システムにはMercurial (hg) を採用していました。Google CodeはGoogleが提供していたオープンソースプロジェクト向けのホスティングサービスで、MercurialはGitと同様の分散型バージョン管理システムです。Goプロジェクトは後にGitHubへ移行し、バージョン管理システムもGitに切り替わりました。

Goプロジェクトのダッシュボード/ビルドシステム

Goプロジェクトは、継続的な品質保証のために、独自のダッシュボードとビルドシステムを運用していました。これは、Go本体やサブリポジトリの変更がコミットされるたびに自動的にビルドとテストを実行し、その結果を開発者にフィードバックする役割を担っていました。misc/dashboard/builder/main.goというファイルパスから、このコミットがそのビルドシステムの一部を修正していることがわかります。

技術的詳細

このコミットの主要な技術的変更は、GoプロジェクトのCIシステムにおけるサブリポジトリのテスト戦略の変更です。

  1. go test -shortの導入:

    • 以前は、サブリポジトリのテストはgo test pkg/...として実行されていました。これは、そのパッケージとそのサブパッケージに含まれるすべてのテストを、-shortフラグなしで実行することを意味します。
    • このコミットにより、go test -short pkg/...に変更されました。これにより、サブリポジトリのテスト実行時にtesting.Short()trueを返すようになり、テストコード内でif testing.Short() { t.Skip("skipping long test in short mode") }のようなロジックが実装されている場合、時間のかかるテストがスキップされるようになります。
    • 目的: CI環境でのビルド時間を短縮し、より迅速なフィードバックサイクルを実現すること。特にサブリポジトリは多数存在し、それぞれが独立したテストを持つため、全体のCI時間を大幅に削減できる可能性があります。
    • 影響: テストの網羅性は低下する可能性がありますが、CIでは主に基本的な機能や回帰テストを迅速に実行し、より徹底的なテストは夜間ビルドやリリース前のフルテストに任せるという戦略が一般的です。
  2. hgUrlの変更:

    • https://go.googlecode.com/hg/からhttps://code.google.com/p/go/への変更は、Mercurialリポジトリの直接的なURLから、Google Code上のGoプロジェクトの一般的なプロジェクトページURLへの変更を示しています。
    • これは、ビルドシステムがリポジトリをクローンまたは更新する際に使用するベースURLの調整です。直接的なMercurialリポジトリURLではなく、プロジェクトのトップページURLを使用することで、将来的なリポジトリ構造の変更や、Google CodeのURLスキームの変更に対する柔軟性を持たせている可能性があります。あるいは、単にプロジェクトの公式なURL表記に合わせたものかもしれません。

これらの変更は、Goプロジェクトが成長し、CIの効率が重要になるにつれて、ビルドインフラストラクチャを継続的に改善していたことを示しています。

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

diff --git a/misc/dashboard/builder/main.go b/misc/dashboard/builder/main.go
index 4fe65b7a5d..534ff514ad 100644
--- a/misc/dashboard/builder/main.go
+++ b/misc/dashboard/builder/main.go
@@ -23,7 +23,7 @@ import (
  const (
  	codeProject      = "go"
  	codePyScript     = "misc/dashboard/googlecode_upload.py"
-	hgUrl            = "https://go.googlecode.com/hg/"
+	hgUrl            = "https://code.google.com/p/go/"
  	mkdirPerm        = 0750
  	waitInterval     = 30 * time.Second // time to wait before checking for new revs
  	pkgBuildInterval = 24 * time.Hour   // rebuild packages every 24 hours
@@ -429,7 +429,7 @@ func (b *Builder) buildSubrepos(goRoot, goHash string) {
  }
  
  // buildSubrepo fetches the given package, updates it to the specified hash,
-// and runs 'go test pkg/...'. It returns the build log and any error.
+// and runs 'go test -short pkg/...'. It returns the build log and any error.
  func (b *Builder) buildSubrepo(goRoot, pkg, hash string) (string, error) {
  	goBin := filepath.Join(goRoot, "bin")
  	goTool := filepath.Join(goBin, "go")
@@ -466,7 +466,7 @@ func (b *Builder) buildSubrepo(goRoot, pkg, hash string) (string, error) {
  	}
  
  	// test the package
-\tlog, status, err = runLog(env, "", goRoot, goTool, "test", pkg+"/...")
+\tlog, status, err = runLog(env, "", goRoot, goTool, "test", "-short", pkg+"/...")
  	if err == nil && status != 0 {
  	\terr = fmt.Errorf("go exited with status %d", status)", status)
  	}

コアとなるコードの解説

このコミットは、misc/dashboard/builder/main.goファイルに対して3つの変更を加えています。

  1. hgUrl定数の変更:

    -	hgUrl            = "https://go.googlecode.com/hg/"
    +	hgUrl            = "https://code.google.com/p/go/"
    

    hgUrl定数の値が、Mercurialリポジトリの直接的なURLから、Google Code上のGoプロジェクトのトップページURLに変更されました。これは、ビルドシステムがGoのソースコードを取得する際に使用するURLの参照先を更新したものです。

  2. buildSubrepo関数のコメントの更新:

    -// and runs 'go test pkg/...'. It returns the build log and any error.
    +// and runs 'go test -short pkg/...'. It returns the build log and any error.
    

    buildSubrepo関数のコメントが更新され、この関数がサブリポジトリのテストを実行する際にgo test -short pkg/...を使用することが明示されました。これは、実際のコード変更を反映したドキュメンテーションの更新です。

  3. go testコマンドへの-shortフラグの追加:

    -	log, status, err = runLog(env, "", goRoot, goTool, "test", pkg+"/...")
    +	log, status, err = runLog(env, "", goRoot, goTool, "test", "-short", pkg+"/...")
    

    buildSubrepo関数内で、実際にgo testコマンドを実行している箇所に-shortフラグが追加されました。runLog関数は、指定された環境変数、作業ディレクトリ、実行可能ファイル、および引数でコマンドを実行し、そのログ、終了ステータス、およびエラーを返します。この変更により、サブリポジトリのテストが「ショートモード」で実行されるようになり、テスト時間が短縮されます。

これらの変更は、Goプロジェクトのビルドシステムが、サブリポジトリのテストをより効率的に、かつ迅速に実行するように調整されたことを示しています。

関連リンク

  • Gerrit Change-ID: https://golang.org/cl/5732053
    • これは、Goプロジェクトが当時使用していたコードレビューシステムであるGerritの変更セットへのリンクです。Gerritは、Gitリポジトリに対する変更をレビューし、承認するためのウェブベースのツールです。このリンクを辿ることで、このコミットに至るまでの議論や、関連する変更セットを確認できる可能性があります。

参考にした情報源リンク