Same binary across every environment. crane copies at the registry level, digest verified after every promotion.
Forge uses a split pipeline. CI builds and pushes to Dev ECR. Classic Release handles promotion. Argo CD reconciles the cluster from the Ledger.
Build.BuildId tag. No latest.conveyor/scripts/.image.tag, Argo CD syncs automatically (dev/QA) or waits for manual sync (prod).| Component | Type | In Git? | Purpose |
|---|---|---|---|
application-ci-pipeline.yml | YAML template | Yes | Build, Trivy scan, push to Dev ECR |
| Classic Release pipeline | ADO UI | No | Promote artifacts: Dev → QA → Prod |
copy-artifact.sh | Script | Yes | Cross-account image copy via crane |
update-ledger.sh | Script | Yes | Update image.tag in Ledger manifest |
ec2-deploy-pipeline.yml | YAML template | Yes | EC2 deployment via SSM (Dagster, etc.) |
Developer pushes to main. Trivy filesystem scan → language build (.NET / Python) → Docker build → Trivy image scan → push to Dev ECR with tag Build.BuildId.
Classic Release auto-triggers. Runs update-ledger.sh on the dev manifest. Argo CD syncs within 30 seconds.
Runs copy-artifact.sh to copy the image from Dev ECR to QA ECR via crane (digest verified). Then update-ledger.sh on the QA manifest. Argo CD syncs.
Requires platform-engineer approval (no self-approve). Copies artifact to Prod ECR, updates Ledger. Argo CD does not auto-sync — engineer manually syncs after verification.
crane copies at the registry level — no Docker daemon, no re-build. Digest is verified after every copy (SOC 2 compliant).Build.BuildId only. No latest. ECR repos configured with immutable tags. The CI template enforces this — no override.#platform-support.image.tag via update-ledger.sh with optimistic locking and retry.ConveyorDeployRole-<env> in the target account.| Environment | CI trigger | Promotion | Approval | Argo CD sync |
|---|---|---|---|---|
| Dev | Push to main | Automatic | None | Auto |
| QA | — | Click-to-promote or auto | Optional (QA lead) | Auto |
| Prod-Wealth | — | Manual + approval | Required (no self-approve) | Manual only |
EC2 services (e.g. Dagster) use ec2-deploy-pipeline.yml instead of Ledger / Argo CD:
docker-compose.yml to the EC2 via SSM Run Commandforge-refresh-env — pulls config from SSM Parameter StoreIMAGE_TAG is written to .env (Build ID from pipeline)docker-compose pull, then docker-compose up -d restartsEC2s are targeted by tag (e.g. forge:dagster-enabled=true). No SSH — all operations go through SSM.
| Method | Speed | Use when |
|---|---|---|
| Classic Release: redeploy previous stage | Minutes | Standard rollback |
| Argo CD UI: click Rollback | Seconds | Emergency — prod has no auto-sync, stays rolled back |
Ledger PR: revert image.tag | Minutes | Formalise the rollback in Git |
git revert on Ledger | Minutes | Nuclear — revert an entire promotion |
| Method | Speed | Use when |
|---|---|---|
| Classic Release: redeploy previous stage | Minutes | Standard rollback |
SSM: manual docker-compose pull with old tag | Minutes | Emergency |