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

向GCP Artifact Registry发布Maven构件时遇401未授权错误

排查GCP Artifact Registry发布401未授权问题

核心问题分析

你已挂载GCP凭证且能正常读取,但Gradle发布时返回401,主要从配置冲突、权限验证、凭证有效性三个维度排查:


1. 修复Task中Secret的硬编码引用

你的Gradle Task定义了GCP-SECRET参数,但volumes里的secret名称是硬编码的gcp-secret,导致参数无法生效(当前PipelineRun传值巧合匹配,但后续换secret会直接失败)。修改如下:

volumes:
  - name: empty-dir
    emptyDir: {}
  - name: gcp-secret
    secret:
      secretName: $(params.GCP-SECRET)  # 替换为参数引用

2. 解决GOOGLE_CREDENTIALS环境变量冲突

你同时在env中设置了凭证内容,又在脚本中覆盖为文件路径,导致Gradle插件可能出现解析混乱:

  • 方案A:保留文件路径方式(推荐)
    删除Task中env里的GOOGLE_CREDENTIALS配置,仅保留脚本中的导出:

    env:
      - name: GRADLE_USER_HOME
        value: "/home/gradle"
    # 移除以下GOOGLE_CREDENTIALS配置
    # - name: GOOGLE_CREDENTIALS
    #   valueFrom:
    #       secretKeyRef:
    #         name: gcp-secret
    #         key: gcp-config
    

    脚本里的export GOOGLE_CREDENTIALS=/etc/gcp-secret/gcp-config保持不变,确保Gradle读取文件中的完整凭证。

  • 方案B:直接使用凭证字符串
    删除脚本里的export GOOGLE_CREDENTIALS=/etc/gcp-secret/gcp-config,保留env中的配置,让Gradle直接读取环境变量中的JSON字符串。

3. 验证服务账号权限

确认GCP服务账号(对应secret中的凭证)拥有Artifact Registry写入权限:

  • 登录GCP控制台,给该账号绑定roles/artifactregistry.writer角色,或对目标仓库australia-southeast2-maven.pkg.dev/fetebird-cicd/common单独授予写入权限
  • 可通过本地命令验证权限有效性:
    gcloud auth activate-service-account --key-file=你的凭证文件.json
    gcloud artifacts repositories list --location=australia-southeast2
    # 尝试上传测试文件确认权限
    

4. 检查凭证格式完整性

虽然cat能打印内容,但需确保:

  • 凭证是完整的服务账号JSON格式,可用jq . 凭证文件.json验证格式有效性
  • 没有因Kubernetes Secret存储时的转义问题导致JSON损坏(比如换行符丢失)

5. 确认Gradle发布配置正确性

检查项目build.gradle中的Maven发布配置是否适配GCP Artifact Registry:

plugins {
    id 'maven-publish'
    id 'com.google.cloud.artifactregistry.gradle-plugin' version '2.1.2'
}

publishing {
    publications {
        maven(MavenPublication) {
            from components.java
        }
    }
    repositories {
        maven {
            url = uri('https://australia-southeast2-maven.pkg.dev/fetebird-cicd/common')
            credentials {
                username = '_json_key'
                password = file(System.getenv('GOOGLE_CREDENTIALS')).text
            }
        }
    }
}

若使用Artifact Registry官方插件,确保插件版本正确,且配置会自动读取GOOGLE_CREDENTIALS环境变量。

6. 验证Pod内文件读取权限

Gradle镜像默认以gradle用户(UID 1000)运行,可在脚本中添加ls -l /etc/gcp-secret/gcp-config查看文件权限,确保该用户有读取权限(默认secret挂载文件权限为644,root组,配合fsGroup:65532可正常读取)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:41:01