Skip to content

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: SingleMultiple
  • 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_apps module

Phase 2 — Workflow (committed: 3f7eaa4)

  • deploy-application.yml:
  • Added rollback: boolean input to workflow_dispatch
  • determine-environment outputs rollback flag
  • build-and-deploy skips when rollback=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

  1. First deploy: no existing blue label — bootstrap assigns it to the current active revision. Test by deploying to a fresh environment.
  2. 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 for name != GREEN_REVISION.
  3. FQDN for direct green smoke test: az containerapp revision show --query properties.fqdn — verify this field is populated for Multiple mode revisions. If empty, smoke test is skipped (assumes pass).
  4. Traffic shift --label-weight syntax: 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:

  1. Verify the dev deploy creates a green revision, smoke-tests it, and promotes it
  2. Check Azure Portal: old revision deactivated, active revision has blue label
  3. Test rollback: gh workflow run deploy-application.yml --field environment=dev --field rollback=true
  4. Then move to the release cut