如果您未指定服务账号,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 的“设置”页面:
您将会看到服务账号权限标签页:
从下拉列表中,选择您要更改角色的服务账号。
将您要添加的角色的状态设置为启用。
如果您需要为 build 流水线授予的角色未在此处列出,您可以在 IAM 配置页面中授予其他角色。
如需详细了解构建通常需要的角色,请参阅配置对 Cloud Build 资源的访问权限以及 Cloud Build IAM 角色和权限的完整列表。
设置构建日志
为构建指定您自己的服务账号时,您必须将构建日志存储在 Cloud Logging 或用户创建的 Cloud Storage 存储分区中。您不能将日志存储在默认日志存储分区中。
如需将日志存储在 Cloud Storage 存储分区中,请按照将构建日志存储在用户创建的存储分区中中的说明进行操作。请确保您未在日志存储分区上设置保留政策,因为这可能会阻止 Cloud Build 将构建日志写入存储分区。
如需将构建日志存储在 Cloud Logging 中,请向服务账号授予 Logs Writer (
roles/logging.logWriter
) 角色。如需详细了解存储构建日志的位置,请参阅选择存储构建日志的位置。
使用配置文件执行 build
如需使用配置文件手动运行 build,请执行以下操作:
在项目根目录中,创建一个名为
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
替换为用于存储 build 日志的 Cloud Storage 存储分区。例如gs://mylogsbucket
。指定要用于构建触发器的服务账号:
控制台
如需使用 Google Cloud 控制台中的“触发器”页面运行 build,用户指定的服务账号必须与 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
在包含用户指定的服务账号的项目中,为运行构建所在项目的 Cloud Build 服务代理授予
roles/iam.serviceAccountTokenCreator
角色:gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member="serviceAccount:BUILD_SERVICE_AGENT" \ --role="roles/iam.serviceAccountTokenCreator"
将命令中的占位值替换为以下内容:
SERVICE_ACCOUNT_PROJECT_ID
:包含用户指定的服务账号的项目的项目 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
在命令行中启动 build。如需使用 Google Cloud 控制台中的“触发器”页面,用户指定的服务账号和 build 触发器必须位于同一项目中。
后续步骤
- 详细了解 Cloud Build IAM 角色和权限。
- 了解服务账号变更对运行 build 的方式有何影响。