Handoff: Blue/Green Deployment¶
Branch: feat/blue-green-deployment
PR: #423
Status: PR open, CI running
What was done¶
Phase 1 — Bicep (committed: 24596e4)¶
infra/modules/container_apps.bicep:- All three apps (frontend, backend, UIGen) switched from
activeRevisionsMode: Single→Multiple - Added
param revision_suffix string = '' - Added
revisionSuffix: !empty(revision_suffix) ? '${revision_suffix}-{be|fe|ui}' : ''to each template block infra/main.bicep:- Added
param revision_suffix string = '' - Wired through to
container_appsmodule
Phase 2 — Workflow (committed: 3f7eaa4)¶
deploy-application.yml:- Added
rollback: booleaninput toworkflow_dispatch determine-environmentoutputsrollbackflagbuild-and-deployskips whenrollback=true- Bicep deploy now passes
revision_suffix="green-${SHORT_SHA}" - Bicep deploy outputs
resource_group,frontend_app,backend_app,uigen_app,revision_suffix - New step Blue/Green traffic shift (
id: blue-green) runs after Bicep deploy:- Locates green revision by suffix
- Bootstraps blue label on first deploy
- Labels green revision, smoke-tests via direct FQDN (5 retries × 15s)
- On pass: shifts traffic, promotes green→blue, deactivates old
- On fail: deactivates green, fails workflow
- New job rollback: restores blue-labelled revision to 100% traffic
What remains (Phase 3 — nice-to-have, not blocking)¶
- Phase 3 is already listed in the plan but is minimal since rollback is implemented:
- The rollback job (
workflow_dispatch rollback=true) is done - Optional: add a GitHub Actions summary showing before/after revision state
- Optional: deactivate all non-blue revisions (currently only deactivates one)
Known edge cases to verify after merge¶
- First deploy: no existing
bluelabel — bootstrap assigns it to the current active revision. Test by deploying to a fresh environment. az containerapp revision label list: the command returns labels across all revisions. If the blue label is already on the green revision (e.g. racing promote step), the logic still works because we look forname != GREEN_REVISION.- FQDN for direct green smoke test:
az containerapp revision show --query properties.fqdn— verify this field is populated forMultiplemode revisions. If empty, smoke test is skipped (assumes pass). - Traffic shift
--label-weightsyntax:az containerapp ingress traffic set --label-weight green=100 blue=0— verify this CLI syntax is correct in the deployed AZ CLI version.
Next session¶
After PR #423 is merged and CI passes:
- Verify the dev deploy creates a green revision, smoke-tests it, and promotes it
- Check Azure Portal: old revision deactivated, active revision has
bluelabel - Test rollback:
gh workflow run deploy-application.yml --field environment=dev --field rollback=true - Then move to the release cut