Skip to content

Release guide fixes, gh commands and tag-only release CI - #4660

Merged
jhale merged 28 commits into
mainfrom
jhale/release-guide-fixes
Oct 18, 2026
Merged

jhale merged 28 commits into
mainfrom
jhale/release-guide-fixes

Conversation

@jhale

@jhale jhale commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Easiest to just read the RELEASE.md.


Stacked on #4658. I checked RELEASE.md against the current repositories and the v0.11.0 release, and ran its merge recipe on each release branch.

  • Merge recipe: git checkout --theirs . resets only conflicted paths. Release-only changes that merge cleanly survive: in a dry run FFCx kept UFCX_VERSION_IS_RELEASE true and DOLFINx kept fenicsx-refs.env pinned to v0.11.0. It also leaves the index unmerged and doesn't remove files deleted on main. git read-tree -u --reset origin/main after merge --no-commit gives main's tree exactly and keeps MERGE_HEAD.

  • fenicsx-refs.env: point it at dependency tags before tagging. v0.11.0 did this but the guide never said to. It now matters for Basix, whose wheel tests install UFL from ufl_ref since Require fenics-ufl>=2026.3.0.dev0 instead of a git URL basix#1102.

  • Release notes: add a step to finalise release_notes.md, and a new draft section in the main bump. Fix the v0.11.0 full diff link, which still compared against main.

  • PyPI: wait a few days after tagging, then build without publishing, publish to Test PyPI with an install check, and only then publish to PyPI, each with gh workflow run commands. Publish UFL, Basix, FFCx in that order so the dependency ranges resolve.

  • Post-release bump: spell out the dev-version form, and say not to cherry-pick fenicsx-refs.env back to main.

  • Release CI triggers: drop release from the push triggers of ccpp, ci, ci-spack, macos, windows and sonarcloud. Each push during a release ran all six against other components' half-updated release branches, and pushes don't cancel superseded runs. Basix and FFCx already run only on v* tags and workflow_dispatch. Tag runs stay, since they publish docs and test the exact released set. ci.yml and ci-spack.yml now run on v* tags. The ci-spack.yml tag filter sat under pull_request, so it never fired.

  • Integration tests: replace the workflow links (three were 404s) with gh workflow run/gh run list commands, dispatched once every release branch is updated. Dispatching UFL needs Run the FEniCSx integration tests on tags and manual dispatch ufl#540, which also drops its release push trigger.

  • Docker: gh workflow run commands with every input for the dev/test-env, end-user and update-stable workflows, each run from the DOLFINx tag.

  • Spack: FEniCS/fenics-spack and FEniCS/spack-packages no longer exist. The steps now keep FEniCS/spack-fenics in sync with upstream develop and send upstream PRs from a personal fork.

  • Fixes: CITATION.md → CITATION.cff, find_package(UFCx) → UFCxPython, "minor" → "patch" for bug-fix releases, and an outdated fenics-ufl example.

  • Consistency pass: one set of example versions (0.12.0, UFL 2026.3.0) throughout. Sections follow the overview order: GitHub releases and PyPI now come after the main bump, and downstream packaging and mistakes come last. The merge recipe and the run-and-wait step are each stated once. Each component's diff is checked before it is pushed. Tags are pushed by name. GitHub releases get gh release create commands with an explicit --notes-start-tag. GitHub's automatic choice picked v0.1.0 for DOLFINx and v0.10.0 for Basix, because release tags aren't ancestors of main.

  • Missing steps: patch releases now cherry-pick onto release without merging main. The release notes, CITATION.cff and issue template are updated on main first by PR, so they aren't lost after the release. Check the DOLFINx tag CI before producing artifacts. Bump main via PRs. .post0 releases are defined. A new Announcements step covers the website, Slack and LinkedIn.

  • ABI checks: a step towards versioning ufcx apart from FFCx, since ufcx.h changes more slowly. Before choosing version numbers, the releaser compares main with the previous tag: abidiff for ufcx.h, libbasix and libdolfinx, griffe for the Python APIs, and Basix element hashes and tabulated values. ufcx gets a new minor version only if its ABI changed, and main no longer bumps it after a release. Each component gets a new minor version only if the checks find an incompatible change, otherwise a patch release (e.g. Basix 0.11.1 alongside DOLFINx 0.12.0), and patch releases must change none of these. I tested the steps locally: the ufcx.h check finds no change from v0.11.0 to main but catches v0.9.0 → v0.10.0, griffe reports real API changes between UFL and DOLFINx tags, and Basix 0.9.0 → 0.10.0 changed pyramid Lagrange values without changing hash(). Depends on Read the UFCx version from ufcx.h in FindUFCxPython #4663, so that FindUFCxPython reads the ufcx version from ufcx.h.

RELEASE.md isn't mdformatted upstream, and formatting it would renumber every list, so I left that alone.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2

jhale and others added 4 commits October 18, 2026 12:03
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Replace `git checkout --theirs .` with `git read-tree -u --reset
origin/main`, which also drops cleanly merged release-only changes and
removes files deleted on `main`. Pin `fenicsx-refs.env` to tags before
tagging, since Basix wheel tests install UFL from it. Add the release
notes step, the PyPI publish order and the dev-version form for the
`main` bump. Fix the integration test links, `CITATION.cff`, the
`find_package` names, the patch-release wording and a broken Spack
link. Point the v0.11.0 full diff link at the tag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Pushes to `release` ran six DOLFINx workflows against other components'
half-updated `release` branches. Tags and `workflow_dispatch` remain.
`ci.yml` and `ci-spack.yml` now run on `v*` tags. The `ci-spack.yml` tag
filter was under `pull_request`, so it never fired. Use `gh` commands for
the Docker release workflows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
@jhale jhale changed the title Fix gaps and errors in the release guide Release guide fixes, gh commands and tag-only release CI Oct 18, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Base automatically changed from jhale/release-basix-ufl-bound to main October 18, 2026 12:04
jhale and others added 8 commits October 18, 2026 14:09
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Build without publishing, then Test PyPI with an install check, then
PyPI, a few days after tagging.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Use one set of example versions, order the sections as in the overview,
state the merge recipe and workflow waiting once, check the diff before
pushing, and add gh commands for GitHub releases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
GitHub's automatic previous tag picks old tags reachable from main, e.g.
v0.1.0, since release tags are only on release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Patch releases no longer merge main. Release notes, CITATION.cff and the
issue template are updated on main first so they are not lost. Check the
DOLFINx tag CI before producing artifacts, bump main via PRs, and say
what a .post0 release is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
jhale and others added 11 commits October 18, 2026 15:20
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
ufcx.h changes more slowly than FFCx, so its version is now bumped only
when abidiff reports an ABI change. Patch releases check the library
ABI too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Add griffe for the Python APIs, a Basix element comparison, the DOLFINx
header caveat and the build environment that wheels in a series share.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
The checks decide whether ufcx gets a new minor version and whether a
patch release is allowed, so they now come first in the guide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Name the refs explicitly so the result does not depend on what is
checked out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Each component gets a new minor version only for an incompatible change,
otherwise a patch version, decided separately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
jhale and others added 3 commits October 18, 2026 18:44
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
@jhale
jhale added this pull request to the merge queue Oct 18, 2026
Merged via the queue into main with commit 28d8af6 Oct 18, 2026
21 of 22 checks passed
@jhale
jhale deleted the jhale/release-guide-fixes branch October 18, 2026 18:21
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