Release Process¶
tiderace uses trunk-based development with semantic versioning. A release is cut by pushing a version tag; CI then builds and publishes the binaries.
Versioning¶
Versions follow semver (MAJOR.MINOR.PATCH):
| Change | Bump |
|---|---|
| Bug fix, docs, perf | patch 0.0.x |
| New, backwards-compatible feature | minor 0.x.0 |
| Breaking change | major x.0.0 |
Cutting a release¶
Releases are triggered by a version tag, not by a push to main:
git tag v0.2.0 # the semver for everything since the last tag
git push origin v0.2.0 # → triggers .github/workflows/release.yml
release.yml (also runnable manually via workflow_dispatch) then:
- builds
tideraceandtiderace-daemonfrom theengine/workspace (cargo build --release), - stages them as
tiderace-linux-x86_64/tiderace-daemon-linux-x86_64with asha256sums.txt, - uploads them as a build artifact and — on a tag push — attaches them to the GitHub Release.
Workflow overview¶
flowchart TD
PUSH["push / PR → main"] --> CI["ci.yml: build · lint · test · coverage<br/>(engine/ workspace, linux + windows)"]
PUSH --> DOCS["docs.yml: build + deploy the MkDocs site"]
TAG["push tag v*"] --> REL["release.yml: build tiderace · tiderace-daemon<br/>→ attach to the GitHub Release"] CI workflows¶
See .github/workflows/ for the full definitions:
| File | Trigger | Purpose |
|---|---|---|
ci.yml | Push to main, PRs | Build · clippy · fmt · test + the coverage gate over the engine/ workspace (linux + windows) |
release.yml | Tag push (v*) or manual dispatch | Build the tiderace / tiderace-daemon binaries and attach them to the GitHub Release |
docs.yml | Push to main (docs paths) | Build and deploy the MkDocs site to GitHub Pages |
Caching in CI¶
The project's workflows cache the Cargo registry, git dependencies, and engine/target (keyed on engine/Cargo.lock) so builds stay fast — that's the only thing they cache.
Caching .tiderace-state.json (impact-analysis state) is a pattern for running tiderace in your own project's CI to skip unchanged tests — see CI. It doesn't apply to this pipeline, which builds and tests the engine itself rather than running a downstream suite through the daemon.