Jenkins推送镜像至GCP Artifact Registry遇400错误求助
问题排查与解决
核心错误分析
这个400错误本质是Docker请求Artifact Registry的Bearer Token时被拒绝,通常和认证配置、权限或镜像路径异常有关。
排查方向及修复方案
1. 移除重复认证步骤,避免配置冲突
你的Pipeline同时使用了gcloud auth configure-docker和手动docker login两种认证方式,二者都会修改Docker的认证配置,很容易导致冲突。建议保留其中一种即可,推荐用gcloud的方式更简洁:
修改Push阶段代码,移除手动docker login步骤:
stage('Push Docker Image') { steps { script { // 无需重复执行docker login,依赖之前configure-docker的配置直接推送 sh "docker push ${ARTIFACT_REGISTRY_URL}:${env.BUILD_NUMBER}" } } }
2. 验证服务账号权限
确保gcp-poc服务账号拥有Artifact Registry Writer权限(roles/artifactregistry.writer):
- 登录GCP控制台找到该服务账号
- 进入「权限」页面,确认已分配对应的角色
- 若未分配,在项目或Artifact Registry仓库的权限设置中,添加角色
Artifact Registry > Artifact Registry Writer
3. 检查ARTIFACT_REGISTRY_URL格式
确认ARTIFACT_REGISTRY_URL是完整的仓库路径,正确格式应为:us-east4-docker.pkg.dev/[GCP_PROJECT_ID]/[ARTIFACT_REGISTRY_REPO_NAME]
如果仅写了区域域名(如us-east4-docker.pkg.dev),或项目ID/仓库名称错误,会导致推送路径无效,触发400错误。
4. 清理Docker认证缓存(可选)
如果之前的认证配置有残留,可在Pipeline开头添加清理步骤:
stage('Pre-Clean') { steps { sh "rm -rf ~/.docker/config.json || true" } }
完整修改后的Pipeline片段参考
stage('Build Docker Image') { steps { script { dir('lil-node-app') { sh "docker build -t ${ARTIFACT_REGISTRY_URL}:${env.BUILD_NUMBER} ." } } } } stage('Authenticate to Artifact Registry') { steps { script { withCredentials([file(credentialsId: 'gcp-poc', variable: 'GOOGLE_APPLICATION_CREDENTIALS')]) { sh "gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS" sh "gcloud auth configure-docker us-east4-docker.pkg.dev --quiet" } } } } stage('Push Docker Image') { steps { script { sh "docker push ${ARTIFACT_REGISTRY_URL}:${env.BUILD_NUMBER}" } } }
内容的提问来源于stack exchange,提问作者jef chang
相关产品推荐
相关产品推荐

