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

Tekton CI/CD流水线分任务配置多服务账号修复构建403报错

问题根因

403报错由三个配置错误共同导致:

  • 你之前在PipelineRun层级全局绑定了Git专用ServiceAccount,虽然尝试把GCP密钥加到这个SA的secret列表里,但Tekton只会自动挂载带tekton.dev/git-*注解的Git凭据、以及docker-registry类型的镜像仓库凭据,普通opaque类型的GCP密钥不会被自动注入到任务容器,Gradle进程根本读不到认证信息。
  • 就算密钥被挂载进容器,你也没有配置GOOGLE_APPLICATION_CREDENTIALS环境变量指定凭据路径,Google Artifact Registry的Gradle插件找不到密钥文件,拉取私有依赖时直接返回403。
  • 没有使用Tekton的单任务级ServiceAccount绑定能力,所有任务共用一个SA,既不符合权限最小化要求,也没法给不同任务匹配对应认证凭据。

前置校验:先确认你存在gcp-secret里的GCP服务账号,已经被授予目标Artifact Registry仓库的Artifact Registry Reader角色,否则凭据配置正确也会报权限不足。

修复步骤

1. 创建构建任务专属的GCP服务账号

单独创建只用于拉取GCP AR私有依赖的ServiceAccount,和Git克隆用的SA完全隔离:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gcp-ar-service-account
  namespace: tekton-pipelines
secrets:
  - name: gcp-secret

2. 修改Pipeline定义,给每个任务单独绑定专属SA

给代码克隆任务绑定Git专用SA,给构建任务绑定GCP专用SA,同时显式挂载GCP密钥到容器内、配置凭据路径环境变量,修改后的Pipeline.yaml如下:

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: fetebird-discount
spec:
  params:
    - name: repo-url
      type: string
      description: The git clone repository url
  workspaces:
    - name: shared-workspace
  tasks:
    - name: clone-repository
      taskRef:
        name: git-clone
      # 代码克隆任务单独绑定Git专属SA
      serviceAccountName: git-service-account
      workspaces:
        - name: output
          workspace: shared-workspace
      params:
        - name: url
          value: "$(params.repo-url)"
        - name: deleteExisting
          value: "true"
    - name: build
      taskRef:
        name: gradle
      runAfter:
        - "clone-repository"
      # 构建任务单独绑定GCP AR专属SA
      serviceAccountName: gcp-ar-service-account
      params:
        - name: TASKS
          value: build
        - name: GRADLE_IMAGE
          value: docker.io/library/gradle:jdk17-alpine@sha256:dd16ae381eed88d2b33f977b504fb37456e553a1b9c62100b8811e4d8dec99ff
        # 指定GCP凭据路径,让AR插件自动读取认证
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/gcp-cred/gcs-config
      workspaces:
        - name: source
          workspace: shared-workspace
      # 给构建步骤挂载GCP密钥
      stepTemplate:
        volumeMounts:
          - name: gcp-cred-volume
            mountPath: /var/run/secrets/gcp-cred
            readOnly: true
      volumes:
        - name: gcp-cred-volume
          secret:
            secretName: gcp-secret

3. 调整PipelineRun配置,删除全局SA绑定

现在每个任务已经单独指定了专属SA,不需要在PipelineRun层级配置全局SA,避免覆盖任务级配置,修改后的pipeline-run.yaml如下:

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: run-pipeline
  namespace: tekton-pipelines
spec:
  # 删除原有的全局serviceAccountName配置
  pipelineRef:
    name: fetebird-discount
  workspaces:
    - name: shared-workspace
      persistentVolumeClaim:
        claimName: fetebird-discount-pvc
  params:
    - name: repo-url
      value: git@bitbucket.org:anandjaisy/discount.git

4. 异常排查

如果配置完还是报403,逐一检查以下项:

  • GCP Secret里的私钥格式是否正确,私钥头尾的标识行必须单独占行,换行符不能被错误转义
  • build.gradle里配置的Artifact Registry Gradle插件版本是否兼容JDK17,老版本插件存在凭据读取兼容问题,升级到稳定版即可
  • 确认GCP服务账号的角色绑定范围覆盖了你实际拉取的Artifact Registry仓库,不要绑定到错误的项目或仓库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:03:12