Go Wiki: Gomote

gomote 命令是 Go 構建基礎設施的客戶端。它是遠端 Go 構建機器的遙控器。

安裝

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

用法

gomote 工具最基本的使用涉及幾個步驟:

  1. 建立例項。
  2. 將程式碼推送到例項。
  3. 在例項上執行命令。

執行帶 -list 標誌的 create 命令將列出可用的例項型別。

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

然後,可以透過指定例項型別來建立例項。例項的名稱將列印到 stdout,因此結果可以儲存在環境變數中。(可能還有其他日誌訊息,但它們會在 stderr 上顯示,並且每行都有一個 '#' 字首。)

$ 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 <command>。有關更多命令,請執行 gomote help

構建器型別

可用的構建器型別遵循一定的結構,大致為 $GOBRANCH-($REPO-)?$GOOS-$GOARCH(_$OS)-$EXTRA

關於這些名稱的一些有用說明。

  • 不同的 $GOBRANCH 主要修改預裝工具的版本,例如引導 Go 工具鏈。
  • 帶有 $REPO 的構建器型別將在工作根目錄的 tip-of-tree 處下載指定的儲存庫。

直接除錯構建代理

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”子命令顯式管理,但有幾種快捷方式可以使在大多數情況下不需要這樣做。

  • create 命令可以使用 -new-group 標誌為例項建立新組。
  • 如果 GOMOTE_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)

安卓

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。

訪問許可權

自 2025 年 1 月起,對擁有 Approvers 訪問許可權的貢獻者將自動授予 gomote 訪問許可權。

2022 年 8 月,部署了一個新基礎設施,需要移除之前批准使用者的所有 gomote 訪問許可權。如果您仍需要訪問許可權,請重新申請。

要請求對 gomote 服務的訪問許可權,請提交一個新問題 (https://golang.org.tw/issue/new?title=access:+&body=See+https://golang.org.tw/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 的一部分。