Kako radi tag verb (i fan_out_pipeline)?¶
TL;DR
tag verb je dispatcher: kad god Bitbucket pipeline triggera sa
BITBUCKET_TAG postavljenim, on pokreće bump → build → deploy →
notify sekvencu za taj tag. Koristi se za Release Invariant
Pattern 1 (tag-triggered pipeline). fan_out_pipeline.py je
helper za programsko triggerovanje tag pipeline-a iz drugog
pipeline-a (npr. iz main bump-a).
tag verb¶
Ulaz: BITBUCKET_TAG env var (npr. v1.2.3).
Šta radi:
- Pročitaj
BITBUCKET_TAG. - Validira format (mora match-ovati
release.tag_pattern+ prefix). - Pokreni sekvencu:
za servis koji odgovara tagu (ili za sve ako je generic tag).
4. Svaki verb u sekvenci dobija BITBUCKET_TAG kao env var.
5. --wait po defaultu (kao i deploy).
ci/run.py tag --env production --wait je canonical poziv.
fan_out_pipeline.py¶
Helper za programsko triggerovanje tag pipeline-a iz drugog pipeline-a:
from ci.git.fan_out_pipeline import trigger_tag_pipeline
trigger_tag_pipeline(
tag="v1.2.3",
services=["api", "worker"],
wait=True, # blokira dok se svi pipeline-i ne završe
)
Koristi se u:
- Multi-service release: bump main pipeline triggeruje tag pipeline za svaki servis paralelno.
- Re-trigger: operater ručno želi ponoviti deploy istog taga (npr. nakon fix-a).
Pattern 1 vs Pattern 2 (release invariant)¶
Pattern 1 (tag-triggered): Pattern 2 (single-run re-checkout):
main pipeline: main pipeline:
bump bump
fan_out_pipeline ──┐ ↓
↓ build (ci-checkout-release)
tag pipeline: scan (ci-checkout-release)
build deploy (ci-checkout-release)
scan notify (ci-checkout-release)
deploy
notify
tag verb je Pattern 1. Pattern 2 koristi
make ci-checkout-release
umjesto fan-out.
Kada koristiti koji¶
- Pattern 1 (tag): release i deploy decouplovani. Manual gate moguć. Multi-service fan-out.
- Pattern 2 (single-run): jedan pipeline, bez fan-out. Brže, ali sve u jednom run-u.
Većina release-ova koristi Pattern 2 danas. Pattern 1 za stage-gated compliance flow.
Failure modes¶
BITBUCKET_TAGunset → exit 1 saERROR: BITBUCKET_TAG env var not set. Tag verb je besmislen bez taga.- Tag format ne matchuje pattern → exit 1.
- Inner pipeline fail →
tagizlazi sa exit kodom inner pipeline-a (po defaultu). NE retry.
Vidi i¶
v7.md§2 "Kako radi"03-release/01-two-patterns.md— Pattern 1 vs Pattern 201-bump.md— šta bump zapisuje u stateci/verbs/tag.py— implementacijaci/git/fan_out_pipeline.py— helperci/git/CLAUDE.md— Bitbucket REST + git helpers