Skip to content

OCPEDGE-2815: tekton: add production and staging final pipelines#2884

Open
jeff-roche wants to merge 8 commits into
openshift:mainfrom
jeff-roche:konflux-final-pipelines
Open

OCPEDGE-2815: tekton: add production and staging final pipelines#2884
jeff-roche wants to merge 8 commits into
openshift:mainfrom
jeff-roche:konflux-final-pipelines

Conversation

@jeff-roche

@jeff-roche jeff-roche commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds two Konflux final pipelines to keep OLM catalog templates current across the release lifecycle, and a small supporting change to generate_catalog_template.sh:

  • operator-version-bump-production-final-pipeline — runs after a successful operator production release. Bumps OPERATOR_VERSION in release/container-build.args and opens a PR. Does not touch catalog templates directly; merging the PR triggers the normal build cascade (operator rebuild, then bundle rebuild) that eventually reaches the bundle's staging release.
  • catalog-candidate-update-staging-final-pipeline — runs after the lvm-operator-bundle component releases to staging. Regenerates both catalog templates via generate_catalog_template.sh and opens/updates a persistent PR if anything changed; skips cleanly if there's nothing new.
  • release/hack/generate_catalog_template.sh — candidate bundle tag listing and digest resolution now goes through the public quay.io/redhat-user-workloads/... tenant workload repo instead of registry.stage.redhat.io, avoiding the need for a staging registry pull secret in automation. Output image references still use the staging registry path.

Design notes

  • Both final pipelines authenticate as a GitHub App and create commits via the GitHub GraphQL createCommitOnBranch mutation rather than git push, so commits are signed/verified by GitHub without a separate signing key.
  • PRs opened by both pipelines are labeled approved/lgtm and titled with the NO-JIRA: prefix, matching this repo's existing mintmaker automation conventions.
  • The staging pipeline reuses a single persistent branch/PR (force-pushing updates) rather than opening a new PR on every staging release, to avoid PR pileup.
  • The staging pipeline mounts and merges the existing registry-redhat-io-docker and components-namespace-pull pull secrets to authenticate skopeo against both registry.redhat.io and the private Quay tenant repo in the same run.
  • An earlier design considered writing a placeholder tag into the candidate template for mintmaker to later resolve into a digest. That was dropped after confirming mintmaker's custom manager (and Konflux's native nudge system) only refresh digests that already exist — they don't resolve bare tags — so no pipeline ever writes a placeholder; the staging pipeline always writes a real, already-resolved digest.

Post-implementation steps (tracked in OCPEDGE-2815)

Provisioning the github-app-credentials secret and wiring both pipelines into their respective Konflux ReleasePlans is tracked separately, since that infrastructure lives outside this repo.

AI-Assisted Contribution

This PR was developed collaboratively with Claude Code. The two .tekton/ pipeline YAMLs were AI-generated based on human-directed design discussion (trigger model, auth approach, idempotency, PR-reuse strategy, signed-commit requirement). The generate_catalog_template.sh change was authored directly by the human contributor. All changes have been human-reviewed.

Testing

Both pipelines depend on live Konflux infrastructure (ReleasePlans, secrets) that hasn't been provisioned yet, so they haven't been run end-to-end. What was validated locally:

  • Both YAML files parse correctly and were checked against the existing .tekton/ conventions in this repo
  • Embedded bash scripts were linted with shellcheck (no real issues — only expected false positives from Tekton's $(results.x.path)/$(params.x) templating syntax, which shellcheck reads as literal command substitution)
  • Manual trace of script logic caught and fixed a real bug (trailing-newline loss from $(...) command substitution) and a missing Content-Type: application/json header on several REST calls

A manual test plan for each pipeline (post-secret-provisioning) is documented in a follow-up doc tracked internally.

Summary by CodeRabbit

  • New Features
    • Added automation to regenerate file-based catalog templates and create or update pull requests when catalog changes are detected.
    • Added automation to bump operator versions for production releases and create or update corresponding pull requests.
    • Automatically applies standard approval and review labels to generated pull requests.
  • Bug Fixes
    • Improved catalog template generation with stricter validation, more reliable digest resolution retries, and correct bundle source handling.
  • Documentation
    • Added Konflux and release-management documentation, plus an ADR for the new final-pipeline approach.
  • Refactor
    • Removed the legacy catalog build pipeline.

@openshift-ci openshift-ci Bot added the size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. label Jul 17, 2026
@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jeff-roche, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 38 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: b2f2bb2b-5b6d-4ecd-9082-8b3e6ccda648

📥 Commits

Reviewing files that changed from the base of the PR and between d1bf894 and 29e4230.

📒 Files selected for processing (10)
  • .tekton/catalog-build-pipeline.yaml
  • .tekton/catalog-candidate-update-staging-final-pipeline.yaml
  • .tekton/operator-version-bump-production-final-pipeline.yaml
  • docs/decisions/0013-konflux-final-pipelines-for-release-automation.md
  • docs/decisions/index.md
  • docs/konflux/README.md
  • docs/konflux/file-based-catalog.md
  • docs/konflux/operator-bundle-lifecycle.md
  • docs/konflux/release-management.md
  • release/hack/generate_catalog_template.sh

Walkthrough

Adds Konflux final pipelines for catalog candidate updates and operator version bumps, hardens catalog digest resolution, removes the obsolete catalog build pipeline, and documents the release automation and Konflux workflows.

Changes

Konflux release automation

Layer / File(s) Summary
Operator version bump pipeline
.tekton/operator-version-bump-production-final-pipeline.yaml
Computes and validates versions, creates signed commits, manages bump branches and pull requests, applies labels, and publishes results.
Catalog candidate update pipeline
.tekton/catalog-candidate-update-staging-final-pipeline.yaml
Regenerates catalogs, detects changes, creates signed candidate commits, manages pull requests, applies labels, and publishes results.
Catalog generation and digest resolution
release/hack/generate_catalog_template.sh
Uses Quay-based tag and candidate digest lookup, strict shell handling, target filtering, and bounded released-digest retries.
Release automation decision record
docs/decisions/0013-konflux-final-pipelines-for-release-automation.md, docs/decisions/index.md
Documents and indexes the Konflux final-pipeline decision.
Konflux build and release documentation
docs/konflux/*
Documents Konflux resources, catalog lifecycle, bundle pipelines, release management, dependency workflows, and security controls.
Obsolete catalog pipeline removal
.tekton/catalog-build-pipeline.yaml
Removes the previous catalog build Pipeline and task workflow.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

Catalog candidate update

sequenceDiagram
  participant FinalPipeline
  participant Registry
  participant GitHubAPI
  participant PullRequest
  FinalPipeline->>Registry: Regenerate catalog templates
  FinalPipeline->>GitHubAPI: Create signed catalog commit
  GitHubAPI->>PullRequest: Create or update candidate pull request
  FinalPipeline->>PullRequest: Apply labels
Loading

Operator version bump

sequenceDiagram
  participant FinalPipeline
  participant ReleaseBranch
  participant GitHubAPI
  participant PullRequest
  FinalPipeline->>ReleaseBranch: Read and validate operator version
  FinalPipeline->>GitHubAPI: Create signed version commit
  GitHubAPI->>PullRequest: Create or update bump pull request
  FinalPipeline->>PullRequest: Apply labels
Loading

Suggested reviewers: jaypoulz, jerpeter1

🚥 Pre-merge checks | ✅ 15
✅ Passed checks (15 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding production and staging Tekton final pipelines.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed No Ginkgo test files or titles were changed in this PR; the diff is limited to Tekton YAML, docs, and one shell script.
Test Structure And Quality ✅ Passed No Ginkgo test code is changed; the diff only touches Tekton YAML, docs, and one shell script, so this test-quality checklist is not applicable.
Microshift Test Compatibility ✅ Passed No new Ginkgo/e2e test files or test definitions were added; the PR diff only modifies release/hack/generate_catalog_template.sh.
Single Node Openshift (Sno) Test Compatibility ✅ Passed No new Ginkgo e2e tests were added; the PR only changes Tekton YAML, docs, and a shell script, so SNO compatibility is not applicable.
Topology-Aware Scheduling Compatibility ✅ Passed PASS: The PR only changes docs, Tekton pipelines, and a shell script; no Deployment/controller manifests or scheduling fields (affinity, nodeSelector, topologySpreadConstraints, PDBs) were added.
Ote Binary Stdout Contract ✅ Passed No Go/test-binary code changed; the PR only touches docs, Tekton YAML, and one release shell script, so the OTE stdout contract is unaffected.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed No new Ginkgo e2e tests were added; the PR changes only Tekton YAML, docs, and a shell script, with no It/Describe/Context/When additions.
No-Weak-Crypto ✅ Passed No MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, no custom crypto primitives, and the only crypto use is standard RSA/SHA-256 JWT signing via openssl.
Container-Privileges ✅ Passed Changed Tekton YAMLs have no privileged, hostPID/Network/IPC, allowPrivilegeEscalation, SYS_ADMIN, or explicit root settings; only an unrelated test fixture matched.
No-Sensitive-Data-In-Logs ✅ Passed PASS: The changed scripts read GitHub App secrets but never print them; logs are limited to versions, file paths, PR URLs, and generic errors.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@jeff-roche jeff-roche changed the title tekton: add production and staging final pipelines OCPEDGE-2815: tekton: add production and staging final pipelines Jul 17, 2026
@openshift-ci-robot

openshift-ci-robot commented Jul 17, 2026

Copy link
Copy Markdown

@jeff-roche: This pull request references OCPEDGE-2815 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the spike to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

Adds two Konflux final pipelines to keep OLM catalog templates current across the release lifecycle, and a small supporting change to generate_catalog_template.sh:

  • operator-version-bump-production-final-pipeline — runs after a successful operator production release. Bumps OPERATOR_VERSION in release/container-build.args and opens a PR. Does not touch catalog templates directly; merging the PR triggers the normal build cascade (operator rebuild, then bundle rebuild) that eventually reaches the bundle's staging release.
  • catalog-candidate-update-staging-final-pipeline — runs after the lvm-operator-bundle component releases to staging. Regenerates both catalog templates via generate_catalog_template.sh and opens/updates a persistent PR if anything changed; skips cleanly if there's nothing new.
  • release/hack/generate_catalog_template.sh — candidate bundle tag listing and digest resolution now goes through the public quay.io/redhat-user-workloads/... tenant workload repo instead of registry.stage.redhat.io, avoiding the need for a staging registry pull secret in automation. Output image references still use the staging registry path.

Design notes

  • Both final pipelines authenticate as a GitHub App and create commits via the GitHub GraphQL createCommitOnBranch mutation rather than git push, so commits are signed/verified by GitHub without a separate signing key.
  • PRs opened by both pipelines are labeled approved/lgtm and titled with the NO-JIRA: prefix, matching this repo's existing mintmaker automation conventions.
  • The staging pipeline reuses a single persistent branch/PR (force-pushing updates) rather than opening a new PR on every staging release, to avoid PR pileup.
  • The staging pipeline mounts and merges the existing registry-redhat-io-docker and components-namespace-pull pull secrets to authenticate skopeo against both registry.redhat.io and the private Quay tenant repo in the same run.
  • An earlier design considered writing a placeholder tag into the candidate template for mintmaker to later resolve into a digest. That was dropped after confirming mintmaker's custom manager (and Konflux's native nudge system) only refresh digests that already exist — they don't resolve bare tags — so no pipeline ever writes a placeholder; the staging pipeline always writes a real, already-resolved digest.

Post-implementation steps (tracked in OCPEDGE-2815)

Provisioning the github-app-credentials secret and wiring both pipelines into their respective Konflux ReleasePlans is tracked separately, since that infrastructure lives outside this repo.

AI-Assisted Contribution

This PR was developed collaboratively with Claude Code. The two .tekton/ pipeline YAMLs were AI-generated based on human-directed design discussion (trigger model, auth approach, idempotency, PR-reuse strategy, signed-commit requirement). The generate_catalog_template.sh change was authored directly by the human contributor. All changes have been human-reviewed.

Testing

Both pipelines depend on live Konflux infrastructure (ReleasePlans, secrets) that hasn't been provisioned yet, so they haven't been run end-to-end. What was validated locally:

  • Both YAML files parse correctly and were checked against the existing .tekton/ conventions in this repo
  • Embedded bash scripts were linted with shellcheck (no real issues — only expected false positives from Tekton's $(results.x.path)/$(params.x) templating syntax, which shellcheck reads as literal command substitution)
  • Manual trace of script logic caught and fixed a real bug (trailing-newline loss from $(...) command substitution) and a missing Content-Type: application/json header on several REST calls

A manual test plan for each pipeline (post-secret-provisioning) is documented in a follow-up doc tracked internally.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Jul 17, 2026
@openshift-ci
openshift-ci Bot requested review from jaypoulz and jerpeter1 July 17, 2026 17:10
@openshift-ci

openshift-ci Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: jeff-roche

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jul 17, 2026
@jeff-roche

Copy link
Copy Markdown
Contributor Author

These pipelines depend on https://redhat.atlassian.net/browse/DPP-21582 which will install the app I created to this repo so that we can add some credentials to konflux for the version bump and catalog regen automations

@jeff-roche

Copy link
Copy Markdown
Contributor Author

/hold for DPP app install approval since this relies on that.

@openshift-ci openshift-ci Bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Jul 17, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.tekton/catalog-candidate-update-staging-final-pipeline.yaml:
- Around line 70-75: Remove the obsolete components-namespace-pull secret
dependency from the pipeline: delete its volume definition, corresponding volume
mount, and any authentication merge referencing it. Keep the
registry-redhat-io-docker configuration and public Quay repository usage
unchanged.
- Around line 182-202: Update the GitHub API workflow around GITHUB_TOKEN
creation and the PR/ref/label operations through the completion output to use
curl --fail-with-body, so HTTP failures stop the pipeline instead of being
treated as successful responses. Validate required response fields, including a
non-empty token and valid PR URL/identifier, before publishing CHANGED=true or
reporting success; preserve the existing successful flow when all API responses
are valid.
- Around line 216-226: Add a signed-off-by trailer to the generated commit by
extending the GraphQL `message` object in the `CreateCommitOnBranch` mutation
with the required body field, while preserving the existing headline and commit
inputs.
- Around line 89-99: Update the tool installation steps around the skopeo and yq
downloads to avoid mutable or unverified artifacts: use a pinned tool image or
fixed release URLs, pin yq to an explicit version instead of querying latest,
and verify each downloaded binary against its published SHA256 checksum before
chmod or use. Keep the existing TOOL_DIR installation flow intact.
- Around line 66-76: Add a shared emptyDir volume for /workspace/tools in the
pipeline pod, then mount it at that path in both the install-tools and
update-and-pr steps so installed binaries are available across containers.

In @.tekton/operator-version-bump-production-final-pipeline.yaml:
- Around line 150-161: Update the branch handling around PR_BRANCH so it first
checks for the matching automation-created PR and verifies the existing branch
belongs to that PR before resetting it. If the branch exists without a matching
PR, fail the pipeline instead of force-resetting it; retain branch creation only
when no branch exists.
- Around line 134-148: Validate NEXT_VERSION after resolving the requested or
auto-incremented value and before writing the result, modifying NEW_CONTENT, or
constructing PR_BRANCH. Require a well-formed semantic version and ensure it is
strictly greater than CURRENT_VERSION; reject malformed, equal, or lower values
with a clear configuration error and stop the task. Use the existing version
components or an appropriate comparison method, and ensure the validated value
is safe for the sed expression and branch name.
- Around line 212-223: Update the PR creation and labeling curl calls in the
pipeline to use fail-on-HTTP-error behavior, then validate that the parsed
PR_URL/html_url and PR_NUMBER/number are non-empty and not null before applying
labels or writing results.PR_URL. Ensure any invalid API response causes the
step to fail rather than continuing with a missing PR reference.
- Around line 165-182: Update the GraphQL payload in the commit-creation block
to extend message beyond headline with a body describing the operator version
bump and a Signed-off-by trailer, using the contributor identity expected by
CONTRIBUTING.md. Keep the existing headline, branch, expectedHeadOid, and
fileChanges fields unchanged.

In `@release/hack/generate_catalog_template.sh`:
- Around line 4-6: Make the tag discovery and digest lookup commands in the
catalog template generation script fail explicitly when either registry query
fails. Validate the result of skopeo list-tags and the later digest lookup
before generating or writing any template updates, and stop execution rather
than allowing empty tag data or an empty “@” reference to be emitted.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: fdea3ba7-23d6-47a3-9d57-1f3c40cc007e

📥 Commits

Reviewing files that changed from the base of the PR and between e46f568 and 9cd388a.

📒 Files selected for processing (3)
  • .tekton/catalog-candidate-update-staging-final-pipeline.yaml
  • .tekton/operator-version-bump-production-final-pipeline.yaml
  • release/hack/generate_catalog_template.sh

Comment thread .tekton/catalog-candidate-update-staging-final-pipeline.yaml
Comment thread .tekton/catalog-candidate-update-staging-final-pipeline.yaml
Comment thread .tekton/catalog-candidate-update-staging-final-pipeline.yaml
Comment thread .tekton/catalog-candidate-update-staging-final-pipeline.yaml Outdated
Comment thread .tekton/catalog-candidate-update-staging-final-pipeline.yaml
Comment thread .tekton/operator-version-bump-production-final-pipeline.yaml
Comment thread .tekton/operator-version-bump-production-final-pipeline.yaml Outdated
Comment thread .tekton/operator-version-bump-production-final-pipeline.yaml
Comment thread .tekton/operator-version-bump-production-final-pipeline.yaml Outdated
Comment thread release/hack/generate_catalog_template.sh Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@release/hack/generate_catalog_template.sh`:
- Around line 59-61: Limit the retry loop around skopeo inspect in the
digest-generation flow to a finite number of attempts, incrementing and checking
a retry counter while preserving the existing delay between attempts. After the
maximum is reached, exit with a clear failure instead of continuing
indefinitely.
- Around line 2-14: Update the digests associative-array lookup in the script to
safely handle versions that have no populated key under set -u, using a
default-aware existence/value check before comparing or consuming the entry.
Also make TARGET_VERSIONS access tolerate being unset when running locally,
while preserving the existing behavior when it is provided.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 2e78631e-0a54-45dd-a6f0-6ef6f75e7a84

📥 Commits

Reviewing files that changed from the base of the PR and between 9cd388a and f57e400.

📒 Files selected for processing (3)
  • .tekton/catalog-candidate-update-staging-final-pipeline.yaml
  • .tekton/operator-version-bump-production-final-pipeline.yaml
  • release/hack/generate_catalog_template.sh
🚧 Files skipped from review as they are similar to previous changes (2)
  • .tekton/operator-version-bump-production-final-pipeline.yaml
  • .tekton/catalog-candidate-update-staging-final-pipeline.yaml

Comment thread release/hack/generate_catalog_template.sh
Comment thread release/hack/generate_catalog_template.sh
@openshift-ci openshift-ci Bot added size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. and removed size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Jul 20, 2026
jeff-roche and others added 7 commits July 20, 2026 16:30
Use quay.io/redhat-user-workloads/logical-volume-manag-tenant/lvm-operator-bundle
for tag listing and candidate digest resolution instead of
registry.stage.redhat.io, avoiding the need for a staging registry pull
secret in automation. The staging registry path is still used when
writing the candidate template's output image references.

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: Jeff Roche <jeroche@redhat.com>
Add two Konflux final pipelines to keep OLM catalog templates current
across the release lifecycle:

- operator-version-bump-production-final-pipeline: runs after a
  successful operator production release. Bumps OPERATOR_VERSION in
  release/container-build.args and opens a PR. Does not touch catalog
  templates; merging the PR triggers the normal build cascade (operator
  rebuild, then bundle rebuild) that eventually reaches the bundle's
  staging release.

- catalog-candidate-update-staging-final-pipeline: runs after the
  lvm-operator-bundle component releases to staging. Regenerates both
  catalog templates via generate_catalog_template.sh and opens or
  updates a persistent PR if anything changed; skips cleanly otherwise.

Both pipelines authenticate as a GitHub App and create commits via the
GitHub GraphQL createCommitOnBranch mutation so they are signed/verified
by GitHub without needing a separate signing key. PRs are labeled
approved/lgtm and titled with the NO-JIRA: prefix to match existing
automation conventions in this repo.

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: Jeff Roche <jeroche@redhat.com>
Both final pipelines used curl -sS without -f, so a failed GitHub App
token exchange, ref/PR/label call could leave the pipeline reporting
success with a null or missing PR reference. Add -f to the mutating
GitHub API calls and validate token/PR responses before continuing.

Also:
- Guard the operator-version-bump pipeline's next-version param: reject
  malformed or non-increasing values before they reach the file, sed
  expression, and branch name.
- Look up the automation's PR before deciding whether an existing
  bump-operator-version-* branch is safe to force-reset, instead of
  resetting whatever happens to already exist at that name.
- Add a commit body and Signed-off-by trailer to both pipelines'
  generated commits per CONTRIBUTING.md's commit conventions.
- Add errexit to generate_catalog_template.sh so a failed skopeo
  list-tags/inspect call stops the script instead of producing an
  empty or malformed catalog template; convert the released-digest
  retry loop to an until-loop so it keeps retrying correctly under
  errexit.

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: Jeff Roche <jeroche@redhat.com>
Add comprehensive documentation for the Konflux CI/CD system covering
build pipelines, release management, the file-based catalog lifecycle,
and operator bundle builds.

Assisted-by: Claude <noreply@anthropic.com>
Signed-off-by: Jeff Roche <jeroche@redhat.com>
…og version management

Signed-off-by: Jeff Roche <jeroche@redhat.com>
Limit the skopeo inspect retry loop to MAX_RETRIES (5) attempts instead
of looping indefinitely on persistent failures. Use default-aware
parameter expansion (+set) for digests associative array lookups and
TARGET_VERSIONS access so the script is safe under set -u and tolerates
running locally without TARGET_VERSIONS defined.

Assisted-by: Claude <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Nitpick comments (1)
release/hack/generate_catalog_template.sh (1)

45-45: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use pattern matching for literal substring searches.

Using quotes on the right-hand side of =~ forces a literal match and triggers ShellCheck warnings (SC2076). Standard glob pattern matching (!= *...*) is more idiomatic for checking if an item exists in a space-separated string.

♻️ Proposed refactor
-    if [[ -n "${TARGET_VERSIONS[*]+set}" ]] && ! [[ " ${TARGET_VERSIONS[*]} " =~ " ${maxVersion} " ]]; then
+    if [[ -n "${TARGET_VERSIONS[*]+set}" ]] && [[ " ${TARGET_VERSIONS[*]} " != *" ${maxVersion} "* ]]; then
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@release/hack/generate_catalog_template.sh` at line 45, Update the
TARGET_VERSIONS membership condition near maxVersion to use unquoted glob
pattern matching with != and *...* instead of the quoted =~ regular-expression
check, while preserving the existing unset/empty handling and space-delimited
membership behavior.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/decisions/0013-konflux-final-pipelines-for-release-automation.md`:
- Around line 2-3: Synchronize ADR 0013’s lifecycle status across both
references: update the frontmatter status in
docs/decisions/0013-konflux-final-pipelines-for-release-automation.md at lines
2-3 and apply the identical intended status to its decision-log entry in
docs/decisions/index.md at line 23.

In `@docs/konflux/file-based-catalog.md`:
- Line 5: Update the introductory sentence in the file-based catalog
documentation to capitalize “Konflux,” hyphenate “operator-specific,” and
correct “repositor” to “repository,” without changing the surrounding wording.
- Line 144: Correct the spelling in the sentence describing the custom build
pipeline by changing “catlaogs” to “catalogs.”
- Around line 36-38: Update the lifecycle documentation around “New Bundle SHA
(no version change)” and the referenced version/template update section to
reflect the final pipelines: remove Mintmaker’s staging-update responsibility
and manual version/template PR instructions, state that the production pipeline
handles version bumps, and document that the staging final pipeline runs make
catalog-template and creates or updates the persistent PR.

In `@docs/konflux/README.md`:
- Line 1: Update the README title heading to hyphenate the compound adjective,
using “Konflux-Based Build and Release Management.”
- Around line 228-232: Update the wording in the konflux.make documentation to
hyphenate “top-level” before “LVM Operator `Makefile`,” without changing the
surrounding content.
- Around line 191-195: Update the container-build.args documentation in
docs/konflux/README.md lines 191-195 to remove the offline-registry claim and
describe public Quay lookups with staging pullspec output. Apply the
corresponding clarification in docs/konflux/file-based-catalog.md lines 191-195:
candidate tags and digests come from the public Quay tenant, while generated
references retain staging registry paths.

In `@docs/konflux/release-management.md`:
- Line 73: Correct the typo in the catalog release description by changing
“offical” to “official,” leaving the surrounding text unchanged.

---

Nitpick comments:
In `@release/hack/generate_catalog_template.sh`:
- Line 45: Update the TARGET_VERSIONS membership condition near maxVersion to
use unquoted glob pattern matching with != and *...* instead of the quoted =~
regular-expression check, while preserving the existing unset/empty handling and
space-delimited membership behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: d427a2b0-2604-4153-84f5-6238ae52a405

📥 Commits

Reviewing files that changed from the base of the PR and between f57e400 and d1bf894.

📒 Files selected for processing (8)
  • .tekton/catalog-build-pipeline.yaml
  • docs/decisions/0013-konflux-final-pipelines-for-release-automation.md
  • docs/decisions/index.md
  • docs/konflux/README.md
  • docs/konflux/file-based-catalog.md
  • docs/konflux/operator-bundle-lifecycle.md
  • docs/konflux/release-management.md
  • release/hack/generate_catalog_template.sh
💤 Files with no reviewable changes (1)
  • .tekton/catalog-build-pipeline.yaml

Comment on lines +2 to +3
status: Proposed
date: 2026-07-20

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Synchronize ADR 0013’s status.

  • docs/decisions/0013-konflux-final-pipelines-for-release-automation.md#L2-L3: Set the frontmatter status to the intended lifecycle state.
  • docs/decisions/index.md#L23-L23: Use the same status in the decision log.
📍 Affects 2 files
  • docs/decisions/0013-konflux-final-pipelines-for-release-automation.md#L2-L3 (this comment)
  • docs/decisions/index.md#L23-L23
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/decisions/0013-konflux-final-pipelines-for-release-automation.md` around
lines 2 - 3, Synchronize ADR 0013’s lifecycle status across both references:
update the frontmatter status in
docs/decisions/0013-konflux-final-pipelines-for-release-automation.md at lines
2-3 and apply the identical intended status to its decision-log entry in
docs/decisions/index.md at line 23.

Comment thread docs/konflux/file-based-catalog.md Outdated
Comment thread docs/konflux/file-based-catalog.md Outdated
Comment thread docs/konflux/file-based-catalog.md Outdated

### `.tekton/catalog-patching-build-pipeline.yaml`

The pipeline contains the implementation of a custom build pipeline for the LVM Operator catlaogs.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the catalog spelling.

Line [144] says “catlaogs”; use “catalogs”.

🧰 Tools
🪛 LanguageTool

[grammar] ~144-~144: Ensure spelling is correct
Context: ...tom build pipeline for the LVM Operator catlaogs. This pipeline extends the basic FBC pi...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/konflux/file-based-catalog.md` at line 144, Correct the spelling in the
sentence describing the custom build pipeline by changing “catlaogs” to
“catalogs.”

Source: Linters/SAST tools

Comment thread docs/konflux/README.md Outdated
Comment thread docs/konflux/README.md
Comment on lines +191 to +195
### `container-build.args`

The single source of truth for version metadata, consumed by all Dockerfiles
via buildah's `--build-arg-file`:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Correct the documented registry contract.

  • docs/konflux/README.md#L191-L195: Remove the “offline” claim and document public Quay lookup plus staging pullspec output.
  • docs/konflux/file-based-catalog.md#L191-L195: Explain that candidate tags/digests come from the public Quay tenant while generated references retain staging paths.
📍 Affects 2 files
  • docs/konflux/README.md#L191-L195 (this comment)
  • docs/konflux/file-based-catalog.md#L191-L195
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/konflux/README.md` around lines 191 - 195, Update the
container-build.args documentation in docs/konflux/README.md lines 191-195 to
remove the offline-registry claim and describe public Quay lookups with staging
pullspec output. Apply the corresponding clarification in
docs/konflux/file-based-catalog.md lines 191-195: candidate tags and digests
come from the public Quay tenant, while generated references retain staging
registry paths.

Comment thread docs/konflux/README.md
Comment thread docs/konflux/release-management.md Outdated
snapshot: lvm-operator-catalog-{x-y}-{snapshot-id}
```

Catalog releases have no `data` section — they carry no advisory or release notes since the catalog is a delivery mechanism, not a user-facing artifact. The released catalog gets merged into the offical OpenShift operator catalog.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the catalog spelling.

Line [73] uses “offical”; use “official”.

🧰 Tools
🪛 LanguageTool

[grammar] ~73-~73: Ensure spelling is correct
Context: ...e released catalog gets merged into the offical OpenShift operator catalog. ### Releas...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/konflux/release-management.md` at line 73, Correct the typo in the
catalog release description by changing “offical” to “official,” leaving the
surrounding text unchanged.

Source: Linters/SAST tools

@jeff-roche
jeff-roche force-pushed the konflux-final-pipelines branch from d1bf894 to 719fe41 Compare July 20, 2026 20:31
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jul 20, 2026
Corrects stale lifecycle docs (Mintmaker nudge, manual version-bump/
catalog-template steps) to reflect the new final pipelines, fixes the
ADR-0013 status mismatch, corrects several typos/wording issues, and
switches the TARGET_VERSIONS membership check to a glob pattern.
@openshift-ci

openshift-ci Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

@jeff-roche: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/precommit-check 29e4230 link true /test precommit-check
ci/prow/ci-index-lvm-operator-bundle 29e4230 link true /test ci-index-lvm-operator-bundle

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants