fleet-release-production. Do not wire fleet releases to the generic production environment.
Fleet promotion reuses immutable GHCR images for the release SHA. It does not build Docker images. If the canonical web or worker image for sha-<gitSha> is missing, publish it with the Release Images workflow before running a real fleet promotion.
Required GitHub Environment Settings
Configure these values on thefleet-release-production environment. Store secret values only in GitHub environment secrets, never in docs, issues, PR bodies, logs, or committed files.
| Name | Kind | Purpose |
|---|---|---|
CONTROL_PLANE_AGENT_API_KEY | Secret | Lets GitHub Actions call the Ops control-plane MCP endpoint for discovery and verified inventory recording. |
RAILWAY_API_TOKEN | Secret | Lets GitHub Actions promote Railway web and worker services. |
AZURE_CLIENT_ID | Secret | Azure workload identity client used by azure/login. |
AZURE_TENANT_ID | Secret | Azure tenant used by azure/login. |
AZURE_SUBSCRIPTION_ID | Secret | Azure subscription used by azure/login. |
GHCR_IMPORT_TOKEN | Secret, optional | Used only when the workflow token cannot import GHCR images into Azure Container Registry. |
CONTROL_PLANE_URL | Variable | Ops control-plane origin. Defaults to https://ops.corgtex.com when unset. |
RAILWAY_GRAPHQL_ENDPOINT | Variable, optional | Railway GraphQL endpoint override. Leave unset unless Railway support directs otherwise. |
FLEET_RELEASE_STABLE_GIT_SHA | Variable | Latest stable 40-character git SHA. Update only after canary proof. |
FLEET_RELEASE_TARGETS_JSON | Variable | Railway customer targets, or leave unset only if control-plane discovery is intentionally used. |
FLEET_RELEASE_OPS_TARGET_JSON | Variable | Dedicated Ops target. |
FLEET_RELEASE_BACKUP_APP_TARGET_JSON | Variable | Backup app target. |
FLEET_RELEASE_AZURE_TARGET_JSON | Variable | Azure self-serve target. |
FLEET_RELEASE_ACR_SERVER | Variable, optional | Azure Container Registry server. Defaults to the production self-serve registry. |
FLEET_RELEASE_PREFLIGHT_MAX_SECONDS | Variable, optional | Dry-run preflight timing gate. Defaults to 30. |
GHCR_IMPORT_USERNAME | Variable, optional | GHCR username for Azure imports. Defaults to the GitHub Actions actor. |
Target Inventory Checklist
Each target variable may contain one target object or an array of target objects. Keep target inventory operational and sanitized: IDs, URLs, provider IDs, and release metadata are acceptable; raw customer content, credentials, private uploads, and bearer tokens are not. Railway targets must include:idlabelurlgroup, one ofrailway-customers,ops, orbackup-appprovider: "railway"railway.projectIdrailway.environmentIdrailway.webServiceIdrailway.workerServiceId
idlabelurlgroup: "azure-selfserve"provider: "azure"azure.resourceGroupazure.acrNameazure.webAppNameazure.workerAppName
Operator Checklist
- Confirm
fleet-release-productionhas the required secrets and variables for the selected target groups. - Confirm
FLEET_RELEASE_STABLE_GIT_SHApoints to the canary-proven stable release, not an arbitrarymaincommit. - Confirm the
Release Imagesworkflow has published both canonical GHCR images forsha-<FLEET_RELEASE_STABLE_GIT_SHA>. - Run a dry-run:
latest-stable, and plans rings without npm ci, Prisma generation, Docker build, Azure login, or provider mutation.
- Confirm the dry-run dispatches
fleet-release-preflight.yml, prints the manifest, selected targets, rings, blockers, and elapsed seconds before any provider mutation. - If the dry-run fails on missing config, fix the named GitHub environment setting and rerun.
- If the preflight takes longer than 30 seconds or reports unclear blockers, stop and repair the preflight before expanding release orchestration.
- For a real promotion, use a specific support reason and monitor the GitHub Actions run until each target proves matching
gitSha,imageTag,database=up, andschema=ready. - If any target fails, stop at the failed ring unless an operator explicitly supplies a force reason.
Gate For Next Work
The immutable-image workflow is sufficient only if a canary promotion reuses existing images, skips Docker build work inside fleet promotion, and proves matchinggitSha, imageTag, database=up, and schema=ready. Move to the next release PR only when this gate is not met.