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:
- Go to Releases → Draft a new release
- Tag: enter
v1.4.0(it will be created) - Target: select
release/prod-v1.4.0 - Title:
v1.4.0 – Short description - Notes: bullet list of changes
- 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:
- Open results.houseofwellnessuk.com
- Log in as an admin
- Go to Diagnostics → check health shows green
- 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 |