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 uspioimage_tag.env— koji tag za svakideployment.env— deployment statussecurity-scan.env— scan rezultatiCI_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¶
v7.md§2 — "Gdje da promijenim" (state mapa)02-systems/01-two-schemas.md— zašto dva artefakta02-systems/03-ci-state-map.md— field-by-field katalog02-systems/12-state-write-protocol.md— dual-write contractci/pipeline_state.py— jedini writerci/state.py— CLI reader