Skip to content

Release process

main → staging is continuous. main → prod is promoted manually via a GitHub Actions workflow_dispatch.

PR merged to main
GitHub Actions: test, build image, push to Artifact Registry
Auto-deploy: Cloud Run staging (staging.tappass.ai)
▼ (manual approval)
Promote to prod (app.tappass.ai)
  1. Actions → “Deploy to prod” → Run workflow → branch: main
  2. Pick the image tag (defaults to latest that passed staging)
  3. Release notes auto-generated from commits since the last prod deploy
  4. Traffic shifts in two steps: 10% → watch 5 min → 100%
Terminal window
# Fast rollback via Cloud Run revisions
gcloud run services update-traffic tappass \
--to-revisions=tappass-prev=100 \
--region=europe-west1

Or re-run the “Deploy to prod” workflow with the previous image tag.

Manual bump + tag.

Terminal window
# in tappass-sdk/
uv version patch # or minor, major
git commit -am "release: $(uv version --short)"
git tag v$(uv version --short)
git push && git push --tags

A GitHub Actions workflow triggers on tags, publishing to PyPI.

Push to main → auto-deploy to Cloudflare Pages. No manual step.

Push to main → auto-deploy to Cloudflare Pages.

  • Customer-facing SDK changes: update CHANGELOG.md in tappass-sdk/ before tagging
  • Server changes that affect the API: update docs/src/content/docs/api.md
  • Any governance-pipeline change: update docs/src/content/docs/governance/pipeline.md

Non-trivial features ship behind flags. Pattern:

if config.feature_flags.new_trust_engine:
use_new_engine()
else:
use_legacy()

Flags configured in config/feature_flags.yaml. Kill-switches always default to the safer path.