gcloud gitlab ci 权限“artifactregistry.repositories.downloadArtifacts”被拒绝

问题描述 投票:0回答:1

我一直在用头撞墙来解决这个问题,只是不确定我错过了什么。我正在尝试完成 gitlab 管道上的配置,以推送到我使用 helm 管理的 GKE 集群。然而,当我尝试提取存储在 Google 工件注册表中的图表时,我不断收到 403 权限被拒绝的消息,即使我已经为我正在使用的服务帐户添加了足够的权限。

我按照文档中的指示设置了服务帐户此处,这是在 gcloud 控制台中具有权限的现有服务帐户:

在 .gitlab-ci.yml 的最后阶段,我连接到 gcloud 服务帐户,获取显示连接和工件注册表中现有图像的响应,从那里 helm 更新图表,但是一旦我尝试使用 helm拉出图表,我得到了 403。我的方法基于谷歌的说明here

gitlab-ci.yml 最后阶段:

Deploy-Helm:
  stage: deploy
  image: kiwigrid/gcloud-kubectl-helm
  only: [dev-test]
  script:
    - echo "connecting to gcloud"
    - gcloud auth activate-service-account ${GCLOUD_SERVACCT} --key-file ${GCLOUD_SERVACCT_KEY}
    - gcloud config set project ${GCLOUD_PROJECT}
    - gcloud artifacts docker images list ${GCLOUD_REPO}
    - echo "pull chart from artifact reg"
    - helm pull oci://${GCLOUD_REPO}:0.1.0 \
      --version 1.0.0 \
      --untar
    - helm chart export helm-repo/project \
      --destination ./install
    - echo "Deploying Helm..."  
    - helm upgrade demotest ./install -n demotest -f ./install/values-test.yaml

在管道中,流程显示服务帐户已连接,图表图像已正确列出,但随后 helm 调用失败。

$ echo "connecting to gcloud"
connecting to gcloud
$ gcloud auth activate-service-account ${GCLOUD_SERVACCT} --key-file ${GCLOUD_SERVACCT_KEY}
Activated service account credentials for: [gitlab-c292ecdff7c3bcd6dd4f68@octodemo-2802.iam.gserviceaccount.com]
$ gcloud config set project octodemo-2802
Updated property [core/project].
$ gcloud artifacts docker images list us-west2-docker.pkg.dev/octodemo-2802/octodemo-helm-repo
Listing items under project octodemo-2802, location us-west2, repository octodemo-helm-repo.
IMAGE                                                              DIGEST                                                                   CREATE_TIME          UPDATE_TIME
us-west2-docker.pkg.dev/octodemo-2802/octodemo-helm-repo/octodemo  sha256:ff4a6206e799a3a74a2f58d0c9dcb32219a12afac492967977063a91bc602045  2023-08-24T19:45:20  2023-08-24T19:45:20
$ echo "pull chart from artifact reg"
pull chart from artifact reg
$ helm pull oci://us-west2-docker.pkg.dev/octodemo-2802/octodemo-helm-repo/octodemo@sha256:ff4a6206e799a3a74a2f58d0c9dcb32219a12afac492967977063a91bc602045 \ --version 1.0.0 \ --untar
Error: GET "https://us-west2-docker.pkg.dev/v2/octodemo-2802/octodemo-helm-repo/octodemo/tags/list": GET "https://us-west2-docker.pkg.dev/v2/token?scope=repository%3Aoctodemo-2802%2Foctodemo-helm-repo%2Foctodemo%3Apull&service=us-west2-docker.pkg.dev": unexpected status code 403: denied: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/octodemo-2802/locations/us-west2/repositories/octodemo-helm-repo" (or it may not exist)

我对我在这里错过的东西感到迷失。非常感谢任何指导。

gitlab-ci gcloud
1个回答
0
投票

因此,如果其他人遇到此问题并陷入困境,问题是 helm 依赖 docker 进行身份验证,即使服务帐户拥有所需的所有访问权限并且已连接。另外,ci 进程不喜欢 helm pull 命令中的 \ ,我不知道为什么,但我不断收到“错误:非绝对 URL 应该采用 repo_name/path_to_chart 的形式,得到:”错误。一旦我删除了 \ 并将其放入行中,一切就清楚了。另外几点,如果使用 --untar 和 helm pull 则不需要导出,我建议使用 --untardir 来指定它导出到的位置,即使如此,它仍然将图像名称作为您列出的任何内容的子文件夹,这对于 helm 安装/升级很重要。最后,这是基于我的无知,只需确保所有集群连接、身份验证和 helm 部署命令都处于同一阶段,因为它们在不同的容器中运行,并且不会识别另一个阶段完成的内容,这也意味着您要么使用所需服务的基本负载构建一个映像,使用 docker hub 中的映像(默认情况下 gitlab 从其中提取)或采用另一种方式。 (也许还有另一种方法将结果从一个阶段连接到另一个阶段,但这是我的解决方案)。以下是更新阶段:

 Deploy-Helm:
  stage: deploy
  image: kiwigrid/gcloud-kubectl-helm
  only: [dev-test]
  script:
    - echo "connecting to gcloud"
    - gcloud auth activate-service-account ${GCLOUD_SERVACCT} --key-file ${GCLOUD_SERVACCT_KEY}
    - gcloud config set project ${GCLOUD_PROJECT}
    - gcloud artifacts docker images list ${GCLOUD_REPO}
    - gcloud auth configure-docker us-west2-docker.pkg.dev
    - echo "pull chart from artifact reg"
    - helm pull oci://${GCLOUD_REPO} --version 0.1.0 --untar --untardir ./install
    - echo "Deploying Helm..."  
    - helm upgrade demotest ./install/octodemo -n demotest -f ./install/octodemo/values-test.yaml
© www.soinside.com 2019 - 2024. All rights reserved.