本页介绍了如何配置 Cloud Build 以将构建的工件存储在 Artifact Registry 代码库中。
准备工作
- 如果目标代码库不存在于 Artifact Registry 中,请创建新代码库。
如果 Cloud Build 和代码库位于不同的项目中,或者您使用的是用户指定的服务账号来运行 build,请向包含代码库的项目中的 build 服务账号授予 Artifact Registry Writer 角色。
默认的 Cloud Build 服务账号可以对同一项目中的代码库执行以下操作: Google Cloud
- 上传和下载工件
- 在 Artifact Registry 中创建 gcr.io 仓库
配置 Docker 构建
授予对目标代码库的权限后,您便可以配置 build。
如需配置 build,请执行以下操作:
在构建配置文件中,添加用于构建和标记映像的步骤。
steps: - name: 'gcr.io/cloud-builders/docker' args: [ 'build', '-t', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}', '.' ] images: - '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}'
此代码段使用 Cloud Build 替换项。如果您想使用相同的构建配置文件将映像推送到不同环境(例如测试、预演或生产环境)的代码库,则此方法非常有用。
${_LOCATION}
、${_REPOSITORY}
和${_IMAGE}
是代码库位置、代码库名称和映像的用户定义替换项。您可以在构建时为这些变量指定值。$PROJECT_ID
是一个默认替代变量,Cloud Build 会使用 build 的 Google Cloud 项目 ID 对其进行解析。- 如果您运行
gcloud builds submit
命令,Cloud Build 会使用 gcloud 会话中的有效项目 ID。 - 如果您使用的是构建触发器,Cloud Build 会使用运行 Cloud Build 的项目的 ID。
或者,您也可以使用用户定义的替换项(而非
$PROJECT_ID
),以便在构建时指定项目 ID。- 如果您运行
准备好运行 build 后,请为用户定义的替换项指定值。例如,此命令会进行以下替换:
us-east1
(针对代码库位置)my-repo
:表示代码库名称my-image
表示映像名称
gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_LOCATION="us-east1",_REPOSITORY="my-repo",_IMAGE="my-image" .
配置 Go build
授予对目标代码库的权限后,您便可以配置 build。以下说明介绍了如何配置 build 以将 Go 模块上传到 Go 代码库。
如需配置 build,请执行以下操作:
如需在 build 中将 Go 模块上传到 Go 代码库,请将以下步骤添加到 build 配置文件中:
steps: - name: gcr.io/cloud-builders/gcloud args: - 'artifacts' - 'go' - 'upload' - '--project=$PROJECT_ID' - '--location=${_LOCATION}' - '--repository=${_REPOSITORY}' - '--module-path=${_MODULE_PATH}' - '--version=$TAG_NAME'
构建配置文件包含 Cloud Build 替换项。如果您想使用相同的构建配置文件将软件包上传到不同环境(例如测试、预演或生产环境)的代码库,则此方法非常有用。
${_LOCATION}
、${_REPOSITORY}
和${_MODULE_PATH}
是用户为代码库位置、代码库名称和模块路径定义的替换项。您可以在构建时为这些变量指定值。$PROJECT_ID
和$TAG_NAME
是 Cloud Build 会替换为以下内容的默认替代变量:$PROJECT_ID
会替换为 build 的 Google Cloud 项目 ID。- 如果您运行
gcloud builds submit
命令,Cloud Build 会使用 gcloud 会话中的有效项目 ID。 - 如果您使用的是构建触发器,Cloud Build 会使用运行 Cloud Build 的项目的 ID。
或者,您也可以使用用户定义的替换项(而非
$PROJECT_ID
),以便在构建时指定项目 ID。- 如果您运行
$TAG_NAME
会替换为标记的名称,以支持 Go 惯例,即使用 Git 标记作为版本号。
如需从 Go 代码库安装该软件包,请将以下步骤添加到 build 配置文件中,以便:
- 将代码库位置中的区域 Artifact Registry 端点添加到
.netrc
文件。 - 运行凭据帮助程序以刷新 OAuth 令牌。
- 运行
go run
命令。您还可以将其更改为go build
以编译模块、go test
以运行测试或go mod tidy
以下载依赖项。
对于
go
命令步骤,GOPROXY
会设置为托管专用依赖项的 Artifact Registry 制品库。如果模块具有公共依赖项,您可以将公共代理添加到以英文逗号分隔的GOPROXY
列表中。steps: - name: golang entrypoint: go args: ['run', 'github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0', 'add-locations', '--locations=${_LOCATION}'] env: # Set GOPROXY to the public proxy to pull the credential helper tool - 'GOPROXY=https://proxy.golang.org' - name: golang entrypoint: go args: ['run', 'github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0', 'refresh'] env: # Set GOPROXY to the public proxy to pull the credential helper tool - 'GOPROXY=https://proxy.golang.org' - name: golang entrypoint: go args: ['run', '.'] env: - 'GOPROXY=https://${_LOCATION}-go.pkg.dev/${_PROJECT_ID}/${_REPOSITORY}' options: env: # Disable GO sumdb checks for private modules. - 'GONOSUMDB=${_MODULE_PATH}'
- 将代码库位置中的区域 Artifact Registry 端点添加到
准备好运行 build 后,请为用户定义的替换项指定值。例如,此命令会进行以下替换:
us-east1
(针对代码库位置)my-project
是项目 IDmy-repo
:表示代码库名称example.com/greetings
用于模块路径
gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_LOCATION="us-east1",_PROJECT_ID="my-project",_REPOSITORY="my-repo",_MODULE_PATH="example.com/greetings" .
配置 Java build
授予对目标代码库的权限后,您便可以配置 build。以下说明介绍了如何配置 build 以将 Java 软件包上传到 Maven 代码库。
如需配置 build,请执行以下操作:
为 Maven 设置身份验证。请务必在
pom.xml
文件中指定正确的目标项目和代码库。在 Cloud Build 构建配置文件中,添加使用 Maven 上传软件包的步骤:
steps: - name: gcr.io/cloud-builders/mvn args: ['deploy']
构建配置文件准备就绪后,使用以下命令启动构建:
gcloud builds submit
配置 Node.js 构建
授予对目标代码库的权限后,您便可以配置 build。以下说明介绍了如何配置 build 以将 Node.js 软件包上传到 npm 代码库。
如需配置 build,请执行以下操作:
将您的 Artifact Registry 代码库添加到 Node.js 项目的
.npmrc
文件中。该文件位于package.json
文件所在的目录中。@SCOPE:registry=https://LOCATION-npm.pkg.dev/PROJECT_ID/REPOSITORY //LOCATION-npm.pkg.dev/PROJECT_ID/REPOSITORY/:always-auth=true
将脚本添加到项目的
package.json
文件中,用于刷新访问令牌以便与代码库进行身份验证。"scripts": { "artifactregistry-login": "npx google-artifactregistry-auth" }
在构建配置文件中,添加将软件包上传到代码库的步骤。
steps: - name: gcr.io/cloud-builders/npm args: ['run', 'artifactregistry-login'] - name: gcr.io/cloud-builders/npm args: ['publish', '${_PACKAGE}']
${_PACKAGE}
是 Cloud Build 替换项,表示您的 Node.js 项目目录。您可以在运行命令以运行 build 时指定目录。例如,以下命令会从名为
src
的目录中上传软件包:gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_PACKAGE="src" .
配置 Python build
授予对目标代码库的权限后,您便可以配置 build。以下说明介绍了如何配置 build 以将 Python 软件包上传到 Python 代码库,并使用 pip 安装该软件包。
如需构建和容器化 Python 应用,然后将其推送到 Docker 代码库,请参阅 Cloud Build 文档中的构建 Python 应用。
如需配置 build,请执行以下操作:
在包含 Cloud Build 构建配置文件的目录中,创建一个名为
requirements.txt
的文件,并添加以下依赖项:twine keyrings.google-artifactregistry-auth
- Twine 用于将软件包上传到 Artifact Registry。
- keyrings.google-artifactregistry-auth 是 Artifact Registry 密钥库后端,用于为 pip 和 Twine 处理与 Artifact Registry 的身份验证。
如需在构建过程中将 Python 软件包上传到 Python 代码库,请将以下步骤添加到构建配置文件中:
steps: - name: python entrypoint: pip args: ["install", "-r", "requirements.txt", "--user"] - name: python entrypoint: python args: - '-m' - 'twine' - 'upload' - '--repository-url' - 'https://${_LOCATION}-python.pkg.dev/$PROJECT_ID/${_REPOSITORY}/' - 'dist/*'
在此代码段中,第一步是安装 Twine 和 Artifact Registry 密钥库后端。第二步是将构建的 Python 文件上传到
dist
子目录。如果requirements.txt
和已构建的 Python 文件的路径与代码段不匹配,请调整相应路径。代码库路径包含 Cloud Build 替换项。如果您想使用相同的构建配置文件将软件包上传到不同环境(例如测试、预演或生产环境)的代码库,则此方法非常有用。
${_LOCATION}
和${_REPOSITORY}
是用户为代码库位置、代码库名称和软件包名称定义的替换项。您可以在构建时为这些变量指定值。$PROJECT_ID
是一个默认替代变量,Cloud Build 会使用 build 的 Google Cloud 项目 ID 对其进行解析。- 如果您运行
gcloud builds submit
命令,Cloud Build 会使用 gcloud 会话中的有效项目 ID。 - 如果您使用的是构建触发器,Cloud Build 会使用运行 Cloud Build 的项目的 ID。
或者,您也可以使用用户定义的替换项(而非
$PROJECT_ID
),以便在构建时指定项目 ID。- 如果您运行
如需从 Python 代码库安装该软件包,请向构建配置文件中添加一个用于运行
pip install
命令的步骤。steps: - name: python entrypoint: pip args: - 'install' - '--index-url' - 'https://${_LOCATION}-python.pkg.dev/$PROJECT_ID/${_REPOSITORY}/simple/' - '${_PACKAGE}' - '--verbose'
此代码段包含一个额外的
${_PACKAGE}
替换项,用于替换软件包名称。准备好运行 build 后,请为用户定义的替换项指定值。例如,此命令会进行以下替换:
us-east1
(针对代码库位置)my-repo
:表示代码库名称my-package
:表示软件包名称
gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_LOCATION="us-east1",_REPOSITORY="my-repo",_PACKAGE="my-package" .