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コマンドを-listフラグ付きで実行すると、利用可能なインスタンスタイプが一覧表示されます。

$ gomote create -list
(list tons of builder types)

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

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

そのインスタンス名を使用して、GOROOTをインスタンスにプッシュし、ブートストラップツールチェーンをインストールできます。同期するリポジトリは、$WORKDIR(すべてのgomote操作のデフォルトディレクトリ)のgoサブディレクトリに表示されます。ブートストラップツールチェーンは常にgo1.4サブディレクトリにインストールされます(ブートストラップツールチェーンがバージョン1.4からのものでなくても)。

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

pushは実際には「同期」操作であるため、次回プッシュするときには、変更されたもの(追加、変更、または削除されたファイル)のみがgomoteツールによってプッシュされることに注意してください。

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

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

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

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

コマンドが実行される前に適用される、作業ディレクトリと環境変数をrunのフラグとして追加で指定できます。

gomoteインスタンスは30分間操作がないと自動的に消滅することに注意してください。残りの時間を確認するにはlistコマンドを使用してください。

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

他のコマンドが実行されていない場合にインスタンスを維持するには、pingコマンドを使用できます。

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

ビルダの種類

利用可能なビルダの種類は、おおよそ$GOBRANCH-($REPO-)?$GOOS-$GOARCH(_$OS)-$EXTRAという特定の構造に従います。

これらの名前に関するいくつかの有用な注意点。

  • 異なる$GOBRANCHは、主にブートストラップGoツールチェーンのような、プリインストールされたツールのバージョンを変更します。
  • $REPOを持つビルダの種類は、指定されたリポジトリがツリーの先端で作業ルートにダウンロードされます。

ビルドレットを直接デバッグする

createコマンドはビルドコーディネーター(farmer.golang.org)に連絡し、あなたに代わってビルドレットを作成するように要求します。その後のすべてのコマンド(gomote rungomote lsなど)は、コーディネーターを介してあなたのリクエストをプロキシします。ビルドレットに直接アクセスする場合(たとえば、ビルドレットコードを操作している場合)、gomote createステップをスキップし、@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 gotip-linux-amd64
$ GOROOT=/path/to/goroot gomote push
$ gomote run go/src/make.bash

この例が示すように、グループが単一のインスタンスしか含まない場合でも、グループは有用です。ほとんどのgomoteコマンドを劇的に短縮できます。

ヒントとコツ

一般

createコマンドは-setupフラグを受け入れます。これにより、GOROOTをプッシュし、インスタンスに適したmake.bashに相当するものを実行します。

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

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

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

runコマンドは、コマンドの出力を現在の作業ディレクトリ内のファイルに自動的に書き込むための-collectフラグ、およびインスタンスからの完全なファイルツリーのコピーを受け入れます。このコマンドは、長時間実行されるコマンドの出力を「設定したら忘れ去る」方法で取得するのに役立ちます。

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

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

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

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

まれな障害の再現

上記のトリックのいくつかを組み合わせ、グループを活用することで、まれな障害を再現しようとテストを試すのがはるかに簡単になります。例:

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

Darwin

Darwinのgomoteは、マシンが利用可能であっても、セットアップに数分かかることが知られています。これは、Xcodeのセットアップに必要な余分な時間によるものです。

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=%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=%WORKDIR%\gopath' $MOTE go/bin/go test -run=TestFixImportsVendorPackage golang.org/x/tools/imports

SSHでマシンに接続している場合、これらの環境変数が便利かもしれません。

$ set GOPATH=%WORKDIR%\gopath
$ set PATH=%PATH%;%WORKDIR%\gopath\bin;%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によってビルドされた実行ラッパー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からのものです。

アクセス

2025年1月より、承認者アクセスを持つコントリビューターには、gomoteアクセスが自動的に付与されます。

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

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

認証はコマンドの初回呼び出し時にトリガーされます。

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

loginコマンドも認証ワークフローを開始します。

$ gomote login
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の一部です。