设置服务帐号权限

本页面介绍了 Cloud Build 服务帐号的工作方式,以及如何授予服务帐号对其他项目的访问权限。

什么是 Cloud Build 服务帐号?

Cloud Build 使用服务帐号执行您的构建,该帐号是代表您执行构建的特殊 Google 帐号。Cloud Build 服务帐号的电子邮件地址为 [PROJECT_NUMBER]@cloudbuild.gserviceaccount.com

您可以通过 Cloud Console 的 IAM 菜单查看项目的服务帐号。

启用 Cloud Build API 后,系统会自动创建服务帐号并向该服务帐号授予项目的 Cloud Build Service Account 角色。此角色足以完成多项任务,包括:

  • 从项目的 Cloud Source Repository 中提取代码
  • 从项目拥有的任何 Cloud Storage 存储分区下载文件
  • 在 Cloud Logging 中保存构建日志
  • 将 Docker 映像推送到 Container Registry
  • 从 Container Registry 中拉取基本映像

服务帐号仅在执行构建时执行这些操作。例如,服务帐号不会从 Cloud Source Repository 中提取代码,除非您指示它这样做。

授予其他访问权限

服务帐号的默认权限不允许该帐号执行某些操作,例如部署到 App EngineCloud Functions,管理 Compute EngineGoogle Kubernetes Engine 资源,或者访问 Cloud Storage 存储分区。

您可以通过授予帐号其他 IAM 角色来让服务帐号执行这些操作。

要将 IAM 角色授予 Cloud Build 服务帐号,请执行以下操作

  1. 打开 Cloud Build 的“设置”页面:

    打开 Cloud Build 的“设置”页面

    您将会看到服务帐号权限页面:

    “服务帐号权限”页面的屏幕截图

  2. 将您要添加的角色的状态设置为启用

从其他 Google Cloud 项目中拉取私有映像

您可以授予服务帐号从另一个 Cloud Platform 项目拉取私有映像的权限,前提是服务帐号能够访问该项目。例如,您可能想在项目 A 中执行可以从项目 B 拉取映像的构建。

gsutil

如需向您的服务帐号授予这些权限,请在您的 shell 或终端窗口中运行以下命令:

  1. 找到注册表的 Cloud Storage 存储分区名称。为此,请列出各存储分区:

    gsutil ls
    

    您的 Container Registry 存储分区网址将列为 gs://artifacts.[PROJECT_ID].appspot.comgs://[STORAGE_REGION].artifacts.[PROJECT_ID].appspot.com

  2. 向项目 A 的服务帐号授予读取项目 B 的对象的权限:

    gsutil acl ch -r -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:R \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    
  3. 向项目 A 的服务帐号授予读取项目 B 存储分区的权限:

    gsutil acl ch -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:R \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    
  4. 更新项目 B 的默认 ACL,以便项目 A 的服务帐号对执行上述步骤 1 和 2 后创建的对象拥有读取权限:

    gsutil defacl ch -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:R \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    

其中:

  • [STORAGE_REGION] 是注册表托管映像的多区域asiaeuus)位置。
  • [PROJECT_NUMBER_A] 是项目 A 的项目编号。
  • [PROJECT_ID_B] 是项目 B 的项目 ID。

控制台

如需了解如何使用 Cloud Console 授予权限,请参阅创建和管理访问控制列表

将私有映像推送到其他 Google Cloud 项目

您可以授予服务帐号将私有映像推送到另一个 Cloud Platform 项目的权限,前提是服务帐号能够访问该项目。例如,您可能想在项目 A 中执行可以将映像推送到项目 B 的构建。

gsutil

如需向您的服务帐号授予这些权限,请在您的 shell 或终端窗口中运行以下命令:

  1. 找到注册表的 Cloud Storage 存储分区名称。为此,请列出各存储分区:

    gsutil ls
    

    您的 Container Registry 存储分区网址将列为 gs://artifacts.[PROJECT_ID].appspot.comgs://[STORAGE_REGION].artifacts.[PROJECT_ID].appspot.com

  2. 向项目 A 的服务帐号授予更新项目 B 的对象的权限:

    gsutil acl ch -r -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:W \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    
  3. 向项目 A 的服务帐号授予写入项目 B 存储分区的权限:

    gsutil acl ch -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:W \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    
  4. 更新项目 B 的默认 ACL,以便项目 A 的服务帐号对执行上述步骤 1 和 2 后创建的对象拥有写入权限:

    gsutil defacl ch -u [PROJECT_NUMBER_A]@cloudbuild.gserviceaccount.com:W \
        gs://artifacts.[PROJECT_ID_B].appspot.com
    

其中:

  • [STORAGE_REGION] 是注册表托管映像的多区域asiaeuus)位置。
  • [PROJECT_NUMBER_A] 是项目 A 的项目编号。
  • [PROJECT_ID_B] 是项目 B 的项目 ID。

控制台

如需了解如何使用 Cloud Console 授予权限,请参阅创建和管理访问控制列表

问题排查

如果在构建日志中发现 403(拒绝访问)错误,请尝试按照以下步骤操作:

  • 停用 Cloud Build API 并重新启用。这样做可以向服务帐号重新授予对项目的访问权限。
  • 再次运行上述命令。

后续步骤