从 github 操作访问 gcloud 中服务帐户的问题

时间:2021-05-28 06:16:45

标签: docker gcloud github-actions

我对 github 操作和 gcloud 很陌生。我无法运行 github-CI/CD-Pipeline,因为由于访问限制,我无法将任何 docker 映像推送到 google Cloud Registry。

到目前为止我做了什么:

  • 我在 github 上托管了一个 Quarkus 应用
  • 我使用 github 操作来构建 Maven 项目和 docker 镜像
  • 我在 google Cloud 中创建了一个项目,并添加了一个用于 github 操作的服务帐户。登录似乎有效:
Run google-github-actions/setup-gcloud@master
/usr/bin/tar xz --warning=no-unknown-keyword -C /home/runner/work/_temp/ac85f67a-89fa-4eb4-8d30-3f6379124ec2 -f /home/runner/work/_temp/de491940-a4b1-4a15-bf0a-95d563e68362
/opt/hostedtoolcache/gcloud/342.0.0/x64/bin/gcloud --quiet config set project ***
Updated property [core/project].
Successfully set default project
/opt/hostedtoolcache/gcloud/342.0.0/x64/bin/gcloud --quiet auth activate-service-account github-actions@***.iam.gserviceaccount.com --key-file -
Activated service account credentials for: [github-actions@***.iam.gserviceaccount.com]
  • 如果我现在尝试推送 docker 镜像,我会收到以下(预期的)错误消息:
Run docker push "$GCR_HOSTNAME/$PROJECT_ID/$IMAGE:$IMAGE_TAG"
The push refers to repository [eu.gcr.io/***/***]
715ac1ae8693: Preparing
435cfe5f5775: Preparing
313d03d71d4d: Preparing
c5c8d86ccee1: Preparing
1b0f2238925b: Preparing
144a43b910e8: Preparing
4a2bc86056a8: Preparing
144a43b910e8: Waiting
4a2bc86056a8: Waiting
denied: Token exchange failed for project '***'. Caller does not have permission 'storage.buckets.get'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
Error: Process completed with exit code 1.
  • 接下来,我打开了 Google Cloud Console 并创建了一个具有必要权限的自定义角色(IAM 和管理员 -> 角色 -> 创建角色)。

  • 然后,我无法将我的新自定义角色分配给服务帐户(IAM 和管理员 -> 服务帐户 -> 管理访问权限 -> 添加成员)。我将服务帐户的电子邮件地址用作“新成员”,但无法选择我刚刚创建的自定义角色。 我在这里遗漏了什么?

  • 我在某处读到我还可以将服务帐户添加为成员(IAM 和管理员 -> IAM -> 添加)。我再次使用服务帐户的电子邮件地址作为“新成员”。这次我可以选择我的自定义角色。 与第一种方法有何不同?

  • 无论如何,如果我再次尝试运行 github 操作,现在我会收到以下错误:

Run docker push "$GCR_HOSTNAME/$PROJECT_ID/$IMAGE:$IMAGE_TAG"
The push refers to repository [eu.gcr.io/***/***]
c4f14c9d3b6e: Preparing
fe78d438e8e2: Preparing
843fcae4a8f4: Preparing
dcf8cc80cedb: Preparing
45e8815b101d: Preparing
144a43b910e8: Preparing
4a2bc86056a8: Preparing
144a43b910e8: Waiting
4a2bc86056a8: Waiting
denied: Access denied.
Error: Process completed with exit code 1.

错误信息是不同的,所以我猜服务帐户的权限以某种方式起作用了,但我仍然无法成功。 我错过了哪些步骤?

非常感谢任何帮助。非常感谢!

1 个答案:

答案 0 :(得分:1)

一种调试方法是在本地主机上为服务帐户创建一个密钥,配置您的脚本|gcloud 以使用服务帐户作为其凭据,然后手动尝试推送。

一个直接的问题可能是您没有针对 Google Container Registry (GCR) 进行身份验证。 GCR 实现了 Docker 的注册表 API,您需要使用其中一种机制来authenticate之前您可以与注册表交互。

注意事项:

  1. 我认为您不需要创建自定义角色。您有 2 个选择。要么(首选)专门为 CI/CD 作业创建一个帐户,并为其授予所需的最少角色集,包括 storage.buckets.get。我认为您可以从 roles/storage.admin (link) 开始,然后再完善。
  2. 您可以授予角色,例如roles/storage.admin 到项目,在这种情况下,权限适用于所有 Cloud Storage 资源或特定存储桶,在这种情况下,权限仅适用于存储桶及其对象。
  3. 服务帐号在 GCP 中具有双重角色。作为身份和资源(可以被其他身份使用)。这可能会令人困惑。