Skip to main content
zerv is designed to be complementary to semantic-release. The tools answer different questions:
  • 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.
The split in practice: 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. The reasoning behind this split: semantic-release stays on main; zerv prereleases every other branch.

On main: semantic-release, then zerv

zerv’s own CD pipeline does exactly this. cd.yml calls both shared workflows:
(Trimmed. The real semantic-release job also pins workflow-dispatch guard inputs.)
  • The semantic-release job publishes and tags releases (new_release_version, new_release_published outputs). The job succeeds on every push to main, even when nothing is released: on a non-release commit with no tag on HEAD, new_release_version is empty and new_release_published is false. The zerv-versioning job runs on every valid semantic-release run, via the if: 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.
For builds that must match a semantic-release output exactly, pin the tag version from its output instead of letting zerv detect it. When no release was published and HEAD carries no tag, the output is empty and zerv falls back to its own tag-based versioning:

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 its ci.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
Last modified on September 16, 2026