Release Process
Namespaced Tags
Section titled “Namespaced Tags”This monorepo contains multiple independently deployable surfaces. Production releases use namespaced tags to identify which surface is being released.
| Surface | Tag Pattern | Example | Workflow |
|---|---|---|---|
| Pexip SDK | pexip-sdk/v<major>.<minor>.<patch> | pexip-sdk/v1.2.3 | deploy-pexip-sdk-prod.yml |
| Agent App | agent-app/v<major>.<minor>.<patch> | agent-app/v2.0.1 | deploy-agent-app-prod.yml |
| Customer App | customer-app/v<major>.<minor>.<patch> | customer-app/v1.0.0 | deploy-customer-app-prod.yml |
Note: As of May 2026, production workflows and tagging are staged for cutover but not yet in use. Activation is pending Change Advisory Board (CAB) approval to fully transition production deployments from Azure DevOps to GitHub Actions.
Each prod workflow’s trigger filters on its own prefix - creating pexip-sdk/v1.2.3 triggers only the pexip-sdk prod deploy, not agent-app or customer-app.
How to Cut a Release
Section titled “How to Cut a Release”Prerequisites
Section titled “Prerequisites”- The code is merged to
mainand deployed to the test environment. - UAT has passed on the test environment.
- You have push access to the repository (or bypass permissions for tag protection rules).
# 1. Ensure you're on main and up to dategit checkout main && git pull
# 2. Create the namespaced taggit tag pexip-sdk/v1.2.3
# 3. Push the tag to trigger the production workflowgit push origin pexip-sdk/v1.2.3Replace pexip-sdk/v1.2.3 with the appropriate surface and version number.
What Happens Next
Section titled “What Happens Next”- SWA surfaces (agent-app, customer-app): The workflow deploys directly to the production Static Web App.
- Pexip SDK: The workflow deploys to the
stagingslot, then performs a slot swap to promote to production (see below).
Manual Dispatch Fallback
Section titled “Manual Dispatch Fallback”Production SWA workflows also support workflow_dispatch with a confirmation input. Navigate to the workflow in the GitHub Actions UI and type deploy when prompted:
workflow_dispatch: inputs: confirm: description: "Type 'deploy' to confirm manual production deployment" required: trueAny value other than deploy (or blank) causes the job to skip.
Pexip SDK Slot-Swap Model
Section titled “Pexip SDK Slot-Swap Model”The pexip-sdk production deployment uses a two-swap pattern across three Function App slots:
Slot Topology
Section titled “Slot Topology”| Slot | Purpose |
|---|---|
production | Live production traffic |
staging | Receives the next candidate release (disposable - overwritten each cycle) |
staging-2 | Retains the previous production version for immediate rollback |
Promotion Flow
Section titled “Promotion Flow”Starting state: production=V, staging-2=V-1 (rollback), staging=stale
- Deploy - V+1 is deployed to the
stagingslot (automated via tag trigger) - Swap 1 -
production ↔ staging: production=V+1, staging=V - Swap 2 -
staging ↔ staging-2: staging-2=V (becomes the new rollback)
Final state: production=V+1, staging-2=V (rollback), staging=V-1 (stale)
Rollback
Section titled “Rollback”To roll back production to the previous version:
az webapp deployment slot swap \ --resource-group rg-application \ --name fa-maxconf-prod \ --slot staging-2 \ --target-slot productionThis immediately puts the previous version (V) back into production.
Viewing Release History
Section titled “Viewing Release History”# All releases for a specific surface:git tag -l "pexip-sdk/v*"
# All production releases across all surfaces:git tag -l "*/v*"Production Safeguards
Section titled “Production Safeguards”| Safeguard | Applies To | How It Works |
|---|---|---|
| Namespaced tag trigger | All prod workflows | Only fires on tags matching the exact pattern |
| Manual confirmation | SWA prod workflows | workflow_dispatch requires typing deploy |
environment: prod gate | All prod workflows | If required reviewers are configured, the job pauses for approval |
| Cron on default branch only | VM scheduler | GitHub schedules only execute on main |