v8.1.0
New Features
CheckReleaseVersion.yml- a new job template refusing a release before it is tagged (#261). ItsVersionCheckjob compares the version from the pull-request title or tag with the__version__in the Python code, andRegistryCheckasks a package registry whether that version is already released. Both run early in the pipeline, so a missing version bump or a duplicate release shows within the first minutes.CompletePipeline.ymlcalls it asVersionCheckand gatesTriggerTaggedRelease,ReleasePageandPublishOnPyPIon its result.- New inputs on
CompletePipeline.yml:version_file(default'__init__.py'),check_pypi_duplicate(default'true'),pypi_url(default'https://pypi.org') andpypi_upload_url(default'https://upload.pypi.org/legacy/').
UpdateVersionBranch.yml- proposes the update of a major-version branch as a pull-request, titled likeUpdating r8 from v8.1.0(#260). A new major branches off the highest existing lower major, and self-references (<owner>/<repo>[/<path>]@<ref>, workflow-status badges) are rewritten on anupdate/<branch>branch, so no consumable branch is force-pushed. Proven inpyTooling/SynchronizeForksacross v1.0.0 and v1.0.1.CheckMarketplaceMetadata.yml- validates an action's metadata against the GitHub Marketplace rules on every push: file at the repository root, name, description shorter than 125 characters, branding icon and colour, public repository (#260). The Marketplace itself checks this only at publish time, in a web form.PrepareJob.yml: new inputpublish_pages_onand outputpublish_pages(#259) - a newline separated list of or-ed conditions on the pipeline's ref:default-branch,main-branch,development-branch,release-branch,release-tag,nightly-tag,branch=<regexp>andtag=<regexp>.CompletePipeline.ymlforwards it and gatesPublishToGitHubPageson the result, so a repository chooses when GitHub Pages are published. An unknown condition or a broken regular expression fails every pipeline, not only the tag run.PublishOnPyPI.yml: new inputdry_run, forwarded byCompletePipeline.ymlaspypi_dry_run(#256). The twotwine uploadsteps are replaced by onetwine check, so a pipeline building a package that is never published validates its metadata instead of failing at the upload.PublishOnPyPI.yml: new inputpypi_upload_url, passed totwine upload --repository-url, so packages can go to another registry (#261).Pipeline.yml- this repository releases itself from a workflow of its own (#265). The release logic used to sit inside_Checking_JobTemplates.yml, a test workflow, which is why the v8.0.0 tag had to be created by hand. The five_Checking_*.ymlworkflows keep their ownpushtrigger and their own, separately readable runs;Pipeline.ymlholds no test jobs.Prepareclassifies the commit, andVerificationswaits for the runs of those five workflows for that commit and fails if one of them didn't succeed - one request per poll covers all five, a workflow that concluded is dropped from the wait, and the interval and timeout are thepoll_interval(15 s) andpoll_timeout(6600 s) dispatch inputs.TriggerTaggedReleasethen tags the release commit. A tag created with the pipeline's token raises nopushevent, so the job starts this workflow again throughworkflow_dispatchat the tag; in that runReleasePagepublishes the notes andUpdateVersionBranchopens the pull-request movingr8.- It runs on every branch, so the roll-up of the five verification workflows is available for any commit, while the release jobs need a merge commit on
mainor a release tag.
Changes
⚠️ A failing version check refuses the release (#261).CompletePipeline.yml'sVersionCheckcompared the version before, but no job depended on it - a mismatch was a red job while tagging and publishing went on. It now runs wheneverPreparereports a version, fails instead of being skipped when it can't check, and blocks the tag, the release page and the PyPI upload.⚠️ TagReleaseCommit.ymlrefuses to tag if the tag or a release page for that version already exists (#261). Before, an existing tag failedcreateRefby accident and an existing release page wasn't noticed.Parameters.yml: new outputpackage_version- the__version__ofpackage_version_file(#261).- The pip → MSYS2 table maps matplotlib (#262), as
python-matplotlib:p, for a requirement on matplotlib itself and for the extrapyTooling[diagram]. pip can't build matplotlib inside MSYS2. numpy was already mapped. UpdateVersionBranch.ymlreads its inputs directly instead of throughenv:blocks, and exportsGH_TOKENin the script likePrepareJob.ymlandPublishReleaseNotes.yml(#263).- The default release-notes footer names the job template that writes it -
pyTooling/Actions::PublishReleaseNotes.ymlinstead of::Release.yml. The text appears on every consumer's release page; a repository overridingrelease_notes_footeris unaffected.
Bug Fixes
- A tag publishes to GitHub Pages again (
8fc18bc).CompletePipeline.ymlguardsPublishToGitHubPageson the ref, because thegithub-pagesenvironment rejects a deployment from a feature branch before a runner is assigned. The guard was an allowlist of the default branch anddev; on a tag pushgithub.ref_nameis the tag, so the job was skipped - silently, on the release run, whose documentation matters most.github.ref_type == 'tag'is admitted now, feature branches still aren't. PublishReleaseNotes.ymlkeeps a release page's existing text when re-run, instead of replacing it with the preliminary notes (#256).
Documentation
- New pages
CheckReleaseVersion.rst,UpdateVersionBranch.rstandCheckMarketplaceMetadata.rst, listed in their categories and in the templates overview. CompletePipeline.rstdocumentsversion_file,check_pypi_duplicate,pypi_url,pypi_upload_url,pypi_dry_runandpublish_pages_on; its Behavior names the new checks and what they refuse.PublishOnPyPI.rstdocumentsdry_runandpypi_upload_url;PrepareJob.rstdocumentspublish_pages_onandpublish_pages;Parameters.rstdocumentspackage_version.Development.rstgains the rule behind the Pages fix: a condition gating a job on the ref is a blocklist of refs that cannot work, never an allowlist of refs that have been seen to work.
GitHub Pipeline
_Checking_JobTemplates.ymlrunsCheckReleaseVersion.ymlfor an unreleased version ofpyTooling, and_Checking_Parameters.ymlcheckspackage_versionandpackage_version_filefor the simple and the namespace fixture package._Checking_Parameters.ymlcheckspublish_pagesfor a branch, a release tag and a nightly tag.- The release jobs left
_Checking_JobTemplates.ymlforPipeline.yml(#265).PublishOnPyPIthere became a dry-run test that runs on every pipeline instead of only on a release tag, and both fixture pipelines setpypi_dry_run: 'true'. latex_table_style = ["booktabs"]indoc/conf.py. Sphinx' default addscolorrows, which makes colortbl's\CT@everycrand\everycrexpand into each other until TeX's input stack is full - the PDF build died in the first table of the documentation. Tables keep the booktabs rules and lose their alternating row colours.
Known Issues
Verificationsoccupies a runner while it waits - up topoll_timeout, with the job's two hourtimeout-minutesbehind it.- A failed run has to be re-run completely -
gh run rerun <id>, nevergh run rerun <id> --failed, and only after the run has finished.CleanupArtifactsis guarded by!cancelled(), so it deletes the intermediate artifacts even when the job consuming them failed; re-running just the failed jobs then stops atUnable to download artifact(s): Artifact not found. This affects every pipeline built fromCompletePipeline.yml, not only this repository.
Related Issues and Pull-Requests
Note
Why 8.1.0 and not 9.0.0. No parameter changes its meaning: every change either adds an input with a default that keeps the previous behaviour, or makes a check that was already there refuse a release it should never have allowed (#261).
Two defaults are worth naming. check_pypi_duplicate defaults to 'true', so a release commit asks PyPI - a package that isn't published there answers 404 and passes. And VersionCheck now fails where it used to be skipped: a repository keeping __version__ somewhere other than the package's root __init__.py has to set version_file. Every repository calling CompletePipeline.yml keeps it in the root __init__.py.
Published from Pipeline workflow triggered by github-actions[bot] on 2026-09-16 23:11:41 UTC.
This automatic release was created by pyTooling/Actions::PublishReleaseNotes.yml