Annotations

Annotations are the integration contract between your pipelines and the relay. They are plain Kubernetes annotations on the PipelineRun/TaskRun, normally set once in your TriggerTemplate from webhook payload values β€” your pipelines themselves never change.

All keys live under the tekton.dev/tekton-events-relay. prefix.

Minimum set per action

What each action type needs, at a glance (keys shown without the prefix):

Actionscm.providerrepo coordinatesΒΉscm.commit-shascm.pr-numberscm.issue-numberscm.discussion-number
commit_statusβœ…βœ…βœ…β€”β€”β€”
commit_commentβœ…βœ…βœ…β€”β€”β€”
check_runβœ…βœ…βœ…β€”β€”β€”
pr_commentβœ…βœ…β€”βœ…β€”β€”
label (on a PR)βœ…βœ…β€”βœ…β€”β€”
label (on an issue)βœ…βœ…β€”β€”βœ…β€”
issue_commentβœ…βœ…β€”β€”βœ…β€”
discussion_commentβœ…βœ…β€”β€”β€”βœ…
deployment_statusβœ…βœ…βœ…β€”β€”β€”

ΒΉ Repo coordinates vary per provider: GitHub / Gitea / SourceHut use repo-owner + repo-name; GitLab uses repo-owner + repo-name or repo-id; Bitbucket Cloud uses repo-workspace + repo-name; Bitbucket Server uses repo-project + repo-name; Azure DevOps uses repo-org + repo-project + repo-name.

scm.context is optional everywhere β€” it names the check (e.g. tekton/ci) and doubles as the environment name for deployment_status.

Reference

AnnotationRequiredUsed byDescription
tekton.dev/tekton-events-relay.scm.provideryes (for SCM actions)all SCMWhich configured SCM instance handles this run. Must match an instance name from your config (e.g. github, gitlab-main). Events without it are skipped by SCM handlers.
tekton.dev/tekton-events-relay.scm.commit-shayes for commit_status, commit_comment, check_runall SCMThe commit being built.
tekton.dev/tekton-events-relay.scm.repo-ownerprovider-dependentGitHub, Gitea, GitLab, SourceHutRepository owner / org / user.
tekton.dev/tekton-events-relay.scm.repo-nameprovider-dependentall SCMRepository name.
tekton.dev/tekton-events-relay.scm.repo-idalternativeGitLabNumeric project ID (alternative to owner+name).
tekton.dev/tekton-events-relay.scm.repo-workspaceprovider-dependentBitbucket CloudWorkspace slug.
tekton.dev/tekton-events-relay.scm.repo-projectprovider-dependentBitbucket Server, Azure DevOpsProject key/name.
tekton.dev/tekton-events-relay.scm.repo-orgprovider-dependentAzure DevOpsOrganization.
tekton.dev/tekton-events-relay.scm.pr-numberfor PR actionsall SCMPull/merge request number. Enables pr_comment, label, merge-style actions.
tekton.dev/tekton-events-relay.scm.issue-numberfor issue actionsGitHub, GiteaIssue number for issue_comment / label.
tekton.dev/tekton-events-relay.scm.discussion-numberfor discussionsGitHubDiscussion number for discussion_comment.
tekton.dev/tekton-events-relay.scm.contextnoall SCMLogical check name (e.g. tekton/ci). Also used as the environment name by deployment actions. Default behavior varies per action.
tekton.dev/tekton-events-relay.scm.api-base-urlnoall SCMPer-run API base URL override (self-hosted instances).
tekton.dev/tekton-events-relay.jira.issue-keyfor Jira actionsJiraIssue key (e.g. PROJ-123) the comment / transition actions act on. Extracted by the TriggerBinding from the branch name or PR/MR title.

Wiring annotations in a TriggerTemplate

The values come straight from the webhook interceptor params:

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: github-pr
spec:
  params:
    - name: repo-owner
    - name: repo-name
    - name: revision
    - name: pr-number
  resourcetemplates:
    - apiVersion: tekton.dev/v1
      kind: PipelineRun
      metadata:
        generateName: pr-ci-
        annotations:
          tekton.dev/tekton-events-relay.scm.provider: "github"
          tekton.dev/tekton-events-relay.scm.repo-owner: "$(tt.params.repo-owner)"
          tekton.dev/tekton-events-relay.scm.repo-name: "$(tt.params.repo-name)"
          tekton.dev/tekton-events-relay.scm.commit-sha: "$(tt.params.revision)"
          tekton.dev/tekton-events-relay.scm.pr-number: "$(tt.params.pr-number)"
          tekton.dev/tekton-events-relay.scm.context: "tekton/ci"
      spec:
        pipelineRef:
          name: ci-pipeline

And the matching TriggerBinding for a GitHub pull request webhook:

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
  name: github-pr
spec:
  params:
    - name: repo-owner
      value: $(body.repository.owner.login)
    - name: repo-name
      value: $(body.repository.name)
    - name: revision
      value: $(body.pull_request.head.sha)
    - name: pr-number
      value: $(body.pull_request.number)

How annotations reach TaskRuns

Tekton propagates PipelineRun annotations to its child TaskRuns, so per-task events (e.g. with context_per_task) carry the same routing information automatically. You annotate once, at PipelineRun creation.

Design rule

The relay deliberately never requires changes inside pipelines β€” no extra Tasks, steps, sidecars or results. If a feature needs an input your pipeline doesn’t naturally produce, the answer is always an annotation set at trigger time, or data the CloudEvent already carries (state, timestamps, commit SHA, Tekton results that already exist).