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", actuellement9.8.0). "postversion": "react-native-version"propage la version dans les projets natifs (AndroidversionName, iOSInfo.plist) après un bumpyarn version.- Le versionCode Android et le build number iOS proviennent tous deux de
number_of_commitsdans Fastlane (d'où le checkout CI avecfetch-depth: 0) ; surchargez avec la variable d'envBUILD_NUMBER. Android le lit via la propriété gradleMYAPP_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 versstaging.
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éfinitENVFILEavant le bundle gradle. - Signing iOS :
match(type: "appstore", readonly: true)depuisFeelbat-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
abbrevretiré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(ouios) 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
- Merge des PR de feature dans
dev(contrôlé parci.yml) →deploy.ymlpublie dev vers Internal App Sharing + TestFlight. - Promotion vers
staging→ idem pour staging ; release-please ouvre/met à jour la PR de release (bump de version + CHANGELOG). - Merge vers
main→ le build prod atteint Internal App Sharing / TestFlight et prépare les releases Play/App Store (draft / non soumise). - Promotion manuelle des drafts dans Play Console / App Store Connect.
Fichiers clés
.env*,codegen.*.tsios/fastlane/,android/fastlane/.github/workflows/{deploy,release-please}.ymlCHANGELOG.md,package.json(scripts + version)