Skip to content

fix: remove top-level concurrency block causing preflight deadlock - #105

Merged
jflowers merged 1 commit into
unbound-force:mainfrom
jflowers:fix/release-concurrency-deadlock
Aug 19, 2026
Merged

fix: remove top-level concurrency block causing preflight deadlock#105
jflowers merged 1 commit into
unbound-force:mainfrom
jflowers:fix/release-concurrency-deadlock

Conversation

@jflowers

Copy link
Copy Markdown
Contributor

Problem

The Release workflow's preflight job fails at startup with 0 steps executed
(null runner, inverted timestamps). This affects every release attempt —
both runs 32280364928 and 32288949495 failed identically.

Root Cause

The caller release.yml and the org-infra reusable preflight workflow
(reusable_release_preflight.yml) both declare:

concurrency:
  group: release-${{ github.repository }}
  cancel-in-progress: false

Both resolve to release-unbound-force/dewey. The caller run acquires
the group, then its child preflight job requests the same group —
creating a self-deadlock. GitHub resolves this by failing the reusable
job at startup.

Evidence

A/B comparison with replicator: replicator uses the identical org-infra
workflows at the same pinned SHA but its caller release.yml has no
top-level concurrency block
— and its preflight ran all 9 steps
successfully.

Fix

Remove only the top-level concurrency: block (4 lines). The reusable
preflight already self-serializes via its own job-level concurrency group,
so the caller guard is redundant.

All other hardening is preserved:

  • validate-branch job (main-branch enforcement)
  • Dual-arch (amd64 + arm64) macOS signing and notarization
  • Robust cask checksum patching with verification
  • Strict semver (no allow_prerelease)

After Merge

Re-run: gh workflow run release.yml --repo unbound-force/dewey -f tag=v3.3.0

The preflight will detect v3.3.0 as a re-run (tag exists at HEAD), skip
creation, verify CI (build-and-test + MegaLinter are green on cd25cc0),
and proceed to GoReleaser.

The caller release.yml and the org-infra reusable preflight workflow
both declare concurrency group 'release-${{ github.repository }}'.
When the caller run acquires the group, the child preflight job
requests the same group, creating a self-deadlock — GitHub fails
the reusable job at startup (0 steps, null runner).

Replicator's release.yml omits the caller-level concurrency block
and works correctly. The reusable preflight already self-serializes
via its own job-level concurrency group, so the caller guard is
redundant.

Remove only the top-level concurrency block (4 lines). All other
hardening (validate-branch, dual-arch macOS signing, robust cask
checksum patching) is preserved.
@jflowers
jflowers force-pushed the fix/release-concurrency-deadlock branch from e8230c7 to faa869e Compare August 19, 2026 21:28
@jflowers
jflowers merged commit 6e1c9c8 into unbound-force:main Aug 19, 2026
2 checks passed
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.

2 participants