Align Custom Tekton Pipelines with 3.15
This page applies if you maintain your own Tekton pipeline library β custom Pipeline resources referenced from CodebaseBranch.spec.pipelines, typically modeled on the platform's shipped pipelines (see Create and Use Custom Tekton Pipelines). The edp-tekton 0.27.0 chart shipped with 3.15 changes several contracts such pipelines rely on. Every item below can be applied before the platform upgrade β each change is compatible with both the 3.14 (0.26) and 3.15 (0.27) releases β so custom pipelines keep working through the upgrade instead of breaking with it.
What Changed for Pipeline Authorsβ
- ServiceAccount resolution. Webhook-triggered PipelineRuns no longer run as the privileged
tektonServiceAccount. The interceptor reads theapp.edp.epam.com/service-accountannotation from the Pipeline named inCodebaseBranch.spec.pipelines.{build,review}and passes it to the trigger templates; a missing annotation, a missing Pipeline, or any lookup error silently falls back totekton.defaultServiceAccount(tekton-unprivilegedβ no role bindings and no mounted API token). See Upgrade v3.14 to 3.15, Step 2. - The
tektonServiceAccount's Role was narrowed. It loses access toconfigmaps,codebases(broad reads),cdpipelines,stages,applicationsets, andtaskruns; those capabilities moved to the newtekton-cdandtekton-securityaccounts bound only to the CD and security trigger templates. Annotating a custom pipeline withtektontherefore does not restore its pre-3.15 permissions. - Build trigger templates pass fewer parameters. The
gitshaparameter is no longer passed to build PipelineRuns (GitHub and Bitbucket), and the Jira parameters (TICKET_NAME_PATTERN,JIRA_ISSUE_METADATA_PAYLOAD,JIRA_SERVER) are no longer passed by any provider's build template. Thepush-to-jiraTask was removed entirely. - Status voting was consolidated. Shipped pipelines vote on
$(tasks.fetch-repository.results.commit)β the commit the clone actually checked out β and report the final status through a single unguarded finally task driven byPIPELINE_STATUS: $(tasks.status), which also reports cancelled and timed-out runs the legacy success/failure task pair silently missed.
Migration Checklistβ
1. Annotate every custom Pipeline with a dedicated ServiceAccountβ
Create a ServiceAccount per pipeline family, scoped to what the pipelines actually need, and annotate both build and review Pipelines:
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: my-app-build
annotations:
app.edp.epam.com/service-account: my-team-pipelines
The annotation is inert on 0.26 (trigger templates there hardcode tekton), so it can be merged ahead of the upgrade. Do not skip review pipelines whose tasks call the Kubernetes API β without the annotation they run as tekton-unprivileged after the upgrade and fail with authorization errors.
2. Audit the ServiceAccount's RBAC against real task API callsβ
Walk every task your pipelines reference and list its Kubernetes API calls (kubectl invocations including --subresource, tkn, client libraries), then grant exactly those. Typical needs for build pipelines modeled on the shipped ones: codebasebranches get and codebasebranches/status get/patch (version bumping), codebaseimagestreams get/list/patch (image stream tags), taskruns list (wait-style tasks). Do not point custom pipelines at tekton and assume parity β its Role no longer covers configmaps, cdpipelines, stages, applicationsets, or taskruns.
3. Carry the credential channels the tekton ServiceAccount providedβ
RBAC is not the only thing the old ServiceAccount carried. Mirror the relevant channels onto the dedicated account, or image pushes fail even with perfect RBAC:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-team-pipelines
annotations:
# ECR via IRSA: same role as kaniko.roleArn in the pipelines-library values
eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<KANIKO_ROLE>
secrets:
# non-ECR registries: Tekton creds-init merges this into the step's docker config
- name: kaniko-docker-config
imagePullSecrets:
- name: <pull-secret-if-used>
On EKS, also extend the IAM role's trust policy with the new ServiceAccount (system:serviceaccount:<namespace>:my-team-pipelines) β the annotation alone does not authenticate.
4. Fix the trigger template parameter contractβ
Audit custom build pipelines for parameters the 0.27 templates no longer pass:
- A required
gitshaparameter (nodefault) fails every build run at admission after the upgrade withpipelineRun missing parameters: [gitsha]. Migrate to the shipped pattern: remove the parameter and vote on$(tasks.fetch-repository.results.commit)in the status tasks. Consuming the clone'scommitresult also orders the status task after the clone and skips it structurally when nothing was cloned, replacing any manualwhenguards. Review pipelines keepgitshaβ the review templates still pass it. - Remove or default the Jira parameters (
TICKET_NAME_PATTERN,JIRA_ISSUE_METADATA_PAYLOAD,JIRA_SERVER) and drop anypush-to-jiratask references β the Task no longer exists.
Both fixes are safe on 0.26: Tekton explicitly ignores extra PipelineRun parameters, so templates still passing the old values do no harm.
5. Sequence the cutoverβ
The two mechanisms activate at different times, and mixing them up breaks pipelines before the upgrade:
serviceAccountNamepinned in your own TriggerTemplates, CronJobs, or tasks that create PipelineRuns switches the moment your chart deploys β those ServiceAccounts and their RBAC must be complete on day one.- The Pipeline annotation waits for the
0.27interceptor β webhook-triggered build/review runs stay ontektonuntil the platform upgrade completes.
Consequently, if you move RoleBindings from tekton to the new account (for example a namespace-admin binding used by e2e tasks), keep tekton as a second subject until the upgrade lands, then remove it. Dropping it early revokes access from runs that still execute as tekton.
Verificationβ
CodebaseBranch.spec.pipelines.{build,review}is populated for every codebase using custom pipelines β the interceptor resolves the annotation through that map, and an empty map silently downgrades runs totekton-unprivileged.- After the upgrade, a webhook-triggered run shows the dedicated account in
spec.taskRunTemplate.serviceAccountName. - A build run votes the commit status on the cloned commit and reports a final status even when cancelled.