Skip to main content

02 · CI/CD details

Document version v2026100501 · How a delivery becomes a deployment, and one way to build the pipeline that produces it. · interactive original ↗

From delivery to deploy (SRE side — contract)​

  1. D-1: the Release Manager opens one deployment request per repo — tag, full commit hash, release plan, revert method.
  2. Check: the tag must resolve to the delivered hash; a mismatch is not deployed.
  3. Gray: release day 11:00–14:00, the whole set, any number of rounds; a problem in any repo withdraws the whole set for re-delivery. Gray ends at 14:00; not passed → next release day.
  4. Production: each repo in release-plan order, same artifact digest as gray.
  5. Rollback: previous versions in reverse release-plan order, or a config-only toggle change.
Environment repo pathApproved byAfter approval
workloads/<svc>/<self-verification env>/Auto-mergedGitOps sync
workloads/<svc>/gray/SRE (CODEOWNERS)GitOps sync
workloads/<svc>/production-<cluster>/SRE (CODEOWNERS)GitOps sync
workloads/<svc>/production-vm/SREDeployment job checks out the tag on the VM and restarts
RollbackSREEach repo back to its previous version, in reverse release-plan order

App-repo pipeline (template)​

  • MR / push: test; manual deploy-dev; check-merge on MRs into master.
  • rc tag: tag-verify → build (the only build for gray / production) → request-deploy (opens the deployment request with tag, hash and digest).
  • Release tag: tag-verify → retag → release-notes → cleanup. The release tag neither builds nor deploys.
GuardConditions
check-merge (MR → master)Source is release/* or hotfix/*; its latest commit is exactly the rc in production; master is an ancestor of that commit.
tag-verify (tag pipeline)rc tag: commit is on release/* or hotfix/*. Release tag: commit is the tip of master, its file tree equals an rc, and that rc is its ancestor.

Three stacks (template)​

Next.jsJava Spring BootLaravel
Buildmulti-stage, output: 'standalone'multi-stage jar → JRE imagemulti-stage, composer install --no-dev
SettingsRuntime env on the server; no environment values in NEXT_PUBLIC_*Runtime env / mounted application-prod.yamlRuntime env → config/*.php
Restart on setting changeEnv: yes; mounted file: noYes (default)Yes (config:cache)
Health/api/health/actuator/health/readiness/up