Go Wiki: Gomote
gomoteコマンドは、Goビルダーインフラストラクチャのクライアントです。リモートGoビルダーマシンのリモートコントロールです。
インストール
$ go install golang.org/x/build/cmd/gomote@latest # Go 1.16 and later
使用方法
gomoteツールの最も基本的な使い方は、わずか数ステップです。
- インスタンスを作成します。
- インスタンスにコードをプッシュします。
- インスタンスでコマンドを実行します。
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 run
やgomote ls
などのすべてのコマンドは、コーディネーター経由であなたの要求をプロキシします。ビルドレットコードに取り組んでいる場合など、ビルドレットに直接アクセスするには、gomote create
ステップをスキップし、特別なビルダー名<build-config-name>@ip[:port>
(例:windows-amd64-2008@10.1.5.3
)を使用できます。
グループ
インスタンスは名前付きグループで管理でき、コマンドはグループ内のすべてのインスタンスにブロードキャストされます。
-groupグローバルフラグ、またはGOMOTE_GROUP
環境変数によってグループを指定します。-groupフラグは常に有効なグループを指定する必要がありますが、GOMOTE_GROUP
には無効なグループを含めることができます。インスタンスは複数のグループに属することができます。
グループは「group」サブコマンドで明示的に管理できますが、多くの場合、これを不要にするいくつかのショートカットがあります。
create
コマンドは、-new-group
フラグを使用して、インスタンスの新しいグループを作成できます。create
コマンドは、他のグループが明示的に指定されていない場合、存在しない場合にGOMOTE_GROUP
にグループを自動的に作成します。destroy
コマンドは、-destroy-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の一部です。