- semantic-release: what version is this release? It reads conventional commits, decides the next version, writes the changelog, tags, and publishes.
- zerv: what version is this exact Git state? It computes a version for any commit on any branch. The builds semantic-release never sees.
zerv never writes tags or parses commit messages, so it cannot interfere with
semantic-release’s decisions. It only reads the tag semantic-release left behind.
On main: semantic-release, then zerv
zerv’s own CD pipeline does exactly this.cd.yml calls both
shared workflows:
semantic-release job also pins workflow-dispatch guard inputs.)
- The semantic-release job publishes and tags releases (
new_release_version,new_release_publishedoutputs). The zerv-versioning job runs only on valid semantic-release refs, via theif:gate shown above. - The zerv-versioning job (GitHub Actions) versions the current build for artifact naming, including on commits semantic-release skips because no new release was published.
On pull requests: zerv alone
PRs never reach semantic-release, so the PR pipeline runs zerv by itself: it versions the PR head, optionally tags a pre-release, and feeds semver, PEP440, and docker tags to the deploy jobs. zerv-flow is a working demonstration repo (trimmed from itsci.yml,
which pins workflows by commit SHA):
Choosing where each applies
- Release flow (changelog, publish, tag): semantic-release. zerv has no opinion and no tooling for it.
- Continuous artifact versioning (docker tags on every push, deploy manifests on PR previews): zerv. semantic-release only versions release commits.
- Non-conventional commit histories: zerv works from tags and distance alone, so it drops in without retraining your team on commit message format.
Where to go next
- Why zerv - the complementary positioning story
- GitHub Actions - the reusable versioning workflow
- zerv-flow - working demo repo for both halves of this split