You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Cloud Build中使用jib-maven-plugin推送镜像到GAR的权限问题

问题描述

该问题看似是GCP权限配置问题,但多次调整权限后始终无法解决。

使用com.google.cloud.tools:jib-maven-plugin将Spring Boot项目打包为容器并推送到Google Artifact Registry(GAR)。本地执行完全正常,但在Google Cloud Build中运行maven构建时失败,提示缺少artifactregistry.repositories.downloadArtifacts权限。

根据Google官方文档说明,该权限是默认开启的。

推送目标是GAR的Docker镜像仓库,将目标切换为已废弃的Google Container Registry时,Cloud Build运行正常无权限问题;构建过程也能正常从同项目下另一个GAR的Maven仓库下载Jar包,说明该Maven GAR的权限配置无异常。

已验证本地使用个人用户凭证执行maven构建可正常推送镜像到GAR,排除了jib插件配置、GAR配置出错的可能。

已尝试的操作如下:

  • 为Cloud Build默认服务账号添加对应角色(按官方说明这些角色本就默认配置):downloadArtifacts权限包含在Artifact Registry Reader角色中,同时添加了该角色与Artifact Registry Writer角色。
  • 切换到自定义构建服务账号(简称BSA),并为该账号配置了上述所有角色。
  • 在目标GAR的权限配置中将BSA添加为主体,授予对应角色。
  • 临时为BSA授予Owner角色(该配置无法长期保留)。

所有操作都返回相同的权限拒绝错误,还在Cloud Build yaml中添加了执行gcloud info的步骤,确认构建确实使用了配置了对应角色的BSA。

补充信息:大部分构建任务使用jib,只有一个任务使用Spotify插件生成本地Docker镜像后再推送到仓库,该任务运行正常。说明问题仅出在jib上,Cloud Build环境下jib无法读取到凭证,但本地环境下凭证读取正常。

补充错误日志:

Failed to execute goal com.google.cloud.tools:jib-maven-plugin:1.6.1:build (build-and-push-docker-image) on project knifethrower: Build image failed, perhaps you should make sure you have permissions for australia-southeast1-docker.pkg.dev/redacted/bonanza-platform/knifethrower and set correct credentials. See https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-should-i-do-when-the-registry-responds-with-forbidden-or-denied for help: Unauthorized for australia-southeast1-docker.pkg.dev/redacted/bonanza-platform/knifethrower: 403 Forbidden
[ERROR] {"errors":[{"code":"DENIED","message":"Permission \"artifactregistry.repositories.downloadArtifacts\" denied on resource \"projects/redacted/locations/australia-southeast1/repositories/bonanza-platform\" (or it may not exist)"}]}
[ERROR] -> [Help 1]

jib版本为最新的3.1.4。

后续补充:又尝试了两个方案:1.在maven构建前添加步骤执行gcloud auth configure-docker --quiet --verbosity=debug australia-southeast1-docker.pkg.dev,生成/builder/home/.docker/config.json文件,还将该文件复制到/root/.docker目录,无效果;2.配置$DOCKER_CONFIG环境变量指向/builder/home/.docker目录,仍然报错。

两种操作都返回相同错误,执行gcloud auth configure-docker...时返回的日志如下:

WARNING: `docker` not in system PATH.
`docker` and `docker-credential-gcloud` need to be in the same PATH in order to work correctly together.
gcloud's Docker credential helper can be configured but it will not work until this is corrected.
Adding credentials for: australia-southeast1-docker.pkg.dev
Docker configuration file updated.
INFO: Display format: "default"

该日志只是提示未安装docker(实际确实未安装),但凭证文件已正常生成,且jib不依赖Docker本身,仅需要凭证,所以该警告不应该影响运行,但问题仍然没有解决。


解决方案

方案一(无需修改项目配置,适配性最高)

在Cloud Build的Maven执行命令中直接传入Jib认证参数,绕开自动凭证查找逻辑:

mvn clean package jib:build \
  -Djib.to.auth.username=oauth2accesstoken \
  -Djib.to.auth.password=$(gcloud auth print-access-token) \
  -Djib.from.auth.username=oauth2accesstoken \
  -Djib.from.auth.password=$(gcloud auth print-access-token)

参数说明:

  • jib.to.auth 对应目标GAR镜像仓库的认证配置
  • jib.from.auth 对应基础镜像拉取的认证配置,若基础镜像存储在同项目GAR中必须配置
  • gcloud auth print-access-token 会直接获取当前构建服务账号的有效访问令牌,无需额外生成凭证文件

方案二(项目内永久配置,无需每次修改构建命令)

在pom.xml中修改Jib插件配置,通过环境变量传入访问令牌:

<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>jib-maven-plugin</artifactId>
  <version>3.1.4</version>
  <configuration>
    <from>
      <auth>
        <username>oauth2accesstoken</username>
        <password>${env.GAR_ACCESS_TOKEN}</password>
      </auth>
    </from>
    <to>
      <image>australia-southeast1-docker.pkg.dev/redacted/bonanza-platform/knifethrower</image>
      <auth>
        <username>oauth2accesstoken</username>
        <password>${env.GAR_ACCESS_TOKEN}</password>
      </auth>
    </to>
  </configuration>
</plugin>

对应Cloud Build yaml配置如下:

steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        echo "export GAR_ACCESS_TOKEN=$(gcloud auth print-access-token)" > /workspace/access_token.sh
  - name: 'gcr.io/cloud-builders/mvn'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        source /workspace/access_token.sh
        mvn clean package jib:build

原理说明

之前的gcloud auth configure-docker方案无效,是因为生成的Docker配置文件中使用了gcloud凭证助手,Jib在无Docker环境下默认不会调用外部凭证助手执行认证。直接传入访问令牌的方式完全绕开了该依赖,不需要安装Docker即可正常完成GAR认证。


内容的提问来源于stack exchange,提问作者Roger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:48:02