Skip to content

Release Process

Overview

Production deployments are triggered by publishing a GitHub Release. There is no deploy-on-push to main. This gives full control over exactly what code reaches production and when.

code change → commit → push branch → create GitHub Release → auto-deploy

Both the API (Azure Functions) and the Portal (Azure Static Web Apps) deploy in parallel when the release is published.


Branches

Branch pattern Purpose
main CI build + test only (no deploy)
release/prod-vX.Y.Z Working branch for a release. All prod commits go here.

Do not merge release branches into main

Release branches are the source of truth for production. They are not merged back to main.


Step-by-step: Deploying to Production

1. Create a release branch (if you don't have one)

git checkout -b release/prod-v1.4.0
git push -u origin release/prod-v1.4.0

If continuing from a previous release branch, create the new one from it:

git checkout release/prod-v1.3.0
git checkout -b release/prod-v1.4.0
git push -u origin release/prod-v1.4.0

2. Make your changes

Commit and push to the release branch as normal:

git add -A
git commit -m "feat: description of change"
git push

3. Create a GitHub Release

This is what triggers the deploy. Use the GitHub CLI:

gh release create v1.4.0 \
  --target release/prod-v1.4.0 \
  --title "v1.4.0 – Short description" \
  --notes "- Change 1
- Change 2"

Or via the GitHub web UI:

  1. Go to ReleasesDraft a new release
  2. Tag: enter v1.4.0 (it will be created)
  3. Target: select release/prod-v1.4.0
  4. Title: v1.4.0 – Short description
  5. Notes: bullet list of changes
  6. Click Publish release

4. Verify the deploy

Check the workflow runs:

gh run list --limit 3

You should see two runs triggered by the release event:

Workflow Deploys to
Deploy API to Azure Functions (Prod) how-prod-api-func
Deploy Portal to Azure Static Web Apps (Prod) how-prod-portal

Both should complete in ~2–3 minutes. Check status:

gh run view <RUN_ID>

5. Smoke test

After deploy completes:

  1. Open results.houseofwellnessuk.com
  2. Log in as an admin
  3. Go to Diagnostics → check health shows green
  4. Verify the change is live

Hotfix process

For urgent fixes on top of an existing release:

# Stay on or checkout the current release branch
git checkout release/prod-v1.3.0

# Create the next branch from it
git checkout -b release/prod-v1.3.1
git push -u origin release/prod-v1.3.1

# Make the fix, commit, push
git add -A && git commit -m "fix: description" && git push

# Deploy
gh release create v1.3.1 \
  --target release/prod-v1.3.1 \
  --title "v1.3.1 – Hotfix description" \
  --notes "- Fix: what was fixed"

What triggers what

Event Workflow What happens
Push to main ci.yml Build + test only. No deploy.
Push to release/** with docs/ changes deploy-docs.yml Docs site rebuilds → docs.houseofwellnessuk.com
GitHub Release published deploy-api-prod.yml API builds and deploys to how-prod-api-func
GitHub Release published deploy-portal-prod.yml Portal builds and deploys to how-prod-portal

Docs site deploys

The docs site at docs.houseofwellnessuk.com deploys automatically when you push changes to any release/** branch that modify files in docs/ or docs-site/. No release needed — just push the commit.


Version numbering

We use semantic versioning:

  • Major (v2.0.0): Breaking changes
  • Minor (v1.4.0): New features
  • Patch (v1.3.1): Bug fixes / hotfixes

GitHub CLI quick reference

# List recent releases
gh release list --limit 5

# Create a release
gh release create v1.4.0 --target release/prod-v1.4.0 \
  --title "v1.4.0 – Description" --notes "- Changes"

# Check deploy status
gh run list --limit 5

# Watch a running deploy
gh run watch <RUN_ID>

# View deploy logs
gh run view <RUN_ID> --log

Release history

Version Date Branch Summary
v1.3.0 2026-04-13 release/prod-v1.2.0 Force poll endpoint returns 202 immediately (fire-and-forget)
v1.2.0 2026-04-13 release/prod-v1.1.0 Admin force-poll endpoint + portal UI button
v1.1.0 2026-04-13 release/prod-v1.0.0 ODX API caching, poller resilience (per-case timeout, ODX circuit breaker, run budget)
v1.0.0 2026-04-10 release/prod-v1.0.0 Initial production release