本页介绍了如何使用 Cloud Build 构建和测试 Go 应用、将工件上传到 Artifact Registry、生成来源信息,以及在 Cloud Storage 中保存测试日志。
准备工作
本页面的说明假定您熟悉 Go。此外:
-
Enable the Cloud Build, Cloud Run, and Artifact Registry APIs.
- 如需运行此页面中的
gcloud
命令,请安装 Google Cloud CLI。 - 准备好 Go 项目。
- 在 Artifact Registry 中拥有一个 Go 代码库。如果您还没有代码库,请创建一个新代码库。
- 如果您要在 Cloud Storage 中存储测试日志,请在 Cloud Storage 中创建存储分区。
配置服务账号
本文档中的示例使用用户指定的服务账号。如需创建 Cloud Build 使用的服务账号,请在 Google Cloud CLI 中运行以下命令:
gcloud iam service-accounts create cloud-build-go \
--description="Build and test Go applications" \
--display-name="Cloud Build Go" \
--project="PROJECT_ID"
默认的计算服务账号(由 Cloud Run 使用)需要有权充当新服务账号。首先,确定项目中的计算服务账号的名称:
gcloud iam service-accounts list --filter="email:-compute@developer.gserviceaccount.com"
接下来,授予 Service Account User (roles/iam.serviceAccountUser
) 角色:
gcloud iam service-accounts add-iam-policy-binding \
COMPUTE_SERVICE_ACCOUNT_EMAIL \
--member="serviceAccount:cloud-build-go@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
将 COMPUTE_SERVICE_ACCOUNT_EMAIL
替换为上一个命令输出的默认计算服务账号电子邮件地址。
配置 IAM 权限
确保您拥有所需的权限:
如需获得在 Cloud Build 中执行构建所需的权限,请让您的管理员为您授予构建服务账号的 Cloud Build Service Account (roles/cloudbuild.builds.builder
) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
如需获得在 Artifact Registry 中存储构建工件所需的权限,请让您的管理员为您授予构建服务账号的 Artifact Registry Writer (roles/artifactregistry.writer
) IAM 角色。
如需获得在 Logging 中存储测试日志所需的权限,请让您的管理员为您授予 build 服务账号的 Storage Object Creator (roles/storage.objectCreator
) IAM 角色。
如需获得将应用部署到 Cloud Run 所需的权限,请让管理员为您授予 build 服务账号的 Cloud Run Developer (roles/run.developer
) IAM 角色。
配置 Go 构建
Docker Hub 中的公共 golang
映像支持使用 Go 模块进行构建。将此映像用作 Cloud Build 配置文件中的构建步骤,这样您就可以调用映像中的 go
命令。传递到此构建步骤的参数会直接传递到 golang
工具,让您可以在此映像中运行任何 go
命令。
本部分介绍了如何从 cloud-build-samples Git 代码库为 Go 应用创建示例 build 配置文件。构建配置文件包含构建应用、添加单元测试,以及测试通过后部署应用的步骤。
如需构建 Go 示例应用,请执行以下操作:
配置单元测试:如果您已在应用中定义单元测试,则可以通过在构建步骤中添加以下字段将 Cloud Build 配置为运行测试:
name
:将此字段的值设置为golang
以将 Docker Hub 中的 golang 映像用于您的任务。entrypoint
:将此字段的值设置为/bin/bash
。这样,您就可以直接从构建步骤运行多行 bash 命令。args
:构建步骤的args
字段采用一系列参数,并将其传递给name
字段引用的映像。在以下示例中,args
字段采用参数进行:- 运行测试日志格式化程序以下载测试日志输出。
- 打印日志输出。
- 将测试结果保存在
sponge.log
中。 将
sponge.log
中的结果输出到 JUNIT XML 文件。JUNIT XML 文件的名称是使用与您的 build 相关联的提交 ID 的短版本构建的。后续构建步骤会将此文件中的日志保存到 Cloud Storage。steps: # Run tests and save to file - name: golang:1.23 entrypoint: /bin/bash args: - -c - | go install github.com/jstemmer/go-junit-report/v2@latest 2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
上传到 Artifact Registry:在配置文件中,使用
goModules
字段指定 Artifact Registry 中的应用路径和 Go 代码库:# Upload Go module to artifact registry artifacts: goModules: repositoryName: 'repositoryName' repositoryLocation: 'location' repositoryProjectId: 'projectId' sourcePath: 'sourcePath' modulePath: 'appPath' moduleVersion: 'version'
替换以下值:
可选:启用来源生成功能
Cloud Build 可以生成可验证的软件工件的供应链级别 (SLSA) 构建来源元数据,以帮助保护您的持续集成流水线。
如需启用来源生成,请将
requestedVerifyOption: VERIFIED
添加到配置文件中的options
部分。构建完成后,您可以在 Artifact Registry 中查看代码库详情。
您还可以查看 build 来源元数据和验证来源。
将测试日志保存到 Cloud Storage:您可以配置 Cloud Build,以便通过指定现有存储分区位置和测试日志的路径在 Cloud Storage 中存储所有测试日志。
以下构建步骤会将保存在 JUNIT XML 文件中的测试日志存储到 Cloud Storage 存储分区:
# Save test logs to Google Cloud Storage artifacts: objects: location: gs://$_BUCKET_NAME/ paths: - ${SHORT_SHA}_test_log.xml
以下代码段展示了针对上述步骤的完整构建配置文件:
steps: # Run tests and save to file - name: golang:1.23 entrypoint: /bin/bash args: - -c - | go install github.com/jstemmer/go-junit-report/v2@latest 2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml # Store golang modules in Google Artifact Registry artifacts: goModules: repositoryName: 'repositoryName' repositoryLocation: 'location' repositoryProject_id: 'projectId' sourcePath: 'sourcePath' modulePath: 'appPath' moduleVersion: 'version'
使用 gcloud CLI 启动构建或创建构建触发器:
Google Cloud CLI
gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \
--substitutions=_AR_REPO_NAME="AR_REPO_NAME"
Build 触发器
按照创建构建触发器中的步骤操作。在“替换变量”字段中,您还必须提供工件注册库的名称以及用于存储测试日志的 Cloud Storage 存储分区的名称。
后续步骤
- 了解如何在 Compute Engine 上执行蓝绿部署。
- 了解如何排查构建错误。