Skip to content

ci: scope legacy release builds to the v* tag series - #1385

Merged
yashvardhannanavati merged 1 commit into
masterfrom
release-ci-guard-legacy
Sep 16, 2026
Merged

yashvardhannanavati merged 1 commit into
masterfrom
release-ci-guard-legacy

Conversation

@yashvardhannanavati

Copy link
Copy Markdown
Collaborator

Releases have only ever been cut from master, so both release workflows assumed every tag in the repo belonged to the legacy track. Cutting the first release from main (containerized IIB) breaks that assumption.

build.yml triggers on release: published, and GitHub cannot filter release events by tag name under on:. A release published from main would therefore be checked out and pushed as latest -- the channel the legacy track promotes to the prod tag on Quay from. Guard the job so it only builds v* releases.

build_on_tag.api.yml triggers on tags: '*', so any tag would rebuild iib-api:qe. Narrow it to v*.

The scheduled and manual paths in build.yml need no guard: they resolve their tag via find-latest-tag with prefix 'v', which already excludes the ocp-v* series used by main. Leaving that step untouched also keeps the weekly base-layer rebuild pinned to the legacy release, so the images feeding prod keep receiving RPM/CVE refreshes.

@qodo-for-releng

Copy link
Copy Markdown

PR Summary by Qodo

Scope legacy release builds to v* tags

🐞 Bug fix ⚙️ Configuration changes 🕐 Less than 10 minutes

Grey Divider

AI Description

• Restrict legacy release builds to the v* tag series.
• Prevent ocp-v* releases from overwriting legacy latest and qe image channels.
• Preserve scheduled and manual rebuilds against the latest legacy release.
Diagram

graph TD
  R["Published release"] --> G{"Tag starts v?"}
  G -->|Yes| L["Legacy image build"] --> Q["Quay channels"]
  G -->|No| S["Skip legacy build"]
  M["Manual or schedule"] --> L
  T["v tag push"] --> A["API QE build"] --> Q
Loading
High-Level Assessment

The selected approach is optimal: use a job-level condition where GitHub cannot filter release events by tag, and use the native tag filter for push events. Splitting the release workflow or adding step-level guards would duplicate configuration or risk partial execution without improving isolation.

Files changed (2) +17 / -1

Bug fix (2) +17 / -1
build.ymlGuard legacy release builds by tag series +13/-0

Guard legacy release builds by tag series

• Adds a job-level condition that permits published releases only when their tag starts with 'v'. Scheduled and manually dispatched builds remain enabled and continue resolving the latest legacy tag.

.github/workflows/build.yml

build_on_tag.api.ymlLimit API QE builds to v* tags +4/-1

Limit API QE builds to v* tags

• Narrows the tag-push trigger from every tag to 'v*', preventing containerized IIB tags from overwriting the legacy 'iib-api:qe' image.

.github/workflows/build_on_tag.api.yml

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:47 PM UTC · Completed 10:59 PM UTC

Commit: 8f6f8bb · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $3.20

@qodo-for-releng

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider

Great, no issues found!

Qodo reviewed your code and found no material issues that require review

Grey Divider

Tip of the day
💡 Did you know, you can turn these tips off under Display preferences

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

@fullsend-ai-review fullsend-ai-review Bot added the risk/moderate PR risk: moderate label Sep 10, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 10, 2026

Copy link
Copy Markdown

Risk Assessment: moderate (2/5)

Details

Small, targeted CI-only change (2 files, 18 lines) by a known contributor with no security-sensitive or dependency modifications; PROTECTED_PATH_COUNT=2 and CI_WORKFLOW_CHANGED=true reflect inherent CI file risk, but the minimal blast radius and stable git history keep the score at moderate.

Previous run

Risk Assessment: moderate (2/5)

Details

Small CI workflow change (2 files, 18 lines) from an established author on low-churn, stable files; protected-path and CI-change signals moderately elevate risk but the minimal scope and clean git history keep the score at moderate.

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 10, 2026

Copy link
Copy Markdown

Review

Findings

High

  • [protected-path] .github/workflows/build.yml, .github/workflows/build_on_tag.api.yml — Both changed files are under .github/, a protected path requiring human approval. The PR has no linked issue providing explicit authorization for modifying governance/infrastructure files. Human review is required regardless of the change's merit.
    Remediation: Link a tracking issue that authorizes CI workflow modifications, or obtain explicit human approval for the protected-path changes.

Low

  • [missing-authorization] .github/workflows/build.yml — No linked issue backs this change. The PR body is thorough and explains the motivation (upcoming first release from main using the ocp-v* series would otherwise contaminate the legacy latest/prod Quay channel), but the project's standard authorization trail — a GitHub issue or ADR — is absent for a non-trivial CI workflow modification.
    Remediation: Open a tracking issue describing the two-track release strategy (legacy v* from master, containerized ocp-v* from main) and reference it in this PR. This also anchors future maintainers who need to understand why the guards exist.

Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run

Review

Findings

High

  • [protected-path] .github/workflows/build.yml, .github/workflows/build_on_tag.api.yml — This PR modifies files under the .github/ protected path. No linked issue exists to authorize changes to governance/infrastructure files. Human approval is always required for protected-path changes.

Low

  • [missing-authorization] .github/workflows/build.yml — No linked issue exists for this CI change. While the PR body explains the motivation clearly, the project has no issue trail authorizing the dual-track release strategy (master v* vs. main ocp-v*) that this guard implements. A linked issue or ADR would establish the authorization chain and aid future reviewers.
    Remediation: Open or reference an issue (or ADR) documenting the decision to split release tracks between master (v*) and main (ocp-v*).

Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR

fullsend-ai-review[bot]

This comment was marked as outdated.

@yashvardhannanavati

Copy link
Copy Markdown
Collaborator Author

/fs-fix-stop

Releases have only ever been cut from master, so both release workflows
assumed every tag in the repo belonged to the legacy track. Cutting the
first release from main (containerized IIB) breaks that assumption.

build.yml triggers on `release: published`, and GitHub cannot filter
release events by tag name under `on:`. A release published from main
would therefore be checked out and pushed as `latest` -- the channel the
legacy track promotes to the `prod` tag on Quay from. Guard the job so it
only builds `v*` releases.

build_on_tag.api.yml triggers on `tags: '*'`, so any tag would rebuild
iib-api:qe. Narrow it to `v*`.

The scheduled and manual paths in build.yml need no guard: they resolve
their tag via find-latest-tag with prefix 'v', which already excludes the
`ocp-v*` series used by main. Leaving that step untouched also keeps the
weekly base-layer rebuild pinned to the legacy release, so the images
feeding `prod` keep receiving RPM/CVE refreshes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Yashvardhan Nanavati <yashn@bu.edu>
@github-actions github-actions Bot added the fullsend-no-fix Skip bot-triggered fix agent runs label Sep 16, 2026
@github-actions

Copy link
Copy Markdown

Fix agent disabled for this PR. Remove the fullsend-no-fix label or use /fs-fix to re-engage.

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 16, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:39 AM UTC · Completed 3:53 AM UTC

Commit: 37b4e56 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $2.93

@fullsend-ai-review fullsend-ai-review 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.

See the review comment for full details.

@yashvardhannanavati
yashvardhannanavati merged commit cc2a26b into master Sep 16, 2026
22 checks passed
@yashvardhannanavati
yashvardhannanavati deleted the release-ci-guard-legacy branch September 16, 2026 06:24
@fullsend-ai-retro

fullsend-ai-retro Bot commented Sep 16, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 6:25 AM UTC · Completed 6:34 AM UTC

Commit: 37b4e56 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $2.64

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #1385 — ci: scope legacy release builds to the v* tag series

Workflow quality: Good overall, with one infrastructure issue inflating cost.

This was a clean, human-authored CI change (+17/−1 across 2 workflow files) by a known contributor. The review agent ran twice (Sep 10 at $3.20 and Sep 16 at $2.93 = $6.13 total), both times producing identical procedural findings — [protected-path] (High) and [missing-authorization] (Low). No code quality or correctness issues were found by any reviewer (agent, Qodo, or human). Human reviewer lipoja approved the PR on Sep 11; the author merged on Sep 16 after using /fs-fix-stop to disable the fix agent.

Timeline

  1. Sep 10 22:46 — PR opened (commit 8f6f8bb), fullsend opened event triggers review
  2. Sep 10 22:59 — Review agent posts findings (protected-path, missing-authorization), submits CHANGES_REQUESTED ($3.20)
  3. Sep 11 06:09 — Human (lipoja) approves on updated commit 37b4e56
  4. Sep 16 03:38 — Author posts /fs-fix-stop, rebases at the same time; synchronize event triggers second review
  5. Sep 16 03:39–03:53 — Second review run starts; pre-fetch-prior-review.sh finds the first review's comment but discards it due to empty expected app client_id (Prior review comment 5626563054 created by app client_id=Iv23li1nIorNLIQy6NWK, expected — discarding (wrong app)). Full re-review produces identical findings, submits CHANGES_REQUESTED again ($2.93)
  6. Sep 16 06:24 — Author merges PR with human approval overriding agent objection

Evidence for existing issues (no new proposals needed)

All identified improvement areas have existing open issues in fullsend-ai/fullsend:

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

Labels

fullsend-no-fix Skip bot-triggered fix agent runs risk/moderate PR risk: moderate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants