Rollout progressif et ciblage géographique
La CLI tk-ota-push et le serveur OTA prennent en charge trois leviers complémentaires de maîtrise du d éploiement d'un patch : le déploiement progressif par pourcentage (Canary Rollout), le ciblage géographique par pays ISO-3166-1 alpha-2 (Geo-Fencing) et les stratégies d'application réseau/urgence (Wi-Fi requis vs mise à jour critique forcée).
1. Déploiement progressif en pourcentage (--rollout)
Sur la commande tk-ota-push patch, l'option --rollout définit le pourcentage initial d'appareils éligibles au patch :
# Déployer initialement sur 10 % de la flotte
tk-ota-push patch 1.0.0+3 -p android --rollout 10 -m "Canary 10 % nouveau parcours"
Règles de validation dans runner.dart
- Valeur par défaut :
'100'(100 %). - Valeurs acceptées : tout entier compris entre
0et100inclus. - Si la valeur n'est pas un entier ou est hors de
0..100, la CLI s'arrête immédiatement avec le code de sortie64:--rollout doit être compris entre 0 et 100. - Un rollout à
0(--rollout 0) permet de publier et signer le patch sur le serveur sans le distribuer au public, tout en permettant aux appareils inscrits en Whitelist Canary QA (allowed_client_ids) de le recevoir.
Ajustement dynamique sans recompilation
Après publication, vous pouvez augmenter ou réduire le pourcentage (10 % -> 50 % -> 100 %) depuis la Console Web ou via l'endpoint REST d'administration :
curl -X POST "$OTA_SERVER_URL/api/admin/v1/patches/$PATCH_ID/rollout?rollout_percentage=50" \
-H "Authorization: Bearer $OTA_API_KEY"
2. Ciblage géographique par pays (--countries)
L'option --countries de tk-ota-push patch restreint la diffusion du patch à une liste de codes pays ISO-3166-1 alpha-2 (2 lettres) :
# Cibler uniquement la Côte d'Ivoire, le Sénégal et le Cameroun
tk-ota-push patch 1.0.0+3 -p android --countries "CI,SN,CM" -m "Activation moyen de paiement régional"
# Forcer un déploiement mondial (écrase tout défaut configuré dans shorebird.yaml)
tk-ota-push patch 1.0.0+3 -p android --countries "all" -m "Correctif global"
Logique exacte de résolution (Publisher.parseCountries & FlutterProject.defaultCountries)
- Flag CLI explicite : Valeur fournie via
--countries(priorité maximale). - Configuration locale : Valeur définie dans
shorebird.yaml(geo.default_countries). - Par défaut : Diffusion mondiale (
null= aucun filtrage géographique).
Vous pouvez définir une liste de pays par défaut dans shorebird.yaml sous deux syntaxes supportées par FlutterProject.defaultCountries :
# Syntaxe 1 : liste YAML dans geo.default_countries
geo:
default_countries:
- CI
- SN
- CM
# Syntaxe 2 : chaîne CSV dans rollout.countries
rollout:
countries: "BJ, TG, FR"
Lors de l'exécution de patch, la CLI affiche explicitement la portée retenue :
Ciblage géographique : 🌍 Mondial (Tous pays)Ciblage géographique : 🎯 Pays cibles : CI, SN, CM
Pour modifier les pays autorisés d'un patch existant sans recompiler :
curl -X POST "$OTA_SERVER_URL/api/admin/v1/patches/$PATCH_ID/countries" \
-H "Authorization: Bearer $OTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"countries": ["CI", "SN", "CM", "BF"]}'
3. Stratégies de mise à jour : Silencieuse (Wi-Fi) vs Critique Forcée
La stratégie d'application côté terminal mobile combine les réglages du serveur OTA, le payload du RemoteConfigGatekeeper et l'initialisation du SDK TkOtaPush.init :
| Mode / Paramètre | Côté Serveur (/patches/{id}/strategy) | Côté Payload Remote Config | Côté SDK Flutter (TkOtaPush.init) | Comportement sur le téléphone |
|---|---|---|---|---|
| Silencieux Éco-Data (défaut) | forceCriticalUpdate: false | "force_update": false | requireWifiForSilentUpdate: false, minBatteryPercentageForSilentUpdate: 20 | Télécharge en arrière-plan (silentBackgroundUpdate) si batterie >= 20 % (ou en charge). Appliqué au prochain démarrage à froid. |
| Silencieux Wi-Fi uniquement | requireWifi: true | "force_update": false | requireWifiForSilentUpdate: true | Si l'appareil est sur réseau mobile (3G/4G/5G), diffère le téléchargement via workmanager (deferredToBackgroundTask) jusqu'au retour sur un Wi-Fi non limité. |
| Critique Forcé (Urgence) | forceCriticalUpdate: true | "force_update": true | Callback onCriticalUpdateRequired | Ignore la restriction Wi-Fi, déclenche immédiatement la modale bloquante UI (criticalForcedUpdate), télécharge le patch et requiert le redémarrage (restartRequired: true). |
Mise à jour de la stratégie d'un patch via l'API Control Plane
Lors de la soumission initiale (POST /api/admin/v1/patches), le serveur accepte le champ multipart force_critical_update (false par défaut). Après publication, vous pouvez basculer la stratégie Wi-Fi et l'urgence critique depuis la Console Web ou en appelant POST /api/admin/v1/patches/{patchId}/strategy :
curl -X POST "$OTA_SERVER_URL/api/admin/v1/patches/$PATCH_ID/strategy" \
-H "Authorization: Bearer $OTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"forceCriticalUpdate": true,
"requireWifi": false
}'
Si un patch est à l'état ROLLED_BACK, toute tentative de modification de sa stratégie (/strategy) ou de son ciblage géographique (/countries) est refusée par le serveur avec HTTP 409 Conflict (VERROUILLAGE DE SÉCURITÉ).