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 存储库的内容推送到实例并安装引导工具链。您同步的存储库将出现在 $WORKDIRgo 子目录中(所有 gomote 操作的默认目录)。引导工具链将始终进入 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>,例如 [email protected]

实例可以在命名组中进行管理,并且命令将广播到组中的所有实例。

-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 命令接受 -setup 标志,该标志还推送 GOROOT 并为实例运行相应的 make.bash 等效项。

示例

$ 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 连接到机器,这些 envvars 可能很方便

$ 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://golang.ac.cn/issue/new?title=access:+&body=See+https://golang.ac.cn/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 的一部分。