3.3 KiB
DevOps Release Workflow
This document describes the deployment and release process for KoalaSync.
Tag-Based Releases
KoalaSync uses an automated release pipeline triggered by immutable annotated Git tags.
Important
DO NOT edit individual version files before tagging. The workflow extracts the exact SemVer version from the tag and updates every release-version source atomically. Markdown-only changes do not require browser or release gates.
How it Works
When an annotated tag matching exact vMAJOR.MINOR.PATCH is pushed, the GitHub
Actions workflow performs these ordered gates:
- Validates that the tag is an annotated exact
vMAJOR.MINOR.PATCHtag, points at currentorigin/main, and has successfulverify,node20, ande2echecks. Invalid tags are rejected before any write. - Extracts the validated version and uses the tagged commit timestamp so repeated preparation is deterministic.
- Updates and validates all version sources:
extension/manifest.base.json,shared/constants.js,package.json, root metadata inpackage-lock.json,website/version.json,website/template.html,website/llms.txt, and both the README badge and release banner. - Creates
chore(release): update versions to vX.Y.Z [skip ci]and pushes it directly tomain. A failed push stops every dependent release job. - Checks out that exact prepared commit for full verification, cross-browser E2E, the unpublished relay health smoke, Chrome/Firefox/AMO/checksum/archive validation, website output, and the relay container build.
- Creates an attested draft GitHub Release after extension checks pass.
- Publishes the canonical lowercase image
ghcr.io/shik3i/koalasync, then verifies both platforms, attestation identity, digest, tag source, and a running health check. - Makes the GitHub Release public only after every preceding job succeeds.
Steps to Deploy a New Release
To release a new version (e.g., v2.5.1), follow these steps:
- Fast-forward local
main, confirm a clean tree at exactorigin/main, and wait forverify,node20, ande2eon that commit:git checkout main git pull --ff-only origin main test -z "$(git status --porcelain=v1)" test "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)" - Create an annotated exact SemVer tag on that commit. Do not run
prepare:release; the tag workflow owns version updates:git tag -a v2.5.1 -m "Release v2.5.1" - Verify the tag target, then push it once:
test "$(git rev-parse v2.5.1^{commit})" = "$(git rev-parse origin/main)" git push origin v2.5.1
Never reuse or move a published tag. Monitor every release job and verify both the public GitHub assets and GHCR digest before calling the release complete.
npm run release:gate -- MAJOR.MINOR.PATCH [--candidate] remains an optional
Linux/AMD64 parity diagnostic when release code changes. It prepares the target
version only inside an isolated clone. It is not required for Markdown-only
changes and does not replace the tag workflow's own gates.
The relay registry reference is always the canonical lowercase
ghcr.io/shik3i/koalasync. Docker repository names reject uppercase characters;
release:gate rejects workflows that derive this reference from the
case-preserving ${{ github.repository }} value.