Preskoči na sadržaj

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 nedostupanbump fail-uje sa VendorAuthError-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_BACKEND env var — DEPRECATED, commit-uj u services.json.

Vidi i