Repository navigation
ci(release): refuse a non-empty milestone and close it after the release (#124) - #125
Merged
Merged
Conversation
…ase (#124) FerroSMART v0.1.0 was published while its milestone stayed open. The plan job now refuses a tag whose milestone, titled exactly as the tag, is missing or still holds an open item, and a final job closes that milestone once every leg, crates.io included, has succeeded. Both call scripts/release/milestone.sh, whose self-test runs in CI.
rubentalstra
enabled auto-merge
October 19, 2026 18:20
|
This was referenced Oct 19, 2026
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.



What changed and why
FerroSMART v0.1.0 was tagged and published on 2026-10-19 while its milestone stayed open. The release workflow now holds both ends of the "Milestones = releases" rule itself:
planrunsscripts/release/milestone.sh check <tag>before anything is created. It fails when no milestone is titled exactly as the tag, or when that milestone still holds an open issue or pull request, and the log names each one.milestonejob runsclose <tag>after every leg, the approval-gated crates.io leg included. It runs underalways()so a failed or refused leg is named in its log and the milestone stays open; re-running the failed jobs closes it. An already-closed milestone counts as done. The job holdscontents: read(to check out the script) andissues: write; the workflow-levelpermissions: {}is unchanged.-rc.N) finishes no milestone, so both steps accept it and change nothing.milestone.sh --self-testdrives both modes against a stub gh and runs in the CI shellcheck job.release.ymlbullet of.claude/rules/ci-cd.md, therelease-tagmemory, the release section of.claude/rules/issue-workflow.mdand a new memory file record the rule.No specification governs this: our own design. actionlint, zizmor and shellcheck are clean. The same change lands in every FerroHEALTH product repository.
Closes #124
Licensing of contributions
Checklist
shellcheck --severity=style,actionlint,zizmor --min-severity=low .github/.--self-testof the new script.no-changeloglabel.