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.
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. Every target must includeprovider: "azure" or provider: "railway"; provider is never derived from its group, hostname, or URL. Workload selectors are managed-customers, selfserve, ops, and backup-app. The legacy railway-customers and azure-selfserve selectors remain read-compatible and emit deprecation information.
Railway targets must include:
idlabelurlgroup, one ofmanaged-customers,selfserve,ops, orbackup-appprovider: "railway"railway.projectIdrailway.environmentIdrailway.webServiceIdrailway.workerServiceId
idlabelurl- an explicit workload
group provider: "azure"azure.resourceGroupazure.acrNameazure.webAppNameazure.workerAppName
selfserve Azure targets are mutable in PR1. Azure managed-customer, core, backup, and Ops targets are shown with blockers and remain non-mutable until the generic Azure executor lands in PR3; they never inherit selfserve resource defaults.
Set deploymentStatus or provisioningStatus to RETIRED or SUSPENDED, or set releaseEligible: false, as soon as a target cannot receive releases. Default and all selections exclude those targets. A specific workload selection reports them as blockers and a real run fails before provider mutation.
Operator Checklist
- Confirm
fleet-release-productionhas the required inventory and credentials for the providers on the selected targets. Azure-only releases do not requireRAILWAY_API_TOKEN; Railway-only releases do not require Azure credentials. - Confirm
FLEET_RELEASE_STABLE_GIT_SHApoints to the canary-proven stable release, not an arbitrarymaincommit. Do not advance it while any blocking customer-read probe, support-connector readiness check, or required recorder smoke is pending. - Confirm the
Release Imagesworkflow has published both canonical GHCR images forsha-<FLEET_RELEASE_STABLE_GIT_SHA>. - Confirm Railway targets can pull private GHCR images. Prefer setting
GHCR_IMPORT_TOKEN; otherwise the workflow will pass its short-livedGITHUB_TOKENas Railway registry credentials for the current promotion. - 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.ymland prints each target’s workload, provider, ring, criticality, resource identifiers, deprecations, and blockers before any provider mutation. Ops must be in the final ring. - 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,schema=ready, passing customer-read probes, andsupportConnectorReadiness.status=ready. - If any target fails, stop at the failed ring unless an operator explicitly supplies a force reason.
MISSING_SUPPORT_SCOPE means the support connector credential needs an audited scope repair. It is not customer OAuth/sign-in reauthorization.
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, schema=ready, customer-read probes, and support-scope readiness. Move to the next release PR only when this gate is not met.