如果您未指定服务账号,Cloud Build 可能会自动 选择一个服务账号来代表您执行构建。此服务账号 可能对您的用例拥有过于宽泛的权限,例如 Cloud Source Repositories 以及项目中的任何 Cloud Storage 存储桶。
为了提高项目的安全状况并减少错误配置或恶意用户的潜在影响,我们建议您遵循最小权限原则。根据此原则,您可以分配给每个服务账号 权限和角色限定为其执行的任务。例如,您可以 使用一个服务账号构建映像并将其推送到 Artifact Registry,如下所示 Google Cloud 博客上的博文。
准备工作
-
Enable the Cloud Build and IAM APIs.
如果您打算使用此账号创建和管理凭据, 创建短期有效凭据的示例,启用 IAM Service Account Credentials API。
创建一个服务账号(如果您尚未创建)。
授予 IAM 权限
如需允许 build 访问其需要连接到的服务,您必须授予一些角色和权限:
打开 Cloud Build 的“设置”页面:
您将看到服务账号权限标签页:
从下拉列表中选择要分配其角色的服务账号 更改。
将您要添加的角色的状态设置为启用。
如果此处未列出构建流水线所需的角色,您可以授予 更多角色。
您可以详细了解 请参阅配置对 Cloud Build 的访问权限 资源以及 Cloud Build IAM 的完整列表 角色和权限。
设置构建日志
当您为 build 指定自己的服务账号时,必须存储您的 build Cloud Logging 或用户创建的 Cloud Storage 存储桶中。您 无法将您的日志存储在默认日志存储桶中。
如需将日志存储在 Cloud Storage 存储桶中,请按照将构建日志存储在用户创建的存储桶中中的说明进行操作。制造商 请确保您没有在日志存储桶上设置保留政策 阻止 Cloud Build 将构建日志写入存储桶。
要在 Cloud Logging 中存储构建日志,请授予 Logs Writer (
roles/logging.logWriter
) 角色分配给服务账号。如需详细了解构建日志的存储位置,请参阅选择存储位置 存储构建日志。
使用配置文件执行构建
如需使用配置文件手动运行构建,请执行以下操作:
在项目根目录中,创建一个名为
cloudbuild.yaml
或cloudbuild.json
的Cloud Build 构建配置文件。添加
serviceAccount
字段和首选日志记录设置。如果您将构建日志存储在 Cloud Logging 中,请添加
logging
字段并将字段的值设置为CLOUD_LOGGING_ONLY
。将构建日志存储在用户创建的 Cloud Storage 存储桶中:
- 添加
logging
字段并将其值设置为GCS_ONLY
。 - 添加
logsBucket
字段,并将其值设置为您的 Cloud Storage 存储桶位置。
- 添加
以下示例将 Cloud Build 配置为使用 用户指定的服务账号,并将构建日志配置为 用户创建的 Cloud Storage 存储桶:
YAML
steps: - name: 'bash' args: ['echo', 'Hello world!'] logsBucket: 'LOGS_BUCKET_LOCATION' serviceAccount: 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT' options: logging: GCS_ONLY
JSON
{ "steps": [ { "name": "bash", "args": [ "echo", "Hello world!" ] } ], "logsBucket": "LOGS_BUCKET_LOCATION", "serviceAccount": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT", "options": { "logging": "GCS_ONLY" } }
将构建配置文件中的占位值替换为以下内容:
LOGS_BUCKET_LOCATION
:用于存储构建日志的 Cloud Storage 存储桶。例如gs://mylogsbucket
。PROJECT_ID
是 Google Cloud 项目的 ID 您运行构建的环境SERVICE_ACCOUNT
是您要为构建指定的服务账号的电子邮件地址或唯一 ID。 例如,一项服务 账号电子邮件地址的格式为:service-account-name@project-id.iam.gserviceaccount.com
。
使用构建配置文件启动构建:
gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
将上述命令中的占位值替换为以下内容:
CONFIG_FILE_PATH
是构建配置文件的路径。SOURCE_DIRECTORY
是源代码的路径或网址。
如果您未在
gcloud builds submit
命令中指定 CONFIG_FILE_PATH 和 SOURCE_DIRECTORY,Cloud Build 会假定构建配置文件和源代码位于当前工作目录中。
使用触发器执行 build
如需使用您自己的服务账号通过 Cloud Build 触发器执行构建,请设置首选日志记录选项,并在创建触发器时选择首选服务账号。
在构建配置文件中:
如果要将构建日志存储在 Cloud Logging 中,请将
logging
字段,并将该字段的值设置为CLOUD_LOGGING_ONLY
。将构建日志存储在用户创建的 Cloud Storage 存储桶中:
- 添加
logging
字段并将其值设置为GCS_ONLY
。 - 添加
logsBucket
字段,并将其值设置为您的 Cloud Storage 存储桶位置。
- 添加
以下示例展示了如何配置要存储的构建日志 存储在用户创建的 Cloud Storage 存储桶中:
YAML
steps: - name: 'bash' args: ['echo', 'Hello world!'] logsBucket: 'LOGS_BUCKET_LOCATION' options: logging: GCS_ONLY
JSON
{ "steps": [ { "name": "bash", "args": [ "echo", "Hello world!" ] } ], "logsBucket": "LOGS_BUCKET_LOCATION", "options": { "logging": "GCS_ONLY" } }
将
LOGS_BUCKET_LOCATION
替换为 用于存储构建日志的 Cloud Storage 存储桶。例如gs://mylogsbucket
。指定要用于构建触发器的服务账号:
控制台
如需使用 Google Cloud 控制台中的“触发器”页面运行构建, 用户指定的服务账号必须与您的 build 位于同一项目中 触发。如需将触发器与跨项目服务账号一起使用,请创建 使用
gcloud
工具构建触发器。在服务账号字段中,指定您的服务账号。如果您 未指定服务账号,则 Cloud Build 使用 默认服务账号。
点击创建以保存您的构建触发器。
gcloud
创建构建触发器时,请使用
--service-account
标志指定服务账号。在以下示例中,gcloud
命令会创建一个用于从 Git 代码库拉取代码的构建触发器:gcloud builds triggers create github \ --name=TRIGGER_NAME \ --repo-name=REPO_NAME \ --repo-owner=REPO_OWNER \ --branch-pattern=BRANCH_PATTERN --build-config=BUILD_CONFIG_FILE --service-account=SERVICE_ACCOUNT --project=BUILD_PROJECT
将构建配置文件中的占位值替换为以下内容:
TRIGGER_NAME
是构建触发器的名称。REPO_NAME
是代码库的名称。REPO_OWNER
是代码库所有者的用户名。BRANCH_PATTERN
是代码库中要在其上调用构建的分支名称。TAG_PATTERN
是代码库中要在其上调用构建的标记名称。BUILD_CONFIG_FILE
是构建配置文件的路径。SERVICE_ACCOUNT
是您在以下国家/地区的服务账号 格式为/projects/PROJECT_ID/serviceAccounts/ACCOUNT_ID_OR_EMAIL
。BUILD_PROJECT
是您要 启动构建。
跨项目设置
如果用户指定的服务账号所属的项目不同于 项目中,请授予必要的访问权限:
在具有用户指定的服务账号的项目中,确保未强制执行
iam.disableCrossProjectServiceAccountUsage
组织政策限制条件。默认情况下,系统会强制执行此限制条件。要停用此功能,请执行以下操作: 组织政策限制条件,请运行以下命令,其中 SERVICE_ACCOUNT_PROJECT_ID 是包含您的用户指定服务账号的项目:gcloud resource-manager org-policies disable-enforce \ iam.disableCrossProjectServiceAccountUsage \ --project=SERVICE_ACCOUNT_PROJECT_ID
在具有用户指定的服务账号的项目中,
roles/iam.serviceAccountTokenCreator
角色 您所在项目的 Cloud Build 服务代理 运行 build:gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member="serviceAccount:BUILD_SERVICE_AGENT" \ --role="roles/iam.serviceAccountTokenCreator"
将命令中的占位值替换为以下内容:
SERVICE_ACCOUNT_PROJECT_ID
: 项目(包含用户指定的服务账号。BUILD_SERVICE_AGENT
:服务代理的电子邮件 ID,格式为service-BUILD_PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com
,其中BUILD_PROJECT_NUMBER
是您运行 build 的项目的项目编号。您可以从 项目设置页面。
限制:
您的 Google Cloud 项目必须位于 Google Cloud 组织中。
您必须在命令行中使用
gcloud builds submit
或gcloud builds triggers create
。如需使用 Google Cloud 控制台中的“触发器”页面,请执行以下操作: 用户指定的服务账号和构建触发器必须位于同一 项目。
后续步骤
- 详细了解 Cloud Build IAM 角色和权限。
- 了解服务账号变更如何影响您运行构建的方式。