向GCP Artifact Registry发布Maven构件时遇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

