Aller au contenu

Release

Environnements, versioning, et comment les builds arrivent sur les stores. Pour les mécaniques CI, voir ci-cd.md.

Environnements

Sélectionnés via la variable d'environnement ENVFILE (consommée par react-native-config). Ne jamais committer de secrets.

Deux mécanismes d'env, un seul .env

react-native-config (natif) honore ENVFILE, mais le bundle JS utilise aussi react-native-dotenv (babel, imports @env comme REACT_APP_GRAPHGQL_URL dans src/store/index.ts) qui lit un chemin .env codé en dur — il ignore ENVFILE et échoue sur toute variable manquante (allowUndefined: false). Un build doit donc avoir .env réglé sur l'env cible : les schémas iOS font cp .env.<env> .env, et le workflow de déploiement fait de même avant de builder. En local .env existe déjà, c'est pourquoi les builds locaux ne rencontrent pas ce problème.

Fichier REACT_APP_RUNNING_ENV
.env staging (défaut)
.env.development development
.env.local dev
.env.staging staging
.env.prod production

Noms de variables notables (valeurs masquées) : REACT_APP_GRAPHGQL_URL (sic — la faute est réelle, ne pas la « corriger »), REACT_APP_ALLOWED_SENSORS, REACT_APP_BLE_SERVICE_UUID / _CHARACTERISTIC_UUID / _WRITE_CHARACTERISTIC_UUID, REACT_APP_MAPBOX_TOKEN, REACT_APP_STRIPE_PUBLIC_KEY / _MERCHANT_ID, REACT_APP_AWS_ACCESS_KEY / _BUCKET_NAME / _REGION, feature flags REACT_APP_FEATURE_SHOW_WALLET, REACT_APP_ALLOW_GATEWAY_CREATE.

Les scripts de run/build encodent l'env : yarn android:staging, yarn ios:prod, yarn start:development, etc. Le codegen GraphQL le reflète : yarn generate-interfaces:{dev,staging,prod,local}.

Versioning

  • La version de l'app vit dans package.json ("version", actuellement 9.8.0).
  • "postversion": "react-native-version" propage la version dans les projets natifs (Android versionName, iOS Info.plist) après un bump yarn version.
  • Le versionCode Android et le build number iOS proviennent tous deux de number_of_commits dans Fastlane (d'où le checkout CI avec fetch-depth: 0) ; surchargez avec la variable d'env BUILD_NUMBER. Android le lit via la propriété gradle MYAPP_VERSION_CODE.
  • release-please (.github/workflows/release-please.yml, release-type: node) automatise le bump semver et ouvre la PR de release sur les pushs vers staging.

Changelog

CHANGELOG.md est généré par release-please (style Keep-a-Changelog, groupé par type de Conventional Commit, avec liens de comparaison GitHub). Ne pas l'éditer à la main. (conventional-changelog-cli est présent en dépendance mais n'est câblé à aucun script.)

Fastlane — matrice de déploiement

Les deux plateformes exposent trois lanes d'env (dev, staging, prod), lancées par deploy.yml au push sur la branche correspondante. L'app id / package est com.feelbat.app pour tous les envs (identité unique — pas de flavors).

Branche Lane Android iOS
dev dev Internal App Sharing TestFlight
staging staging Internal App Sharing TestFlight
main prod Internal App Sharing + Play Store prod (draft) TestFlight + version App Store (submit_for_review: false)
  • Sélection d'env : iOS build le schéma correspondant (development/staging/prod ; sa pre-action pointe react-native-config vers .env.<env> via /tmp/envfile). Android définit ENVFILE avant le bundle gradle.
  • Signing iOS : match(type: "appstore", readonly: true) depuis Feelbat-Reunion/app-codesigning ; uploads authentifiés par une clé API App Store Connect.
  • Signing Android : feelbat-key.keystore + mots de passe injectés en propriétés gradle (MYAPP_UPLOAD_*). Les builds release locaux se rabattent sur le keystore committé.
  • La soumission aux stores n'est jamais automatique — les releases Play sont des drafts, la version App Store est préparée mais non soumise (voir plus bas).
  • Ruby : les lanes tournent sur Ruby 3.3 (épinglé dans le workflow) — fastlane 2.220 crashe sur Ruby 3.4 (gem par défaut abbrev retirée). En local, utilisez aussi Ruby 3.3 (rbenv / brew install ruby@3.3).
  • Run mono-plateforme : gh workflow run deploy.yml --ref <branch> -f platform=android (ou ios) ne déploie qu'une plateforme — ex. publier Android tant que la clé ASC iOS n'est pas encore en place.

Secrets GitHub requis

Déjà définis : MATCH_PASSWORD, MATCH_GIT_BASIC_AUTHORIZATION.

Secret Rôle
ENV_DEVELOPMENT / ENV_STAGING / ENV_PROD base64 des trois fichiers .env.* gitignorés
ANDROID_KEYSTORE_BASE64 base64 de android/app/feelbat-key.keystore
ANDROID_KEYSTORE_PASSWORD / ANDROID_KEY_ALIAS / ANDROID_KEY_PASSWORD identifiants du keystore
PLAY_STORE_SERVICE_ACCOUNT_JSON JSON du service-account Google Play (contenu brut)
APP_STORE_CONNECT_API_KEY_ID / APP_STORE_CONNECT_API_ISSUER_ID / APP_STORE_CONNECT_API_KEY clé API ASC (la dernière = base64 du .p8)

Générez les blobs avec ex. base64 -i .env.prod | pbcopy, base64 -i android/app/feelbat-key.keystore | pbcopy, base64 -i AuthKey_XXXX.p8 | pbcopy.

Soumission manuelle aux stores

Le pipeline s'arrête une étape avant la publication :

  • Play Store : la release de production est un draft → Play Console → Production → revue → déploiement.
  • App Store : la version est créée avec le build attaché mais non soumise → App Store Connect → la version → Submit for Review.
  • Internal App Sharing (Android) et TestFlight (iOS) sont immédiats — distribution interne, sans revue.

Commandes locales de deploy / build

Commande Cible
yarn deploy:android:{dev,staging,prod} bundle exec fastlane <lane> dans android/
yarn deploy:ios:{dev,staging,prod} bundle exec fastlane <lane> dans ios/
yarn build:release:{dev,staging,local,prod} APK release Android local (bundle JS + gradlew assembleRelease)
yarn build:ios:release:{dev,staging,prod} run release iOS local

Flux de release typique

  1. Merge des PR de feature dans dev (contrôlé par ci.yml) → deploy.yml publie dev vers Internal App Sharing + TestFlight.
  2. Promotion vers staging → idem pour staging ; release-please ouvre/met à jour la PR de release (bump de version + CHANGELOG).
  3. Merge vers main → le build prod atteint Internal App Sharing / TestFlight et prépare les releases Play/App Store (draft / non soumise).
  4. Promotion manuelle des drafts dans Play Console / App Store Connect.

Fichiers clés

  • .env*, codegen.*.ts
  • ios/fastlane/, android/fastlane/
  • .github/workflows/{deploy,release-please}.yml
  • CHANGELOG.md, package.json (scripts + version)