Repository navigation
Release guide fixes, gh commands and tag-only release CI - #4660
Merged
Merged
Conversation
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
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
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
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JudYk8UecTQyirGsLsHUN2
…ixes # Conflicts: # RELEASE.md
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
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
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.
Easiest to just read the
RELEASE.md.Stacked on #4658. I checked
RELEASE.mdagainst the current repositories and the v0.11.0 release, and ran its merge recipe on eachreleasebranch.Merge recipe:
git checkout --theirs .resets only conflicted paths. Release-only changes that merge cleanly survive: in a dry run FFCx keptUFCX_VERSION_IS_RELEASE trueand DOLFINx keptfenicsx-refs.envpinned to v0.11.0. It also leaves the index unmerged and doesn't remove files deleted onmain.git read-tree -u --reset origin/mainaftermerge --no-commitgivesmain's tree exactly and keepsMERGE_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 fromufl_refsince 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 themainbump. Fix the v0.11.0 full diff link, which still compared againstmain.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 runcommands. 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.envback tomain.Release CI triggers: drop
releasefrom thepushtriggers ofccpp,ci,ci-spack,macos,windowsandsonarcloud. Each push during a release ran all six against other components' half-updatedreleasebranches, and pushes don't cancel superseded runs. Basix and FFCx already run only onv*tags andworkflow_dispatch. Tag runs stay, since they publish docs and test the exact released set.ci.ymlandci-spack.ymlnow run onv*tags. Theci-spack.ymltag filter sat underpull_request, so it never fired.Integration tests: replace the workflow links (three were 404s) with
gh workflow run/gh run listcommands, dispatched once everyreleasebranch is updated. Dispatching UFL needs Run the FEniCSx integration tests on tags and manual dispatch ufl#540, which also drops itsreleasepush trigger.Docker:
gh workflow runcommands 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
developand send upstream PRs from a personal fork.Fixes:
CITATION.md→CITATION.cff,find_package(UFCx)→UFCxPython, "minor" → "patch" for bug-fix releases, and an outdatedfenics-uflexample.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
mainbump, 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 getgh release createcommands with an explicit--notes-start-tag. GitHub's automatic choice pickedv0.1.0for DOLFINx andv0.10.0for Basix, because release tags aren't ancestors ofmain.Missing steps: patch releases now cherry-pick onto
releasewithout mergingmain. The release notes,CITATION.cffand issue template are updated onmainfirst by PR, so they aren't lost after the release. Check the DOLFINx tag CI before producing artifacts. Bumpmainvia PRs..post0releases are defined. A new Announcements step covers the website, Slack and LinkedIn.ABI checks: a step towards versioning ufcx apart from FFCx, since
ufcx.hchanges more slowly. Before choosing version numbers, the releaser comparesmainwith the previous tag:abidiffforufcx.h,libbasixandlibdolfinx, griffe for the Python APIs, and Basix element hashes and tabulated values. ufcx gets a new minor version only if its ABI changed, andmainno 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: theufcx.hcheck finds no change from v0.11.0 tomainbut 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 changinghash(). Depends on Read the UFCx version from ufcx.h in FindUFCxPython #4663, so thatFindUFCxPythonreads the ufcx version fromufcx.h.RELEASE.mdisn'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