Zašto dva sanctioned release patterna, a ne jedan?¶
TL;DR
Bitbucket re-čekuje $BITBUCKET_COMMIT na početku svakog stepa,
ne bilo koji commit koji je prethodni step push-ovao. Ako bump
napravi novi commit i push-uje tag, a build radi u istom
pipeline-u bez re-pinovanja — radi na PRE-bump commitu. Lacking
CHANGELOG update + tag. Release postaje neauditabilan. Zato
postoje dva sanctioned patterna, oba paze na ovo na svoj način.
Zakon¶
Build/deploy/notify za production release MORA raditi protiv
commita koji je bump kreirao, nikad protiv pre-bump commita.
Dva sanctioned patterna, oba validna, ne miješati.
Pattern 1 — Tag-triggered pipeline (klasičan)¶
bump pipeline (main):
bump → ... (gura tag v1.2.3)
tag pipeline (auto-triggered by v1.2.3):
build → scan → deploy → notify
Prednosti: potpuna separacija release i deploy; manual gate moguć; standardni CI/CD mentalni model.
Mana: treba drugi pipeline trigger (operator-fired custom:
run, ili ci/git/trigger_tag_pipeline.py /
ci/git/fan_out_pipeline.py).
Kada koristiti: release i deploy su namjerno decouplovani (staged approvals, manual gate, compliance).
Pattern 2 — Single-run re-checkout¶
bump pipeline (main):
bump → build → scan → deploy → notify
↑
make ci-checkout-release
(svaki step počinje ovim)
Prednosti: jedan pipeline, bez fan-out; potpuno automatski.
Mana: svaki step MORA imati make ci-checkout-release
prefix. Ako jedan nema — taj step radi na pre-bump commitu.
Ključni mehanizam: ci/git/checkout_release_commit.py
čita ci-state.json (pipeline.release_commit +
pipeline.release_mode), git fetch origin, git checkout
<release_commit>, verify HEAD == release_commit. Graceful
no-op ako nema release-a (artifact-only servis, non-production,
no-bump run) — zato je isti prefix SIGURAN za sve stepove.
Kada koristiti: cilj je potpuni release bez manual drugog pipeline triggera.
Kada NE treba release_commit guard¶
release.enabled: falseservis (artifact-only) —bumpne pravi commit ni tag, samo sjemeci-state.jsonsaimage_tag.- Non-production env (
BITBUCKET_DEPLOYMENT_ENVIRONMENT!=production). - No-bump run (npr.
make <svc>-builddirektno bezbump).
U sva tri slučaja pipeline.release_mode je false,
release_commit nije postavljen, i ci-checkout-release je
no-op. Zato je isti prefix siguran za sve stepove, ne samo
production.
Anti-patterns¶
- ❌
make <svc>-buildbezbumpu production pipeline-u — ako jebumptrebao kreirati commit, nisi ga pozvao. - ❌
bumpu pipeline-u,buildu istom pipeline-u bezci-checkout-release—buildradi na pre-bump commitu. - ❌ Staging bump + production build — staging nema
release_commit; guard mora biti production-scopan. ⚠️ci/state.py pipeline.release_commit --strictbez production scope će failati staging run. - ❌
<SVC>-release-productionMake target bezci-checkout-releaseprefixa — generisani target to već ima; ako praviš custom, provjeri.
Vidi i¶
v7.md§1 — "Onaj ko radi release"02-verbs/01-bump.md— štabumptačno zapisuje upipeline.release_commitci/verbs/CLAUDE.md— bump + tag +release_modelogikaci/git/checkout_release_commit.py— helperci/CLAUDE.md(root) sekcija "Release Invariant" — potpuni opis zašto ovo postojici/make/CLAUDE.md— Make targeti koji već imaju guard prefix