Preskoči na sadržaj

Zašto ci-state.json nije env-fajl?

TL;DR

ci-state.json je struktuirani state artifact sa shemom (ci/json/ci-state.schema.json), atomic write preko pipeline_state.write_state_with_mirrors, i jedini writer je ci/pipeline_state.py. Legacy *.env fajlovi (gdje se vrijednosti export-uju u shell) su mrtvi od v3 — ne koriste se nigdje.

Legacy env-fajl contract (mrtav, nemoj vaskrsavati)

# Ovo NE POSTOJI u v3:
export IMAGE_TAG=$(cat built_services.env)
export DEPLOYMENT=$(cat deployment.env)

Stari pattern:

  • built_services.env — koje servise je build uspio
  • image_tag.env — koji tag za svaki
  • deployment.env — deployment status
  • security-scan.env — scan rezultati
  • CI_SHARED_IMAGE_MAP, CI_SERVER_PATH_MAP, CI_SHARED_FILES, CI_SHARED_SCRIPTS, CI_TAGGED_SERVICE_BUNDLES, CI_SERVER_PATTERN, CI_DOCKER_SERVICES_JSON

Sve ovo je uklonjeno. Ako vidiš legacy yml skripte koje source built_services.env, to je stari kod koji nije migriran.

Zašto env-fajl ne radi

# env-fajl parsiranje je shell-specifično
# quote handling, multiline, special chars su noćna mora

# Ako IMAGE_TAG sadrži :
export IMAGE_TAG="registry:5000/api:1.2.3"
# shell parsira kao "registry" + ":5000/api:1.2.3"
# (zapravo radi, ali specificity)

# Ako sadrži whitespace:
export IMAGE_TAG="my tag with spaces"
# Kasnije u skripti: $IMAGE_TAG se split-uje na whitespace

# JSON-ovi sa strukturiranim podacima (list, dict):
export SERVICES='["api", "worker"]'
# Shell ga tretira kao string, ne kao list. Iteracija:
for svc in $SERVICES; do  # RADI ali samo zato što nema razmaka
    echo $svc
done
# Prava struktura (nested dict, lists of dicts) — IMPOSSIBLE u env

Što ci-state.json rješava

{
  "pipeline": {
    "deployment_type": "production",
    "release_commit": "abc123...",
    "release_mode": true,
    "head_commit": "def456..."
  },
  "services": {
    "api": {
      "version": "1.2.3",
      "image_tag": "1.2.3",
      "image": "infopuls/api:1.2.3",
      "build": {
        "status": "deployed",
        "duration_seconds": 245
      },
      "deploy": {
        "status": "deployed",
        "task_definition_arn": "arn:aws:ecs:..."
      }
    }
  }
}
  • Nested struktura: services.api.build.status, services.api.deploy.status
  • Typed: release_mode: bool, image_tag: string, services: dict
  • Validated: schema enforces shape
  • Atomic write: temp + rename, ne half-written fajl
  • Dual-write: canonical + per-service shards
  • Inspectable: ci/state.py pipeline.release_commit --strict

Kako se čita

# Jedan field:
ci/state.py services.api.image_tag
# Output: 1.2.3

# Strict (fail ako nema):
ci/state.py services.api.image_tag --strict

# Ili u Pythonu:
from ci.pipeline_state import load_state
state = load_state("ci-state.json")
tag = state.services["api"].image_tag

Vidi i