Skip to content

fix(ci): fail the merge gate on cancelled jobs, and key the lint cache on the toolchain - #58

Merged
onedr0p merged 1 commit into
mainfrom
fix/ci-gate-and-lint-cache
Jul 30, 2026
Merged

onedr0p merged 1 commit into
mainfrom
fix/ci-gate-and-lint-cache

Conversation

@onedr0p

@onedr0p onedr0p commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Two CI defects, both swept across the org after they surfaced in home-operations/miroir. Sibling PRs are open elsewhere with the identical changes.

Build Success treated cancelled as passing

The job runs under if: ${{ !cancelled() }}, which still fires when individual needs were cancelled but the run as a whole was not. needs.*.result then contains cancelled, not failure, so Any jobs failed? is skipped and All jobs passed or skipped? exits 0. Branch protection sees the gate green even though a required job never reached a verdict.

Reachable here: concurrency.cancel-in-progress is on for pull_request, so a superseded push is the ordinary way into that state, not a corner case.

The golangci-lint cache could poison itself

That cache holds analyzer facts (staticcheck's "does this call return?"), so a stale or partial entry does not just cost time: it turns checks like SA5011 into false positives on code the commit never touched. miroir hit exactly that, twice, on byte-identical trees, and it blocked its merge queue.

The key hashed only go.sum and .golangci.yml, so a bad entry survives any commit touching neither, and the bare-prefix restore-keys hands it to every subsequent run until GitHub's 7-day eviction.

  • the key now covers .mise/mise.lock, so a golangci-lint or Go bump starts fresh instead of handing a new binary the old one's facts
  • restore-keys is gone: a miss must start cold rather than fall back to the newest entry under the prefix

Exact hits stay the norm, since the three hashed inputs are stable across most PRs. When one does change, a cold cache is the correct outcome.

Verified: actionlint (with the org's -ignore flags), zizmor, oxfmt --check.

…e on the toolchain

Build Success runs under !cancelled(), which still fires when individual
needs were cancelled but the run as a whole was not. needs.*.result then
contains cancelled rather than failure, so Any jobs failed? was skipped and
All jobs passed or skipped? exited 0: branch protection saw the gate green
even though a required job never reached a verdict. Reachable here because
concurrency cancels in-progress runs on pull_request, so a superseded push
is the ordinary path into that state.

The golangci-lint cache holds analyzer facts, so a stale or partial entry
does not just cost time: it turns staticcheck checks like SA5011 into false
positives on code the commit never touched. home-operations/miroir hit
exactly that and it blocked its merge queue. The key hashed only go.sum and
.golangci.yml, so a bad entry survives any commit touching neither, and the
bare-prefix restore-keys hands it to every subsequent run until GitHub's
7-day eviction. The key now covers .mise/mise.lock so a golangci-lint or Go
bump starts fresh, and restore-keys is gone so a miss starts cold rather
than inheriting the newest entry under the prefix.

Both defects were swept across the org after surfacing in miroir.

Signed-off-by: Devin Buhl <devin@buhl.casa>
@onedr0p
onedr0p added this pull request to the merge queue Jul 30, 2026
Merged via the queue into main with commit b4afcdd Jul 30, 2026
7 checks passed
@onedr0p
onedr0p deleted the fix/ci-gate-and-lint-cache branch July 30, 2026 15:57
@sticky-gecko sticky-gecko Bot mentioned this pull request Jul 30, 2026
gabrielcosi pushed a commit to gabrielcosi/home-ops that referenced this pull request Aug 21, 2026
….2 ➔ 0.2.3) (#473)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/home-operations/charts/echo](https://github.com/home-operations/echo) | patch | `0.2.2` → `0.2.3` |

---

### Release Notes

<details>
<summary>home-operations/echo (ghcr.io/home-operations/charts/echo)</summary>

### [`v0.2.3`](https://github.com/home-operations/echo/blob/HEAD/CHANGELOG.md#023-2026-08-21)

[Compare Source](home-operations/echo@0.2.2...0.2.3)

##### Bug Fixes

- **chart:** keep example comments out of unrelated schema descriptions ([#&#8203;83](home-operations/echo#83)) ([6ce9ab2](home-operations/echo@6ce9ab2))
- **ci:** fail the merge gate on cancelled jobs, and key the lint cache on the toolchain ([#&#8203;58](home-operations/echo#58)) ([b4afcdd](home-operations/echo@b4afcdd))
- **go:** update module go (1.26.4 → 1.26.5) ([#&#8203;70](home-operations/echo#70)) ([8661ad5](home-operations/echo@8661ad5))
- **go:** update to go 1.27.0 ([#&#8203;84](home-operations/echo#84)) ([f9ba0a6](home-operations/echo@f9ba0a6))

##### Documentation

- add AGENTS.md with Go conventions ([#&#8203;62](home-operations/echo#62)) ([b218df4](home-operations/echo@b218df4))
- make AGENTS.md a generic, drift-resistant template ([#&#8203;64](home-operations/echo#64)) ([28d45d9](home-operations/echo@28d45d9))

##### Build System

- **mise:** add actionlint and refresh the lockfile ([#&#8203;50](home-operations/echo#50)) ([beda1ff](home-operations/echo@beda1ff))

##### Continuous Integration

- gate pull requests on a single Build Success check ([#&#8203;49](home-operations/echo#49)) ([8c394eb](home-operations/echo@8c394eb))
- **github-action:** Update action actions/stale (v10.4.0 → v11.0.0) ([#&#8203;59](home-operations/echo#59)) ([6255ec0](home-operations/echo@6255ec0))
- **github-action:** Update action docker/github-builder (v1.14.0 → v1.15.0) ([#&#8203;57](home-operations/echo#57)) ([25c7b5b](home-operations/echo@25c7b5b))
- **github-action:** Update action docker/github-builder (v1.15.0 → v1.16.0) ([#&#8203;73](home-operations/echo#73)) ([6fc568c](home-operations/echo@6fc568c))
- **github-action:** Update action docker/login-action (v4.5.1 → v4.5.2) ([#&#8203;60](home-operations/echo#60)) ([85c0d4d](home-operations/echo@85c0d4d))
- **github-action:** Update action docker/login-action (v4.5.2 → v4.6.0) ([#&#8203;63](home-operations/echo#63)) ([5cf5338](home-operations/echo@5cf5338))
- **github-action:** Update action home-operations/.github/actions/workflow-lint (v1.0.2 → v1.0.3) ([#&#8203;69](home-operations/echo#69)) ([42bac11](home-operations/echo@42bac11))
- **github-action:** Update action jdx/mise-action (v4.2.1 → v4.2.2) ([#&#8203;52](home-operations/echo#52)) ([c9298e0](home-operations/echo@c9298e0))
- **github-action:** Update action jdx/mise-action (v4.2.3 → v4.2.4) ([#&#8203;71](home-operations/echo#71)) ([5283840](home-operations/echo@5283840))
- **github-action:** Update github-actions ([#&#8203;53](home-operations/echo#53)) ([d6334ce](home-operations/echo@d6334ce))
- **github-action:** update workflow-lint action (1.0.0 → v1.0.2) ([#&#8203;66](home-operations/echo#66)) ([967c73a](home-operations/echo@967c73a))
- lint workflows with the shared composite action ([#&#8203;51](home-operations/echo#51)) ([c668830](home-operations/echo@c668830))
- skip release-please version-bump PRs in checks ([#&#8203;48](home-operations/echo#48)) ([2de44cc](home-operations/echo@2de44cc))
- wire govulncheck into mise and CI ([#&#8203;68](home-operations/echo#68)) ([2eb630c](home-operations/echo@2eb630c))

##### Miscellaneous Chores

- **github-action:** update action jdx/mise-action (v4.2.4 → v4.2.5) ([#&#8203;78](home-operations/echo#78)) ([d4e845d](home-operations/echo@d4e845d))
- **go:** pin go directive to 1.26.0 ([#&#8203;79](home-operations/echo#79)) ([88e2148](home-operations/echo@88e2148))
- **mise:** prune lockfile to used platforms ([#&#8203;67](home-operations/echo#67)) ([32591e5](home-operations/echo@32591e5))
- **mise:** Update tool cosign (3.1.2 → 3.1.3) ([#&#8203;74](home-operations/echo#74)) ([5edab8a](home-operations/echo@5edab8a))
- **mise:** update tool go (1.26.5 → 1.26.6) ([#&#8203;82](home-operations/echo#82)) ([9d4a187](home-operations/echo@9d4a187))
- **mise:** update tool go:golang.org/x/vuln/cmd/govulncheck (1.6.0 → v1.7.0) ([#&#8203;77](home-operations/echo#77)) ([731f12d](home-operations/echo@731f12d))
- **mise:** update tool helm (4.2.3 → 4.2.4) ([#&#8203;81](home-operations/echo#81)) ([32b85b4](home-operations/echo@32b85b4))
- **mise:** Update tool oxfmt (0.60.0 → 0.61.0) ([#&#8203;54](home-operations/echo#54)) ([d40cd22](home-operations/echo@d40cd22))
- **mise:** Update tool oxfmt (0.61.0 → 0.62.0) ([#&#8203;72](home-operations/echo#72)) ([5b7a778](home-operations/echo@5b7a778))
- **mise:** Update tool oxfmt (0.62.0 → 0.63.0) ([#&#8203;75](home-operations/echo#75)) ([7114dc7](home-operations/echo@7114dc7))
- **mise:** Update tool zizmor (1.28.0 → 1.29.0) ([#&#8203;65](home-operations/echo#65)) ([4ad14aa](home-operations/echo@4ad14aa))
- **release-please:** standardize the release pull request title pattern ([#&#8203;61](home-operations/echo#61)) ([d13101b](home-operations/echo@d13101b))
- standardize release-please changelog sections ([#&#8203;56](home-operations/echo#56)) ([007ec54](home-operations/echo@007ec54))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Berlin)

- 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**: Whenever PR becomes conflicted, 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 [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zMC4zIiwidXBkYXRlZEluVmVyIjoiNDQuMzAuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUvY29udGFpbmVyIiwidHlwZS9wYXRjaCJdfQ==-->

Reviewed-on: https://git.xcd.dev/gabrielcosi/home-ops/pulls/473
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant