This document describes how to create pre-releases and full releases for the ODE monorepo, aligning all artefacts:
- Synkronus Docker images
- Synkronus CLI binaries
- Formulus Android APK
All releases use semantic versioning.
We use SemVer with a v prefix for git tags:
- Stable:
v1.2.0 - Pre-release:
v1.2.0-rc.1,v1.2.0-alpha.2, etc.
Avoid tags like v.1.2.0 (extra dot after v), which are not semver-style and may confuse tooling.
- Ensure the desired code is merged to
main. - Create and push the tag from the repo root:
git checkout main git pull git tag v1.2.0-rc.1 git push origin v1.2.0-rc.1
- In GitHub, create a new release:
- Tag:
v1.2.0-rc.1 - Mark as pre-release
- Publish
- Tag:
- GitHub Actions will:
- Build and publish Synkronus Docker image(s) for that tag
- Build Synkronus CLI binaries and attach them to the release
- Build Formulus Android signed APK and attach it to the release
- Use this GitHub pre-release for staging/QA and early adopters.
- Ensure
mainhas the final code (including all fixes from pre-releases). - Create and push the final tag:
git checkout main git pull git tag v1.2.0 git push origin v1.2.0
- In GitHub, create a new release:
- Tag:
v1.2.0 - Do not mark as pre-release
- Add release notes
- Publish
- Tag:
- GitHub Actions will:
- Build and publish Synkronus Docker images tagged
v1.2.0(and additional tags likev1.2,latestas configured) - Build Synkronus CLI binaries and attach them to the release
- Build Formulus Android signed APK and attach it to the release
- Build and publish Synkronus Docker images tagged
- Use this GitHub release as the single source of truth for production.
The ODE monorepo contains multiple artefacts that must stay in sync:
- Synkronus backend Docker image
- Synkronus CLI (multi-platform binaries)
- Formulus React Native Android app (signed APK)
All share the same semantic version tag:
- Stable releases:
vX.Y.Z(e.g.v1.2.0) - Pre-releases:
vX.Y.Z-rc.1,vX.Y.Z-beta.1, etc.
These tags are used consistently by the GitHub Actions workflows to:
- Build and tag Docker images in GHCR
- Attach CLI binaries to GitHub Releases
- Attach signed Android APKs to GitHub Releases
Use a pre-release when you want a candidate build that includes all artefacts, but is not yet considered final.
- Ensure all features and fixes intended for the pre-release are merged to
main. - Run tests locally or via CI as needed.
From the repo root (ODE):
git checkout main
git pull
git tag v1.2.0-rc.1
git push origin v1.2.0-rc.1Use semantic versioning with a pre-release suffix (e.g. v1.2.0-rc.1, v1.2.0-beta.1).
- Go to GitHub → Releases → Draft a new release
- Select the tag (e.g.
v1.2.0-rc.1) - Title:
v1.2.0-rc.1 - Check “This is a pre-release”
- Add any notes and click Publish release
When the release is published, the following workflows are triggered by the release: published event:
-
Synkronus Docker (
synkronus-docker.yml)- Builds Docker images for the Synkronus backend
- Tags images using the release tag (e.g.
v1.2.0-rc.1) - Publishes them to GitHub Container Registry (GHCR) under
ghcr.io/opendataensemble/synkronus
-
Synkronus CLI (
synkronus-cli.yml)- Builds CLI binaries for:
- Linux, Windows, macOS
- amd64 and arm64
- Attaches all binaries to the GitHub Release as assets
- Builds CLI binaries for:
-
Formulus Android (
formulus-android.yml)- Uses the configured keystore (via GitHub secrets) to build a signed release APK
- Attaches the APK to the GitHub Release as an asset
- The pre-release is ideal for staging environments, QA, and early adopters.
- All artefacts for that version are discoverable on a single GitHub Release page.
- Docker users can pull using the semver pre-release tag (e.g.
v1.2.0-rc.1).
Use a full release when you are ready to make a stable version available for general use.
- Ensure all required changes (including any fixes discovered during pre-release testing) are merged into
main. - Confirm that CI is green on
main.
From the repo root:
git checkout main
git pull
git tag v1.2.0
git push origin v1.2.0Use a clean semver tag without pre-release suffix (e.g. v1.2.0).
- Go to GitHub → Releases → Draft a new release
- Select tag
v1.2.0 - Title:
v1.2.0 - Do not mark as pre-release
- Add detailed release notes (changes, breaking changes, upgrade notes)
- Publish
Triggered by the release: published event:
-
Synkronus Docker (
synkronus-docker.yml)- Builds Docker images for Synkronus
- Tags may include:
v1.2.0v1.2latest(depending on current configuration)
- Publishes images to GHCR
-
Synkronus CLI (
synkronus-cli.yml)- Builds all CLI binaries (Linux/Windows/macOS, amd64/arm64)
- Attaches them to the
v1.2.0GitHub Release
-
Formulus Android (
formulus-android.yml)- Builds a signed release APK
- Attaches it to the
v1.2.0GitHub Release
- This GitHub Release is the single source of truth for:
- Docker image versions
- CLI downloads
- Android APK distribution
- Production deployments should generally use the stable semver tag (
v1.2.0) or the corresponding major/minor tags (v1.2), notlatest, unless documented otherwise.
Even without creating releases, your workflows provide helpful CI builds:
-
Push to
develop- Synkronus Docker builds images tagged as
develop(anddevelop-{sha}) for staging - CLI and Android workflows run CI builds (validation), but do not create release assets
- Synkronus Docker builds images tagged as
-
Push to
main- Synkronus Docker builds images tagged as
latestandmain-{sha} - CLI and Android workflows run CI builds and upload artifacts for inspection
- No GitHub Release is created unless you also create a tag and publish a release
- Synkronus Docker builds images tagged as
This separation lets you:
- Use
developfor integration and staging - Use
mainfor production candidates - Use tags + releases (
vX.Y.Z-rc.N,vX.Y.Z) to capture official versions with all artefacts aligned.