Go Wiki: Gomote

gomoteコマンドは、Goビルダーインフラストラクチャのクライアントです。リモートGoビルダーマシンのリモートコントロールです。

インストール

$ go install golang.org/x/build/cmd/gomote@latest  # Go 1.16 and later

使用方法

gomoteツールの最も基本的な使い方は、わずか数ステップです。

  1. インスタンスを作成します。
  2. インスタンスにコードをプッシュします。
  3. インスタンスでコマンドを実行します。

createコマンドを実行すると、使用可能なインスタンスタイプが表示されます。

$ gomote create
(list tons of buildlet types)

次に、インスタンスタイプを指定してインスタンスを作成できます。インスタンスの名前は標準出力に出力されるため、その結果は環境変数に保存できます。(他のログメッセージが表示される場合がありますが、それらは標準エラー出力に表示され、各行の先頭に「#」が付きます。)

$ gomote create linux-amd64
# still creating linux-amd64 (1) after 5s; 0 requests ahead of you
user-linux-amd64-0

そのインスタンス名を使用して、ローカルのGoリポジトリの内容をインスタンスにプッシュ(より具体的には同期)し、ブートストラップツールチェーンをインストールできます。同期するリポジトリは、$WORKDIR(すべてのgomote操作のデフォルトディレクトリ)のgoサブディレクトリに表示されます。ブートストラップツールチェーンは常にgo1.4サブディレクトリに配置されます(ブートストラップツールチェーンがバージョン1.4のものでない場合でも)。

$ GOROOT=/path/to/local/go/repo gomote push user-linux-amd64-0
$ gomote ls user-linux-amd64-0
go
go1.4

pushは実際には「同期」操作であるため、次回プッシュする際には、gomoteツールは変更されたものだけをプッシュします(追加、変更、または削除されたファイル)。

ツールチェーンがインストールされたら、インスタンスでコマンドを実行してビルドできます。runコマンドを使用すると、実行する実行可能ファイルを指定できます。実行可能ファイルは、$WORKDIRを基準にした相対パス(例:go/bin/go)または絶対パス(例:/bin/bash)で指定する必要があります。その実行可能ファイルは、実行可能ファイルを含むディレクトリにカレントワーキングディレクトリを設定して実行されます。

$ gomote run user-linux-amd64-0 go/src/make.bash

次に、ビルドされたGoツールチェーンを実行するには、go/bin/goを使用します。

$ gomote run user-linux-amd64-0 go/bin/go test -run="TestSomething" -v runtime

さらに、コマンドの実行前に適用されるワーキングディレクトリと環境変数をrunに指定できます。

gomoteインスタンスは、30分間の非アクティブ状態の後、自動的に消滅します。残りの時間を確認するには、listコマンドを使用します。

$ gomote list
user-linux-amd64-0  linux-amd64 host-linux-amd64-bullseye   expires in 10m27.339494527s

pingコマンドは、他のコマンドが実行されていない場合にインスタンスをアクティブな状態に保つために使用できます。

各コマンドの詳細については、gomote help <command>を実行してください。他のコマンドについては、gomote helpを実行してください。

ビルドレットの直接デバッグ

createコマンドはビルドコーディネーター(farmer.golang.org)に連絡し、あなたの代わりにビルドレットを作成するよう要求します。その後、gomote rungomote lsなどのすべてのコマンドは、コーディネーター経由であなたの要求をプロキシします。ビルドレットコードに取り組んでいる場合など、ビルドレットに直接アクセスするには、gomote createステップをスキップし、特別なビルダー名<build-config-name>@ip[:port>(例:windows-amd64-2008@10.1.5.3)を使用できます。

グループ

インスタンスは名前付きグループで管理でき、コマンドはグループ内のすべてのインスタンスにブロードキャストされます。

-groupグローバルフラグ、またはGOMOTE_GROUP環境変数によってグループを指定します。-groupフラグは常に有効なグループを指定する必要がありますが、GOMOTE_GROUPには無効なグループを含めることができます。インスタンスは複数のグループに属することができます。

グループは「group」サブコマンドで明示的に管理できますが、多くの場合、これを不要にするいくつかのショートカットがあります。

その結果、グループを使用する最も簡単な方法は、GOMOTE_GROUP環境変数を設定することです。

$ export GOMOTE_GROUP=debug
$ gomote create linux-amd64
$ GOROOT=/path/to/goroot gomote push
$ gomote run go/src/make.bash

この例が示すように、グループは、グループに単一のインスタンスのみが含まれている場合でも役立ちます。ほとんどのgomoteコマンドを大幅に短縮できます。

ヒントとコツ

全般

createコマンドは、GOROOTをプッシュし、インスタンスに対して適切なmake.bashの同等のものを実行する-setupフラグを受け入れます。

$ GOROOT=/path/to/my/goroot gomote create -setup linux-amd64
# Creating user-linux-amd64-0...
# Pushing /path/to/my/goroot to user-linux-amd64-0
# Running make.bash on user-linux-amd64-0...

createコマンドは、一度に複数のインスタンスを作成するための-countフラグを受け入れます。

$ gomote create -count=3 linux-amd64
# Creating user-linux-amd64-0...
# Creating user-linux-amd64-1...
# Creating user-linux-amd64-2...

runコマンドは、コマンドの出力を現在のワーキングディレクトリのファイルに自動的に書き込む-collectフラグと、インスタンスからの完全なファイルツリーのコピーを受け入れます。このコマンドは、セットアンドフォーゲット方式で長時間実行されるコマンドの出力をキャプチャするのに役立ちます。

$ gomote run -collect user-linux-amd64-0 /bin/bash -c 'echo hi'
# Writing output to user-linux-amd64-0.stdout...
$ cat user-linux-amd64-0.stdout
hi
$ ls user-linux-amd64-0.tar.gz
user-linux-amd64-0.tar.gz

runコマンドは、コマンドの出力が特定のパターンと一致するまでコマンドを継続的に実行するための-untilフラグを受け入れます。これは、まれな問題を再現するのに役立ち、特に-collectと併用する場合に役立ちます。

$ gomote run -collect -until 'FAIL' user-linux-amd64-0 go/bin/go test -run 'TestFlaky' -count=1000 runtime
# Writing output to user-linux-amd64-0.stdout...
$ cat user-linux-amd64-0.stdout
...
--- FAIL: TestFlaky ---
...
$ ls user-linux-amd64-0.tar.gz
user-linux-amd64-0.tar.gz

ターミナルのスクロールバックによる出力の損失を防ぐために、runコマンドは追加のフラグに関係なく、常に出力を一時ファイルにストリーミングします。ファイルの場所は常に表示されます。

まれなエラーの再現

上記のいくつかのトリックを組み合わせてグループを利用することで、まれなエラーを再現しようとするテストを簡単に実行できます。例えば

$ export GOMOTE_GROUP=debug
$ GOROOT=/path/to/goroot gomote create -setup -count=10 linux-amd64
$ gomote run -until='unexpected return pc' -collect go/bin/go run -run="TestFlaky" -count=100 runtime

Darwin

LUCIでホストされているDarwin gomoteには、Xcodeが事前にインストールされていません。Xcodeがないと、cgoビルドを実行できません。cgoを無効にしてビルドできます。

$ gomote run -e 'CGO_ENABLED=0' $MOTE go/src/make.bash

または、次のようにXcodeをインストールします。

$ gomote run $MOTE /bin/mkdir /tmp/xcode
$ gomote run $MOTE /Users/swarming/.swarming/w/ir/tools/bin/mac_toolchain install -xcode-version 15a240d -output-dir /tmp/xcode/Xcode.app
$ gomote run $MOTE /usr/bin/sudo xcode-select --switch /tmp/xcode/Xcode.app

注:取得するマシンによっては、参照されているmac_toolchainバイナリは/Volumes/Work/s/w/ir/tools/bin/mac_toolchainにある場合があります。

Windows

$ gomote run -path '$PATH,$WORKDIR/go/bin' $MOTE go/src/make.bat
$ gomote run -path '$PATH,$WORKDIR/go/bin' $MOTE go/bin/go.exe test cmd/go -short

注:以前のバージョンのWikiでは、gomote 'run'コマンドのGOROOTの設定(例:「-e GOROOT=c:\workdir\go」)が推奨されていましたが、これはもはや推奨されていません(Goコマンドキャッシングに問題を引き起こします)。

Windowsでのサブレポ

$ tar --exclude .git -C ~/go/src/ -zc golang.org/x/tools | gomote puttar -dir=gopath/src $MOTE -
$ gomote run -e 'GOPATH=c:/workdir/gopath' $MOTE go/bin/go test -run=TestFixImportsVendorPackage golang.org/x/tools/imports

マシンにsshで接続している場合、これらの環境変数が役立つ場合があります。

$ set GOPATH=c:\workdir\gopath
$ set PATH=%PATH%;c:\workdir\gopath\bin;c:\workdir\go\bin
$ set CGO_ENABLED=0

Unixでのサブレポ

$MOTEでgolang.org/x/sys/unixをテストする

$ tar -C $GOPATH/src/ -zc golang.org/x/sys/unix | gomote puttar -dir=gopath/src $MOTE
$ gomote run -e 'GOPATH=/tmp/workdir/gopath' -dir 'gopath/src/golang.org/x/sys/unix' $MOTE go/bin/go test -v golang.org/x/sys/unix

(GOPATH部分はGOPATH互換モード用です。-dirはモジュールモード用で、ワーキングディレクトリとその上にあるgo.modを探します)

Android

export MOTE=`gomote create android-arm64-wikofever`
gomote push $MOTE
gomote run $MOTE go/src/make.bash

PATHには、make.bashによってビルドされたexecラッパー、go_android_*_execを含める必要があります。

gomote run -path '$PATH,$WORKDIR/go/bin' $MOTE go/bin/go test math/big

ビルドレットについて

https://farmer.golang.org/builders は、各ビルドレットの展開方法と構成方法に関する情報をリストしています。情報はgolang.org/x/build/dashboardとgolang.org/x/build/envから取得されます。

アクセス

2022年8月、新しいインフラストラクチャが展開され、以前に承認されたユーザーからのすべてのgomoteアクセスが削除されました。アクセスが必要な場合は、アクセスを再要求してください。

gomoteサービスへのアクセスを要求するには、新しい問題を提出してください(https://go.dokyumento.jp/issue/new?title=access:+&body=See+https://go.dokyumento.jp/wiki/Gomote%23access)。そして、Gerritにログインするために使用するGoogleアカウントを記述してください。提供されたアカウントは、認証の目的でのみ使用されます。

認証は、コマンドの最初の呼び出しでトリガーされます。

$ gomote create linux-amd64
Please visit https://www.google.com/device in your browser and enter verification code:
 ABCD-4567
...

提供されたリンクを使用してブラウザを開くと、ユーザーはGoogleアカウントで認証し、検証コードをブラウザに貼り付ける必要があります。しばらく待つと、クライアントが認証されます。

gomote ssh

gomote sshコマンドは、gomote用に特別に作成されたSSHキーを使用します。gomote sshを初めて使用すると、キーのセットが作成され、ローカルユーザーの構成ディレクトリに保存されます。キーのパスワードを設定するように求められる場合があります(パスワードは必須ではありません)。SSH機能はOpenSSH証明書認証で動作し、追加の構成は必要ありません。すべてのビルダータイプがgomote sshをサポートしているわけではありません。


このコンテンツは、Go Wikiの一部です。