Skip to content

fix(ci): promote workflow fixes from main to lts (conflict-resolved)#1160

Closed
castrojo wants to merge 21 commits intoltsfrom
fix/resolve-lts-conflicts
Closed

fix(ci): promote workflow fixes from main to lts (conflict-resolved)#1160
castrojo wants to merge 21 commits intoltsfrom
fix/resolve-lts-conflicts

Conversation

@castrojo
Copy link
Copy Markdown
Collaborator

@castrojo castrojo commented Mar 3, 2026

Summary

Brings lts up to date with all CI workflow fixes that landed on main since the last promotion (PR #1153). Conflicts in PR #1159 were caused by diverged history from old pull-bot merge commits on lts; all conflicts resolved by taking main's version.

Changes

  • Remove schedule: from all 5 caller workflows (owned exclusively by scheduled-lts-release.yml)
  • Remove sbom: input from reusable workflow; SBOM steps now gated on github.ref == refs/heads/lts && inputs.publish
  • Add continue-on-error: true to all 3 SBOM steps
  • Gate Push Manifest and sign job on inputs.publish (fixes build failures on push-to-lts validation builds)
  • Change publish default from true to false
  • Fix generate-release.yml to only fire on workflow_dispatch-triggered builds (not push-to-lts)
  • Simplify promote-to-lts.yml to use gh pr create --head main (no intermediate branch)
  • Delete docs/plans/ directory
  • Update AGENTS.md with authoritative CI architecture documentation

Why conflicts existed

lts diverged from main at 64cb487 due to pull-bot merge commits landing directly on lts. Those commits (fbd92a4, cb9f096, 7d95440) have no counterpart in main's history, forcing a 3-way merge. All conflicts were in workflow files — resolved by taking main's version in every case.

After merging

Validation builds (push-triggered, publish=false) will run on lts for all 5 variants. They should all pass cleanly — this was verified as the fix for the failures that occurred after PR #1153 merged.

Closes #1159

ubot-7274 bot and others added 21 commits March 1, 2026 18:13
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[actions/download-artifact](https://redirect.github.com/actions/download-artifact)
| action | major | `v7` → `v8` |
|
[actions/upload-artifact](https://redirect.github.com/actions/upload-artifact)
| action | major | `v6` → `v7` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Release Notes

<details>
<summary>actions/download-artifact (actions/download-artifact)</summary>

###
[`v8`](https://redirect.github.com/actions/download-artifact/compare/v7...v8)

[Compare
Source](https://redirect.github.com/actions/download-artifact/compare/v7...v8)

</details>

<details>
<summary>actions/upload-artifact (actions/upload-artifact)</summary>

###
[`v7`](https://redirect.github.com/actions/upload-artifact/compare/v6...v7)

[Compare
Source](https://redirect.github.com/actions/upload-artifact/compare/v6...v7)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [x] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4wIiwidXBkYXRlZEluVmVyIjoiNDMuNDMuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
…t to b8fe93b (#1133)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| ghcr.io/projectbluefin/common | digest | `5decea8` → `b8fe93b` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [x] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4zOC4xIiwidXBkYXRlZEluVmVyIjoiNDMuMzguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [anchore/sbom-action](https://redirect.github.com/anchore/sbom-action)
([changelog](https://redirect.github.com/anchore/sbom-action/compare/28d71544de8eaf1b958d335707167c5f783590ad..17ae1740179002c89186b61233e0f892c3118b11))
| action | digest | `28d7154` → `17ae174` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [x] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4zOC4xIiwidXBkYXRlZEluVmVyIjoiNDMuMzguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
…est to 7dca424 (#1131)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| quay.io/centos-bootc/centos-bootc | digest | `001a05c` → `7dca424` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [x] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4zMS45IiwidXBkYXRlZEluVmVyIjoiNDMuMzEuOSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
## Summary
This PR ensures SBOMs are only generated on the `lts` production branch,
not on `main` branch or pull requests.

## Problem
The `build-dx-hwe.yml` workflow had inconsistent SBOM generation logic
compared to all other build workflows:
- **build-dx-hwe.yml**: Generated SBOMs on main branch (incorrect)
- **All other workflows**: Only generated SBOMs on lts branch (correct)

## Solution
Aligned `build-dx-hwe.yml` SBOM logic with the other 4 workflows:
```yaml
sbom: ${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/lts' }}
```

## Impact
After this change, SBOMs will **only** be generated when:
- ✅ Event is NOT a pull request
- ✅ Branch is `lts` (production branch)
- ❌ Branch is `main` (testing branch) - **NO SBOMs**
- ❌ Pull requests to any branch - **NO SBOMs**

## Testing
- [ ] Syntax validation passes
- [ ] Logic matches other workflows:
  - build-regular.yml ✅
  - build-regular-hwe.yml ✅
  - build-dx.yml ✅
  - build-gdx.yml ✅
  - build-dx-hwe.yml ⚠️ (fixed by this PR)
## Summary
This reverts commit 16aa2b3 (PR #1140) to restore the original SBOM
generation behavior.

## Reason for Revert
The previous PR was merged without proper review. Opening this revert so
the change can be properly reviewed by Copilot and maintainers before
proceeding.

## What This Revert Does
Restores the original SBOM generation logic in all workflow files:
- `build-dx-hwe.yml` - back to generating SBOMs on main branch
- All other workflows - back to their previous state

## Next Steps
After this revert is merged, a new PR will be opened with the SBOM fix
for proper review.
## Summary
This PR ensures SBOMs are only generated on the `lts` production branch,
not on `main` branch or pull requests.

## Problem
The `build-dx-hwe.yml` workflow currently generates SBOMs on all non-PR
builds, including the `main` branch. This is inconsistent with the other
build workflows which only generate SBOMs on the `lts` production
branch.

### Current State
| Workflow | SBOM Generation Logic | Generates on main? |
|----------|----------------------|-------------------|
| build-regular.yml | `github.event_name != 'pull_request' && github.ref
== 'refs/heads/lts'` | ❌ No |
| build-regular-hwe.yml | `github.event_name != 'pull_request' &&
github.ref == 'refs/heads/lts'` | ❌ No |
| build-dx.yml | `github.event_name != 'pull_request' && github.ref ==
'refs/heads/lts'` | ❌ No |
| build-gdx.yml | `github.event_name != 'pull_request' && github.ref ==
'refs/heads/lts'` | ❌ No |
| **build-dx-hwe.yml** | `github.event_name != 'pull_request'` | ⚠️
**Yes** (inconsistent) |

## Solution
Align `build-dx-hwe.yml` with the other workflows:

```yaml
sbom: ${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/lts' }}
```

## Impact
After this change, SBOMs will **only** be generated when:
- ✅ Event is NOT a pull request
- ✅ Branch is `lts` (production branch per `reusable-build-image.yml`
line 76)

SBOMs will **NOT** be generated when:
- ❌ Branch is `main` (testing branch per `reusable-build-image.yml` line
77)
- ❌ Event is a pull request

## Testing
- [x] Syntax validation: Change aligns with existing pattern in 4 other
workflows
- [x] Logic verified: All 5 workflows will have identical SBOM
generation logic
- [x] Conventional commit format used

## Checklist
- [x] Change is minimal and surgical
- [x] Conventional commit message used
- [x] AI attribution included in commit footer
## Summary
This prevents automatic builds/publishes on lts branch from pull app
promotions while maintaining the ability to manually trigger releases.

## Changes
- ✅ Remove `lts` from push triggers (keeps `main` only)
- ✅ Add weekly cron schedule (Sunday 2 AM UTC) for all 5 build workflows
- ✅ Conditional publish: only on `lts` if scheduled or manual dispatch
- ✅ PRs to `lts` still validate (build without publish)
- ✅ `main` branch continues to build/publish to `:lts-testing`

## Benefits
- 🚫 No accidental production releases from pull app merges
- 📅 Controlled weekly production releases via cron
- 🎯 Manual release capability via workflow_dispatch
- 📝 Proper changelog generation when GDX build completes on schedule

## Testing
- [x] Syntax validated with `just check`
- [x] Shellcheck linting passed
- [ ] Should test with manual workflow_dispatch on `lts` branch after
merge

## Related
Fixes the issue where changelogs weren't being generated because builds
on `lts` were happening from pull app promotions instead of
scheduled/manual runs.
…est to d4ef607 (#1139)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| quay.io/centos-bootc/centos-bootc | digest | `7dca424` → `d4ef607` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40Ni42IiwidXBkYXRlZEluVmVyIjoiNDMuNDYuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
…1068 (#1135)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| ghcr.io/ublue-os/brew | digest | `3efdc1a` → `ca91068` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40Ni4zIiwidXBkYXRlZEluVmVyIjoiNDMuNDYuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
…est to d4ef607 (#1145)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| quay.io/centos-bootc/centos-bootc | digest | `7dca424` → `d4ef607` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled because a matching PR was automerged
previously.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40Ni42IiwidXBkYXRlZEluVmVyIjoiNDMuNDYuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
…t to cbe78e6 (#1146)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| ghcr.io/projectbluefin/common | digest | `b8fe93b` → `cbe78e6` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40Ny4wIiwidXBkYXRlZEluVmVyIjoiNDMuNDcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
## Summary

This PR fixes accidental production tag publishes from pull bot PRs to
the `lts` branch by implementing a dispatcher pattern for scheduled
releases.

### Changes Made

1. **Created dispatcher workflow** (`scheduled-lts-release.yml`)
   - Runs weekly on Sunday at 2 AM UTC
- Triggers all 5 build workflows on `lts` branch via `workflow_dispatch`
- Solves the problem that GitHub Actions `schedule:` triggers always run
on default branch

2. **Updated all 5 build workflows**:
- Removed `lts` from `pull_request:` triggers (no longer trigger on pull
bot PRs)
- Added `lts` to `push:` triggers (validation builds on pull bot merges)
   - Removed `schedule:` sections (moved to dispatcher)
   - Updated `publish:` conditions to only publish on:
     - `workflow_dispatch` events (cron dispatcher + manual triggers)
     - `push` to `main` branch (`:lts-testing` tags)

### Workflow Behavior Matrix

| Event | Branch | Triggers? | Publishes? | Tags |
|-------|--------|-----------|------------|------|
| PR to main | `main` | ✅ | ❌ | none |
| Merge to main | `main` | ✅ | ✅ | `:lts-testing` |
| PR to lts | `lts` | ❌ | ❌ | none |
| Merge to lts | `lts` | ✅ | ❌ | none (validation only) |
| Cron Sun 2am | `main` | ✅ | ❌ | none (dispatcher) |
| Dispatcher | `lts` | ✅ | ✅ | `:lts` (production) |
| Manual dispatch | `lts` | ✅ | ✅ | `:lts` |

### Problem Fixed

**Before:** Pull bot PRs to `lts` triggered all 5 build workflows and
published production tags (`:lts`, `:lts.YYYYMMDD`)

**After:** Pull bot PRs to `lts` do NOT trigger workflows. Production
tags only publish via:
- Weekly cron schedule (Sunday 2 AM UTC)
- Manual `workflow_dispatch` on `lts` branch

**Evidence of bug:** PR #1144 (pull bot) triggered runs:
- #22586907105 (Build Bluefin LTS)
- #22586905020 (Build Bluefin LTS DX) 
- #22586905071 (Build Bluefin LTS GDX)

All published production tags from PR event instead of scheduled event.

### Testing Plan

After merge, need to verify:
- [ ] Pull bot PRs to `lts` do NOT trigger workflows
- [ ] Pull bot merges to `lts` DO trigger validation builds but do NOT
publish
- [ ] Manual dispatcher trigger works and publishes production tags
- [ ] Merges to `main` still publish `:lts-testing` tags

### Branch Protection Update Required

The `lts` branch protection needs manual updates (web UI or API):
- Change required approvals from 2 → 1
- Disable force pushes (currently enabled)
- Enable conversation resolution
- Enable dismiss stale reviews

Current settings:
```json
{
  "approvals": 2,
  "force_pushes": true,
  "enforce_admins": false
}
```

### Related Issues

Fixes the accidental production tag publishing issue observed on
2026-03-02.

### Implementation Notes

- All commits follow conventional commit format
- Syntax validated with `just check`
- Linting validated with `just lint` (no new warnings introduced)
- Plan documented in `docs/plans/2026-03-02-fix-lts-tag-publishing.md`
…orkflow (#1152)

## Summary

This PR implements a comprehensive 3-layer defense to prevent branch
pollution caused by AI agents accidentally merging `lts` → `main`.

### Problem
AI agents see branch divergence between `main` and `lts` and attempt to
"sync" by merging in the wrong direction (`lts` → `main`), causing old
commits to pollute the git history.

### Solution: 3-Layer Defense

**Layer 1: Manual Promotion Workflow**
- Replace automatic Pull app with manual GitHub Actions workflow
- Created `.github/workflows/promote-to-lts.yml` (manual
`workflow_dispatch` only)
- Deleted `.github/pull.yml` (automatic pull app config)
- Operators manually trigger promotions when ready

**Layer 2: Renovate Restriction**
- Updated `.github/renovate.json5` to only target `main` branch
- Prevents Renovate from creating PRs against `lts`
- All dependency updates flow through `main` → testing → promotion

**Layer 3: Validation Build Triggers** (Critical Fix)
- Added `lts` to push triggers in all 5 build workflows
- Fixes missing implementation from commit 8ed6d20
- Enables validation builds when promotion PRs merge to `lts`
- Builds trigger but **DO NOT publish** (cron-only publishing preserved)

### Workflow Behavior After This PR

| Event | Branch | Triggers? | Publishes? | Tags |
|-------|--------|-----------|------------|------|
| PR to main | main | ✅ | ❌ | none |
| Merge to main | main | ✅ | ✅ | `:lts-testing` |
| PR to lts | lts | ❌ | ❌ | none |
| **Merge to lts** | **lts** | **✅** | **❌** | **validation only** |
| Cron Sun 2am | main | ✅ (dispatcher) | ❌ | none |
| Dispatcher trigger | lts | ✅ | ✅ | `:lts` (production) |

### Decoupled Promotion & Release

**Promotion** (manual):
1. Operator triggers `promote-to-lts.yml` workflow
2. PR auto-created from `main` → `lts`
3. Operator reviews and merges
4. Validation builds trigger (no publish)

**Release** (separate):
1. Sunday cron OR manual trigger
2. `scheduled-lts-release.yml` dispatches builds on `lts`
3. Production images published to ghcr.io with `:lts` tags

### Changes Made

```
8 files changed, 70 insertions(+), 16 deletions(-)
```

- ✅ Deleted `.github/pull.yml`
- ✅ Created `.github/workflows/promote-to-lts.yml`
- ✅ Updated `.github/renovate.json5` (added `baseBranches: ["main"]`)
- ✅ Modified 5 build workflows (added `lts` to push triggers)

### Testing

- ✅ `just check` passed
- ✅ `just lint` passed (no new warnings)
- 📋 After merge: Test promotion workflow creates PR correctly
- 📋 After merge: Test validation builds trigger on lts merge (no
publish)

### Post-Merge Actions

- [ ] Manually uninstall Pull app from repository settings (user will
handle)
- [ ] Test promotion workflow via Actions → "Promote Main to LTS"
- [ ] Verify validation builds trigger without publishing

### Related

Fixes the branch pollution issue and completes the missing
implementation from commit 8ed6d20.

Plan documented at: `docs/plans/2026-03-02-fix-branch-pollution.md`
…t to 786c4d1 (#1149)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| cgr.dev/chainguard/wolfi-base | container | digest | `9925d30` →
`786c4d1` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4zIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
…/caffeine digest to 98b3b4f (#1148)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[system_files/usr/share/gnome-shell/extensions/tmp/caffeine](https://redirect.github.com/eonpatapon/gnome-shell-extension-caffeine.git)
([changelog](https://redirect.github.com/eonpatapon/gnome-shell-extension-caffeine.git/compare/07643c383db62dfcbb0485f344d063389644f2f9..98b3b4f60247d61b8d93acdd6055d5b41adbbb24))
| digest | `07643c3` → `98b3b4f` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/549) for more information.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OC4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: ubot-7274[bot] <217212047+ubot-7274[bot]@users.noreply.github.com>
…#1154)

## Summary

Fixes a critical bug where merges to `main` branch were accidentally
pushing container images to the production `:lts` tag instead of the
testing `:lts-testing` tag.

## Problem

The manifest generation step (line 372) had incorrect conditional logic:
- **Build step (line 161)**: Simple condition `if [ "${REF_NAME}" !=
"${PRODUCTION_BRANCH}" ]` - adds `-testing` for all non-production
branches ✅
- **Manifest step (line 372)**: Complex condition that only added
`-testing` for PRs/merge groups - omitted pushes to main ❌

This caused:
- Build step creates image tagged `lts-testing` ✅
- Manifest step pushes manifest with tag `lts` ❌
- **Result**: Production tag gets polluted with testing builds!

## Solution

- Line 372: Changed from complex condition to simple `if [ "${REF_NAME}"
!= "${PRODUCTION_BRANCH}" ]` to match build step logic
- Line 375: Fixed `CENTOS_VERSION_SUFFIX` to append suffix instead of
replacing (preserves `-hwe` when present)

## Evidence

- Bug introduced in commit `0566080` (PR #1101) which fixed the build
step but forgot the manifest step
- Registry shows `:lts-testing` tags exist but haven't been updated
since Feb 22 (builds were cancelled)
- Production `:lts` tags show recent activity through Mar 2

## Verification

- ✅ `just check && just lint` passes
- ✅ Test script confirms push to main will now tag as `lts-testing` not
`lts`
## Summary

- **Fix tag pollution from main branch merges**: The manifest step had
complex conditional logic that omitted pushes to `main`, causing `:lts`
production tags to be overwritten by testing builds. Aligns manifest
step with build step logic.
- **Fix `Push Manifest` and `sign` failing on lts push events**: Both
steps used `github.event_name != 'pull_request'` which fired even when
`publish=false`, causing `image not known` errors. Now gated on
`inputs.publish`.
- **Remove duplicate `schedule:` from all 5 build workflows**: The
dispatcher (`scheduled-lts-release.yml`) owns the weekly cron. The stale
entries were triggering 10 extra no-op builds on `main` every Sunday on
top of the 5 dispatcher runs on `lts`.
- **Simplify `promote-to-lts.yml`**: Replace the
checkout+merge+intermediate-branch approach (which reintroduced merge
commit pollution) with a single `gh pr create --base lts --head main`
call. Drops `contents: write` permission.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…icts

# Conflicts:
#	.github/workflows/build-dx-hwe.yml
#	.github/workflows/build-dx.yml
#	.github/workflows/build-gdx.yml
#	.github/workflows/build-regular-hwe.yml
#	.github/workflows/build-regular.yml
#	.github/workflows/promote-to-lts.yml
@castrojo castrojo requested a review from tulilirockz as a code owner March 3, 2026 03:41
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Mar 3, 2026
@castrojo
Copy link
Copy Markdown
Collaborator Author

castrojo commented Mar 3, 2026

Closing — approach was wrong. A merge drags polluted history into lts. Replacing with a direct file-update commit.

@castrojo castrojo closed this Mar 3, 2026
@dosubot dosubot bot added area/dx Developer experience kind/documentation Improvements or additions to documentation kind/github-action Anything having to do with GHA and automation labels Mar 3, 2026
castrojo added a commit that referenced this pull request Mar 3, 2026
## Summary

- Brings `lts` CI workflows in sync with `main` using a single direct
commit — no merge, no history pollution
- Fixes the build failures that occurred after PR #1153 merged (Push
Manifest / sign job running when `publish=false`)

## Changes

- Remove `schedule:` from all 5 caller workflows (owned exclusively by
`scheduled-lts-release.yml`)
- Gate `Push Manifest` and `sign` job on `inputs.publish` instead of
`event != pull_request`
- Change `publish` default from `true` to `false`
- Remove `sbom:` input; SBOM steps now gated on `github.ref ==
refs/heads/lts && inputs.publish`
- Add `continue-on-error: true` to all 3 SBOM steps
- Fix `generate-release.yml` to only fire on
`workflow_dispatch`-triggered builds
- Simplify `promote-to-lts.yml` to use `gh pr create --head main` (no
intermediate branch needed)
- Delete `docs/plans/` directory
- Update `AGENTS.md` with authoritative CI architecture documentation

## Why direct file update instead of merge

Previous attempts (PRs #1159, #1160) used merge commits which dragged
polluted history from old pull-bot merges into `lts`. This PR uses `git
checkout origin/main -- <files>` to update files directly, resulting in
a single clean commit with no history contamination.

## After merging

Validation builds (`push` to `lts`, `publish=false`) will run on all 5
variants and should pass cleanly.

Assisted-by: Claude Sonnet 4.5 via OpenCode
@dosubot
Copy link
Copy Markdown

dosubot bot commented Mar 3, 2026

Related Documentation

2 document(s) may need updating based on files changed in this PR:

bluefin

Bluefin OS
View Suggested Changes
@@ -101,7 +101,7 @@
 
 **Promotion Process:**
 
-Changes flow from `main` to `lts` via the `.github/workflows/promote-to-lts.yml` workflow, which is manually triggered via `workflow_dispatch`. The workflow creates a pull request with the title "Promote main to lts" using `gh pr create --base lts --head main`, allowing maintainers to review and approve the promotion. This approach ensures the merge direction is always `main` → `lts` (never `lts` → `main`) and requires only `pull-requests: write` and `issues: write` permissions. The previous `.github/pull.yml` configuration file has been removed.
+Changes flow from `main` to `lts` via the `.github/workflows/promote-to-lts.yml` workflow, which is manually triggered via `workflow_dispatch`. The workflow creates a pull request directly from `main` to `lts` using `gh pr create --base lts --head main` (no intermediate branch), allowing maintainers to review and approve the promotion. This approach ensures the merge direction is always `main` → `lts` (never `lts` → `main`) and requires only `pull-requests: write` and `issues: write` permissions.
 
 **Build Triggers:**
 
@@ -119,10 +119,12 @@
 The build workflows have been refined to ensure reliable image publishing:
 
 - **Tag pollution prevention**: The manifest step logic aligns with the build step logic, checking `if [ "${REF_NAME}" != "${PRODUCTION_BRANCH}" ]` to apply the `-testing` suffix consistently. This prevents production tags from being overwritten by testing builds when merging to `main`.
-- **Manifest and signing fixes**: The "Push Manifest" and "sign" steps are gated on `inputs.publish`, which fixes "image not known" errors that previously occurred when these steps fired on validation builds.
+- **Manifest and signing fixes**: The "Push Manifest" and "sign" job are gated on `inputs.publish`, which prevents "image not known" errors when these steps fired on validation builds.
 - **Default publish behavior**: The `publish` input in `reusable-build-image.yml` defaults to `false` for improved safety, requiring callers to explicitly opt in to image publishing.
 
 SBOM (Software Bill of Materials) artifacts are generated only for builds on the `lts` branch when `inputs.publish` is true (condition: `github.ref == 'refs/heads/lts' && inputs.publish`). All SBOM steps include `continue-on-error: true` to ensure that external service outages (such as Sigstore/Rekor) never block image publishing.
+
+For complete CI/CD architecture documentation, including workflow roles, publish conditions, and troubleshooting guidance, see [`AGENTS.md`](https://github.com/ublue-os/bluefin-lts/blob/main/AGENTS.md) in the repository.
 
 ### Rebasing Between Variants
 
@@ -186,7 +188,7 @@
 
 ### SBOM Generation
 
-SBOM (Software Bill of Materials) generation with Syft is performed only for builds on the `lts` branch when `inputs.publish` is true (condition: `github.ref == 'refs/heads/lts' && inputs.publish`). All SBOM steps include `continue-on-error: true` to ensure that external service outages (such as Sigstore/Rekor) never block image publishing, ensuring supply chain transparency for production releases without risking build failures.
+SBOM (Software Bill of Materials) generation with Syft is performed only for builds on the `lts` branch when `inputs.publish` is true (condition: `github.ref == 'refs/heads/lts' && inputs.publish`). All SBOM steps include `continue-on-error: true` to ensure that external service outages (such as Sigstore/Rekor) never block image publishing. This provides supply chain transparency for production releases without risking build failures from external dependencies.
 
 [Automated Brewfile validation runs in the CI pipeline](https://app.dosu.dev/documents/4da0c9c8-3220-465d-9212-174c99baf3fe), and [GitHub Actions matrix builds handle variants and streams](https://github.com/ublue-os/bluefin/blob/1a5c8d9e5aaf38c7b10f35d7162f5f36d9f883f7/.github/workflows/reusable-build.yml#L36-L39). [image-versions.yml tracks SHA256 digests for base images](https://github.com/ublue-os/bluefin/blob/1a5c8d9e5aaf38c7b10f35d7162f5f36d9f883f7/image-versions.yml#L1-L14), with [version format: stream-fedora_version.YYYYMMDD[.point]](https://github.com/ublue-os/bluefin/blob/1a5c8d9e5aaf38c7b10f35d7162f5f36d9f883f7/Justfile#L156-L171).
 

[Accept] [Decline]

Universal Blue Build and Update System
View Suggested Changes
@@ -57,7 +57,7 @@
 
 **Dispatcher Workflow Architecture:**
 
-The dispatcher pattern solves a GitHub Actions constraint where scheduled triggers always execute on the default branch. The `scheduled-lts-release.yml` workflow runs on `main` with `schedule: - cron: '0 2 * * 0'` (weekly on Sunday at 2 AM UTC) and uses GitHub CLI commands (`gh workflow run [workflow].yml --ref lts -R ${{ github.repository }}`) to trigger all 5 build workflows on the `lts` branch via `workflow_dispatch` events. The workflow also includes `workflow_dispatch:` trigger to allow manual execution for on-demand production releases. This ensures production releases build from the stable `lts` branch code rather than the more frequently updated `main` branch. See [docs/plans/2026-03-02-fix-lts-tag-publishing.md](https://github.com/ublue-os/bluefin/blob/main/docs/plans/2026-03-02-fix-lts-tag-publishing.md) for complete implementation details.
+The dispatcher pattern solves a GitHub Actions constraint where scheduled triggers always execute on the default branch. The `scheduled-lts-release.yml` workflow runs on `main` with `schedule: - cron: '0 2 * * 0'` (weekly on Sunday at 2 AM UTC) and uses GitHub CLI commands (`gh workflow run [workflow].yml --ref lts -R ${{ github.repository }}`) to trigger all 5 build workflows on the `lts` branch via `workflow_dispatch` events. The workflow also includes `workflow_dispatch:` trigger to allow manual execution for on-demand production releases. This ensures production releases build from the stable `lts` branch code rather than the more frequently updated `main` branch. See `AGENTS.md` in the repository for authoritative CI architecture documentation.
 
 **Branch Management and Promotion Strategy:**
 
@@ -65,7 +65,7 @@
 
 **Layer 1: Manual Promotion Workflow** - The `promote-to-lts.yml` workflow enables explicit promotion of tested changes from `main` to `lts`. The workflow:
 - Requires manual trigger via GitHub Actions UI (`workflow_dispatch`)
-- Creates pull requests directly from `main` → `lts` using `gh pr create --base lts --head main`
+- Creates pull requests directly from `main` → `lts` using `gh pr create --base lts --head main` (no intermediate branches)
 - Includes customizable PR title (default: "Promote main to lts") and body warning against reverse merges
 - Adds `promotion` label to PRs for easy identification
 - Requires operator review and approval before merging
@@ -99,7 +99,7 @@
 
 ### SBOM Generation
 
-SBOM (Software Bill of Materials) generation occurs only on the `lts` branch when images are published. The system uses Syft to scan container images and generate SBOMs, which are attached as attestations to signed images for supply chain transparency. All SBOM-related steps include `continue-on-error: true` to ensure that SBOM failures (such as Sigstore/Rekor service outages) never block image publishing.
+SBOM (Software Bill of Materials) generation occurs only on the `lts` branch when images are published. The system uses Syft to scan container images and generate SBOMs, which are attached as attestations to signed images for supply chain transparency.
 
 **SBOM generation behavior:**
 
@@ -109,7 +109,7 @@
 - ❌ Skipped on pull requests to any branch
 - ❌ Skipped on validation builds (push events to `lts` branch that don't publish)
 
-SBOM behavior is controlled entirely by step-level conditions (`if: ${{ github.ref == 'refs/heads/lts' && inputs.publish }}`) checking the branch reference and publish status. The workflow defaults `publish` to `false` for safety—callers must explicitly opt in to publishing.
+SBOM behavior is controlled entirely by step-level conditions (`if: ${{ github.ref == 'refs/heads/lts' && inputs.publish }}`) checking the branch reference and publish status, not by input parameters. The workflow defaults `publish` to `false` for safety—callers must explicitly opt in to publishing. All SBOM-related steps include `continue-on-error: true` to ensure that SBOM failures (such as Sigstore/Rekor service outages) never block image publishing.
 
 For LTS production releases, SBOMs are generated weekly through the dispatcher pattern. The ublue-os/main repository has SBOM generation disabled but implementation preserved.
 
@@ -158,11 +158,11 @@
 - Pull requests to `main` branch validate (build without publishing)
 - The publish condition enforces this behavior: `(github.event_name == 'workflow_dispatch' && (github.ref == 'refs/heads/lts' || github.ref == 'refs/heads/main')) || (github.event_name == 'push' && github.ref == 'refs/heads/main')`
 
-> **Bug Fix (PR #1154 & #1157)**: Critical bugs were fixed in the manifest generation and publishing steps:
+> **Bug Fix (PR #1154 & #1157 & #1160)**: Critical bugs were fixed in the manifest generation and publishing steps:
 > 
 > - **Manifest Step (PR #1154)**: The manifest generation step had inconsistent conditional logic compared to the build step. The build step correctly added `-testing` suffix for all non-production branches, but the manifest generation step only added it for pull requests and merge groups—omitting pushes to `main`. This caused `main` branch merges to accidentally push images to the production `:lts` tag instead of `:lts-testing`. PR #1154 resolved this by aligning manifest step logic with build step logic: both now use `if [ "${REF_NAME}" != "${PRODUCTION_BRANCH}" ]`, ensuring consistent tagging behavior.
 > 
-> - **Push Manifest and Sign Steps (PR #1157)**: Both the "Push Manifest" and "sign" steps used `github.event_name != 'pull_request'` conditionals, which caused them to fire even when `inputs.publish` was `false`. This resulted in "image not known" errors during validation builds on `lts` push events. PR #1157 fixed this by gating both steps on `inputs.publish` instead, ensuring they only execute when publishing is intended. The same fix was applied to signing steps in the `build_push` job to prevent signing non-existent images.
+> - **Push Manifest and Sign Steps (PR #1157 & #1160)**: Both the "Push Manifest" and "sign" steps used `github.event_name != 'pull_request'` conditionals, which caused them to fire even when `inputs.publish` was `false`. This resulted in "image not known" errors during validation builds on `lts` push events. PR #1157 and #1160 fixed this by gating both the "Push Manifest" step, the separate "sign" job, and individual signing steps on `inputs.publish`, ensuring they only execute when publishing is intended.
 
 Changes on the main branch typically go live within 30 minutes to 2 hours. Production releases on the lts branch occur weekly via the automated dispatcher or on-demand via manual dispatch.
 
@@ -385,6 +385,7 @@
 
 | File Path | Description | URL |
 |-----------|-------------|-----|
+| `AGENTS.md` | Authoritative CI architecture documentation | [View](https://github.com/ublue-os/bluefin/blob/main/AGENTS.md) |
 | `.github/workflows/scheduled-lts-release.yml` | Dispatcher workflow for weekly LTS releases | [View](https://github.com/ublue-os/bluefin/blob/main/.github/workflows/scheduled-lts-release.yml) |
 | `.github/workflows/promote-to-lts.yml` | Manual promotion workflow from main to lts | [View](https://github.com/ublue-os/bluefin/blob/main/.github/workflows/promote-to-lts.yml) |
 | `.github/renovate.json5` | Renovate configuration with branch restrictions | [View](https://github.com/ublue-os/bluefin/blob/main/.github/renovate.json5) |
@@ -401,6 +402,7 @@
 | `.github/workflows/build-latest.yml` | Latest stream build configuration | [View](https://github.com/ublue-os/main/blob/5ef6bb2adf95dd36b4d428e643a88ad510b7b988/.github/workflows/build-latest.yml) |
 | `.github/workflows/build-image-gts.yml` | GTS stream build configuration | [View](https://github.com/ublue-os/bluefin/blob/3f18fcfb4b16d8ae005cef071395c0132672ebce/.github/workflows/build-image-gts.yml) |
 | `.github/workflows/build-image-stable.yml` | Stable stream build configuration | [View](https://github.com/ublue-os/bluefin/blob/3f18fcfb4b16d8ae005cef071395c0132672ebce/.github/workflows/build-image-stable.yml) |
+| `.github/workflows/generate-release.yml` | Release generation triggered on workflow_dispatch builds | [View](https://github.com/ublue-os/bluefin/blob/main/.github/workflows/generate-release.yml) |
 
 ### Key Repositories
 

[Accept] [Decline]

Note: You must be authenticated to accept/decline updates.

How did I do? Any feedback?  Join Discord

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

Labels

area/dx Developer experience kind/documentation Improvements or additions to documentation kind/github-action Anything having to do with GHA and automation size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant