Skip to content

ci: the release workflow runs every lane of dotnet.yml on the tagged commit before it packs - #537

Open
CaffeinatedCoder wants to merge 1 commit into
mainfrom
ci/342-release-runs-every-lane
Open

CaffeinatedCoder wants to merge 1 commit into
mainfrom
ci/342-release-runs-every-lane

Conversation

@CaffeinatedCoder

Copy link
Copy Markdown
Owner

Closes #342

Problem

release.yml's Verify and pack job ran the suite once, on the default integration image, so a release was tested on PostgreSQL 16 only. PostgreSQL 18, the consumer smoke test against a feed of its own and, on release/10.x, the EF Core float legs were left to the commit's pull request. Nothing ties a tag to a commit whose pull request, or whose push run, was green.

Change

  • dotnet.yml gains workflow_call.
  • release.yml gains a job ci that uses ./.github/workflows/dotnet.yml, and verify needs it. verify loses its own dotnet test step: ci ran the whole suite on the same commit, the conventions project included. It keeps the tag check, the pack, the smoke test against dist and the SBOMs.
  • Concurrency. dotnet.yml's group is now dotnet-${{ github.workflow }}-${{ github.ref }}. In a called workflow github.workflow is the caller's name, so the old group was Release-<ref> there, and GitHub compares group names without case: that is the group release.yml itself holds (release-<ref>). The called jobs would have waited for their own caller.
  • ReleaseWiringConventionTests, two tests:
    • TheReleaseWorkflow_RunsEveryLaneBeforeItPacks: dotnet.yml is callable, a job in release.yml uses it, and verify needs that job.
    • TheCalledBuildWorkflow_NeverSharesTheReleaseWorkflowsConcurrencyGroup: both groups evaluated for the release workflow's name and one ref, compared without case.

A mistyped tag now fails after the lanes rather than before them. That costs one CI run and nothing else: the ruleset forbids moving or deleting a v* tag, so that tag was lost either way.

Tests

Conventions: 419 passed. Each guard proven by seeding on the committed change, then restored:

Seed Fails
The old group, ${{ github.workflow }}-${{ github.ref }} TheCalledBuildWorkflow_…: "dotnet.yml's concurrency group is 'Release-refs/tags/v1.2.3', and release.yml holds 'release-refs/tags/v1.2.3'"
needs: ci removed from verify TheReleaseWorkflow_…: "The verify job (needs: nothing) does not wait for 'ci'"
workflow_call removed TheReleaseWorkflow_…: "dotnet.yml has no workflow_call trigger"
ci uses another workflow TheReleaseWorkflow_…: "No job in release.yml uses ./.github/workflows/dotnet.yml"

Two dry runs of the release workflow are in a comment below: this branch as it is, and a throwaway branch with a seeded failing integration test.

The cherry-pick to release/10.x follows in its own PR; the dry run there is the one that shows the float legs.

🤖 Generated with Claude Code

…commit before it packs (#342)

release.yml ran the suite once, on PostgreSQL 16, and relied on the commit's
pull request for PostgreSQL 18, the own-feed smoke test and, on release/10.x,
the EF Core float legs. Nothing ties a tag to a commit whose pull request or
push run was green.

- dotnet.yml gains workflow_call, and release.yml a `ci` job that uses it.
  `verify` needs `ci` and loses its own test step.
- dotnet.yml's concurrency group gets a `dotnet-` prefix. Called from the
  release workflow it was `Release-<ref>`, which GitHub compares without
  case to release.yml's own `release-<ref>`: the called jobs would have
  waited for their caller.
- ReleaseWiringConventionTests holds both: the call and the dependency, and
  that the two groups cannot be equal.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@CaffeinatedCoder CaffeinatedCoder added this to the 11.0.0 milestone Nov 11, 2026
@CaffeinatedCoder CaffeinatedCoder added chore Build, CI, packaging, refactoring with no behaviour change area/release Versioning, changelogs, release wiring labels Nov 11, 2026
@CaffeinatedCoder

Copy link
Copy Markdown
Owner Author

Dry runs of the release workflow (2026-11-11)

Both started with gh workflow run release.yml --ref <branch> -f dry_run=true.

This branch, as it is (run 42977816466): success in 5 minutes. No deadlock between the two concurrency groups.

Job Result Time (UTC)
CI / Test (ubuntu-latest) success 07:12:40–07:14:35
CI / Integration (PostgreSQL 16) success 07:12:40–07:15:45
CI / Integration (PostgreSQL 18) success 07:12:40–07:15:50
CI / Integration (live PostgreSQL) success 07:15:52–07:15:54
CI / Consumer smoke test (own feed) success 07:12:39–07:14:10
CI / Pack success 07:12:40–07:14:42
Verify and pack (smoke test against dist) success 07:15:56–07:17:35
Publish, GitHub release skipped (dry run, not a tag)

Verify and pack started two seconds after the last CI job ended, so it did wait.

A seeded failing integration test (run 42978030642), on a throwaway branch with one extra test in the infinity-disabled integration project that calls Assert.Fail:

Job Result
CI / Test, CI / Pack, CI / Consumer smoke test success
CI / Integration (PostgreSQL 16) failure: Failed SeededFor342_AFailingIntegrationLegStopsTheRelease, 1 failed, 7 passed
CI / Integration (PostgreSQL 18) failure, the same test
CI / Integration (live PostgreSQL) failure
Verify and pack skipped
Publish, GitHub release skipped

So a failing lane stops the release before anything is packed.

A first seeded run (42977824183) proved nothing and is not counted: its seed changed nullable flow in an existing test, the build failed with CS8602, and every job failed for that reason. The throwaway branch is deleted.

Not shown here: the EF Core float legs, which only release/10.x has. The cherry-pick applies cleanly there (conventions 422 passed locally), and its dry run belongs to the 10.x PR, after this one merges.

This branch has not been deployed

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

Labels

area/release Versioning, changelogs, release wiring chore Build, CI, packaging, refactoring with no behaviour change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Release: run every CI lane (PostgreSQL 16 and 18, both smoke modes, the EF float legs) before publishing

1 participant