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
相关产品推荐
相关产品推荐

