Refactor: Call the shared release workflow - #141
Merged
tykeal merged 1 commit intoAug 4, 2026
Merged
Conversation
The tag-push.yaml here duplicated a validate-then-promote job graph that almost a hundred repositories each carried their own copy of. Replace it with a caller that delegates to the release reusable in generic-workflows, pinned to v0.0.3. Rename the file to release.yaml. The name describes the outcome rather than the trigger, and sits beside the release-drafter.yaml that creates the draft this workflow publishes. The caller passes no inputs, so it adopts the organisation's default gating policy in full. Where a repository enforced only the versioning scheme, signature and pre-release checks, that adds four gates: enforce_increment, require_branch (default branch), require_recent (three minutes) and require_latest. Tags that are stale, raised off the default branch, or not at its tip now fail instead of producing a faulty immutable release. Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Matthew Watkins <mwatkins@linuxfoundation.org>
Copilot started reviewing on behalf of
ModeSevenIndustrialSolutions
August 3, 2026 22:22
View session
There was a problem hiding this comment.
Pull request overview
Refactors the repository’s tag-push release automation to delegate to the organization’s shared reusable release workflow, reducing duplicated workflow logic and adopting the shared release-gating defaults.
Changes:
- Removed the “fat”
.github/workflows/tag-push.yamlworkflow that validated tags and promoted draft releases locally. - Added
.github/workflows/release.yamlas a thin caller that invokeslfreleng-actions/generic-workflows/.github/workflows/release.yamlon tag pushes, retaining local concurrency behavior and skipping tag-deletion events.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
.github/workflows/tag-push.yaml |
Deletes the local validate+promote job graph that is being replaced by a reusable workflow call. |
.github/workflows/release.yaml |
Adds a thin reusable-workflow caller to handle tag-push releases with shared org defaults and preserved concurrency behavior. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
tykeal
approved these changes
Aug 4, 2026
tykeal
left a comment
Contributor
There was a problem hiding this comment.
🤖 Dependamerge
Approved this pull request ✅
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
tag-push.yamlhere duplicated a validate-then-promote job graph that 96repositories each carried their own copy of. This replaces it with a thin
caller delegating to the
release reusable in
generic-workflows,pinned to
v0.0.4
(
007258a132e4ba5358a20a5c0a902fa04de3a045).Renamed to
release.yamlThe name describes the outcome rather than the trigger, and sits beside the
release-drafter.yamlthat creates the draft this workflow publishes.Behaviour changes to be aware of
The caller passes no inputs, so it adopts the reusable's defaults in full —
the release-gating policy and the runner-hardening defaults.
1. Gating. Repositories that enforced only the versioning scheme, signature
and pre-release checks gain four gates:
enforce_incrementrequire_branchrequire_recentrequire_latestTags that are stale, raised off the default branch, or not at its tip now fail
rather than produce a faulty immutable release. This is the intended
organisation-wide default; it had simply not been rolled out everywhere. Eight
repositories already carried all eight gates — for those, nothing tightens.
2. Runner hardening. 14 repositories still ran harden-runner in
auditmode and move to
block. Every one of those 14 also lacks theharden-runner-block-actionallow-list loader, while all 82 onblockhaveit — they are stragglers on an older template, not deliberate opt-outs. After
this conversion all 96 run an identical workflow, so the egress profile is
uniform and already proven by the 82 running these exact steps under
block.3. Concurrency. Six repositories used a global group
(
${{ github.workflow }}), serialising all releases; they move to theestate-standard per-tag group (
${{ github.workflow }}-${{ github.ref }}).Distinct tags are independent work, and the reusable serialises itself per-tag
as well.
mark_latestdefaults totrue, matching thelatest: truethe old promotestep passed.
Tag deletions
Deleting a tag also fires this
pushevent. The reusable already guards itsown jobs with
if: ${{ !github.event.deleted }}, but the caller carries theguard too so that — exactly as before — no run starts at all.
Validation
The reusable and this caller pattern were exercised end-to-end in
test-release-process,the repository built to test the organisation's release tooling: a signed tag
push validated against the full gate set and promoted its draft release. This
generated caller passes
actionlintandyamllintagainst this repository'sown configuration.
Review note
The caller keeps its own
concurrencyblock. That is safe: the reusableserialises under
generic-workflows-release-${{ github.ref }}, a literalprefix that cannot collide with the caller's own group.
timeout-minutesis deliberately absent — GitHub does not permit it on a jobthat calls a reusable workflow (
actionlintrejects it). The reusable sets itsown timeouts of 2, 5 and 5 minutes on its three jobs.