Dépannage et codes d'erreur
Lorsqu'une commande tk-ota-push (alias tkushpatch) échoue, la CLI retourne un code de sortie standard POSIX (sysexits.h) et affiche un message d'erreur explicite sur la sortie d'erreur standard (stderr).
Ce guide référence l'ensemble des codes de sortie et fournit les solutions pas-à-pas pour résoudre les incidents de compilation, d'authentification et de publication.
1. Tableau des codes de sortie de la CLI
| Code de sortie | Constante POSIX | Cause exacte dans runner.dart | Résolution rapide |
|---|---|---|---|
0 | EX_OK | Exécution terminée avec succès | Aucune action requise. |
1 | EX_SOFTWARE | Erreur d'exécution générale, échec de compilation Flutter, altération de code natif ou rejet API (HTTP 4xx/5xx) | Consulter le message d'erreur et la trace affichée ci-dessous. |
64 | EX_USAGE | Syntaxe de commande invalide, option inconnue ou valeur d'argument hors limites (ex: --rollout 150) | Vérifier la syntaxe avec tk-ota-push <commande> --help. |
66 | EX_NOINPUT | Le répertoire ciblé ne contient aucun fichier pubspec.yaml valide | Vérifier que vous êtes à la racine d'un projet Flutter ou passer --project <chemin>. |
69 | EX_UNAVAILABLE | La toolchain Shorebird est introuvable (~/.shorebird/bin/cache/flutter) | Installer ou initialiser Shorebird sur la machine. |
2. Diagnostics détaillés et résolutions pas-à-pas
Erreur 1 : Toolchain Shorebird introuvable (Code 69)
Toolchain Shorebird introuvable (~/.shorebird/bin/cache/flutter).
Diagnostic
La méthode Toolchain.locate() inspecte $HOME/.shorebird/bin/cache/flutter (ou %USERPROFILE%\.shorebird\bin\cache\flutter sous Windows). Si le répertoire n'existe pas ou ne contient aucun moteur Flutter patché, la CLI s'arrête immédiatement.
Résolution
- Installez Shorebird si ce n'est pas déjà fait :
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash - Initialisez le cache Flutter patché en exécutant au moins une commande Shorebird :
shorebird doctor - Vérifiez la présence du dossier cache :
ls -la ~/.shorebird/bin/cache/flutter
Erreur 2 : Aucun pubspec.yaml dans . (Code 66)
Aucun pubspec.yaml dans /Users/dev/workspace.
Diagnostic
La commande a été exécutée en dehors d'un projet Flutter valide, ou l'argument passé à --project pointe vers un dossier inexistant.
Résolution
- Déplacez-vous dans le répertoire de votre projet Flutter :
cd chemin/vers/mon_application
tk-ota-push patch ... - Ou précisez le chemin explicite du projet :
tk-ota-push patch --project /chemin/vers/mon_application ...
Erreur 3 : HTTP 409 Conflict — Release déjà verrouillée (Code 1)
❌ ERREUR HTTP 409 CONFLICT — PROTECTION CONTRE LE 'RELEASE OVERWRITE'
La Release '1.0.0+1' (android / aarch64) est DÉJÀ verrouillée sur le serveur !
Empreinte SHA-256 de référence : 4f8b2c...
Diagnostic
TkushPatch garantit l'immuabilité absolue des Releases de référence. Une fois qu'une Release (ex: 1.0.0+1) est publiée, son binaire d'origine ne peut plus jamais être écrasé, car les téléphones des utilisateurs sur le terrain dépendent de ce binaire pour calculer le différentiel binaire (différentiel binaire).
Résolution
- Si vous souhaitez publier un correctif OTA sans republier sur les Stores : utilisez la sous-commande
patchau lieu derelease:tk-ota-push patch 1.0.0+1 -p android -m "Description du patch" - Si vous préparez une nouvelle version Store : incrémentez le numéro de version dans
pubspec.yaml(ex:1.0.0+2ou1.0.1+1) avant d'exécuterrelease:tk-ota-push release 1.0.0+2 -p android --artifact aab
Erreur 4 : Altération de code natif détectée (Code 1)
❌ ERREUR CRITIQUE D'INTÉGRITÉ NATIVE :
Des modifications de code natif ont été détectées entre la Release
de référence et le patch que vous tentez de publier :
- classes.dex : MODIFIÉ (Code Kotlin/Java altéré)
Diagnostic
Le NativeIntegrityScanner a détecté une modification dans les fichiers de bytecode Android (classes*.dex), le manifeste (AndroidManifest.xml), des bibliothèques C++ ou des frameworks iOS. Un patch OTA Flutter ne peut mettre à jour que le code Dart AOT ; s'il était distribué, l'application crasherait au démarrage chez l'utilisateur.
Résolution
- Ce changement requiert une soumission Store complète. Incrémentez la version dans
pubspec.yamlet publiez une nouvelle Release :tk-ota-push release 1.0.1+2 -p android --artifact aab - Si vous êtes certain que le changement ne concerne que des dépendances Dart pures (et que seul
pubspec.locka varié), utilisez le flag--force:tk-ota-push patch 1.0.0+1 -p android --force -m "Mise à jour intl purement Dart"
Erreur 5 : Délai dépassé lors du login PKCE (Code 1)
Échec de la connexion : Délai dépassé (aucun retour de l'interface Web)
Diagnostic
La commande tk-ota-push login a démarré un serveur HTTP local sur 127.0.0.1, mais aucune redirection n'a été reçue dans le délai imparti de 3 minutes (navigateur bloqué, firewall local bloquant la boucle locale ou portail Web non connecté).
Résolution
- Vérifiez que la console Web est joignable à l'adresse indiquée (ou passez
--web-url https://console-ota.entreprise.com). - Cliquez manuellement sur le lien d'autorisation affiché dans le terminal si le navigateur ne s'est pas ouvert automatiquement.
- En environnement CI/CD ou sur un serveur distant sans interface graphique, n'utilisez pas
login: définissez plutôt la variable d'environnementOTA_API_KEY.
Erreur 6 : --rollout doit être compris entre 0 et 100 (Code 64)
Erreur : --rollout doit être un entier compris entre 0 et 100 (reçu: 150).
Diagnostic
La valeur fournie à l'option --rollout de la commande patch n'est pas un entier valide dans l'intervalle [0, 100].
Résolution
Spécifiez un pourcentage entre 0 et 100 :
tk-ota-push patch 1.0.0+1 -p android --rollout 25 -m "Canary 25%"
Erreur 7 : Erreur HTTP 403 Forbidden lors d'une promotion (Code 1)
Erreur lors de la promotion (403) : {"error":"FORBIDDEN","message":"Patch must be in STAGED status and approved by a different user"}
Diagnostic
La promotion d'un patch vers le canal stable applique la règle des 4 yeux. Le serveur refuse la promotion si :
- L'utilisateur tentant de promouvoir le patch est le même développeur que celui qui l'a publié (
author_id == approver_id). - Le patch n'a pas été publié avec l'option
--stagedou n'a pas encore reçu l'approbation requise.
Résolution
- Connectez-vous avec un compte distinct disposant du rôle validateur (
ROLE_SECURITY_OFFICERouROLE_TENANT_ADMIN). - Validez le patch depuis la Console Web (onglet Gouvernance) ou exécutez
promoteavec la clé API de l'approbateur.