Expo fingerprint gate¶
TL;DR
EAS build uvijek gradi novi native binary, čak i za isti
source commit. Fingerprint gate preskače build ako se app kod
nije promijenio. Tri backenda: Flagsmith (default), Infisical,
git (svaki commit-based). Per-platform (runtime_version_source:
per-platform) je JEDINA supported konfiguracija od v22.
Problem: "isti kod, novi binary"¶
Bez fingerprint gate:
commit 1: app kod = v1 → EAS build → binary v1
commit 2: CHANGELOG samo (isti app kod) → EAS build → binary v2
↑ isti kod, novi bundle
commit 3: app kod = v1.1 → EAS build → binary v3
Rezultat: 3 bina, samo 2 jedinstvena koda. Korisnik dobija nepotrebne download-ove, review je konfuzan.
Sa fingerprint gate:
commit 1: fingerprint = fp_A → EAS build → binary v1
commit 2: fingerprint = fp_A (isti) → SKIP → binary v1 ostaje aktivan
commit 3: fingerprint = fp_B (novi kod) → EAS build → binary v3
Kako radi¶
1. `bump` verb:
- računa fingerprint iz app koda (ignore CHANGELOG, .md, lockfile)
- čita PRETHODNI fingerprint iz version-state backend-a
- ako isti → NE radi EAS build (skip)
- ako različit → zapiše novi fingerprint + radi EAS build
Fingerprint = hash očišćenog app source tree-a. Lockfile, CHANGELOG,
.md, .gitignore su isključeni.
Konfiguracija¶
{
"services": {
"mobile": {
"build": {
"kind": "expo",
"expo": {
"fingerprint_gate": {
"enabled": true,
"backend": "flagsmith", // flagsmith | infisical | git
"per_platform": {
"ios": { "runtime_version": "1.0.0", "fingerprint": "fp_ios_A" },
"android": { "runtime_version": "1.0.0", "fingerprint": "fp_and_A" }
}
}
}
}
}
}
}
runtime_version_source: per-platform (v22+, jedina supported
opcija): svaka platforma ima svoj runtime_version i fingerprint.
Nema više shared gate.
Tri backenda¶
| Backend | Trade-off | Default? |
|---|---|---|
| flagsmith | HTTP API, brz, dobar audit trail | DA |
| infisical | Secret store, koristi se već za env vars | ako Flagsmith nije dostupan |
| git | JSON file na dedicated branch (e.g. fingerprint-state) |
fallback, sporiji |
| backoffice (v25+) | Version-store HTTP API, native revision CAS | za backoffice-integrated projekti |
CI_VERSION_STATE_BACKEND env var je DEPRECATED — koristi
services.<name>.build.expo.fingerprint_gate.backend u services.json.
Failure modes¶
- Backend nedostupan →
bumpfail-uje saVendorAuthError-like exit 2. NE preskače gate "za sigurnost". - Stari fingerprint ne postoji (prvi run) → tretira kao različit, gradi normalno.
- Race condition (dva pipeline-a paralelno) → distributed lock (F38 mobile namespace) osigurava jednog graditelja.
Anti-patterns¶
- ❌ Onemogućen gate "za develop" — develop gradi svaki put; pipeline se usporava, CI quota troši.
- ❌ Shared
runtime_version(pre-v22) — napušteno, NE koristi. - ❌
CI_VERSION_STATE_BACKENDenv var — DEPRECATED, commit-uj uservices.json.
Vidi i¶
02-verbs/01-bump.md— bump logika02-verbs/04-deploy-eas.md— EAS deployci/version_state/CLAUDE.md— Protocol + factoryci/flagsmith/version_state_backend.py