Script d'automatisation ota-publish.sh
Avant le développement de la CLI native en pur Dart tk-ota-push, l'orchestration des compilations et de la publication OTA s'effectuait via le script shell ota-publish.sh (tkushpatch_releases/ota-publish.sh).
Ce script demeure un outil de référence robuste, notamment pour les développeurs travaillant exclusivement sous macOS/Linux ou pour les pipelines Bash historiques.
1. Modes d'exécution supportés
Le script accepte deux arguments positionnels : le mode d'action et optionnellement la version cible (ex: 1.0.0+13). Si la version n'est pas passée, elle est automatiquement extraite de pubspec.yaml.
./ota-publish.sh <mode> [version]
| Mode | Plateforme ciblée | Action réalisée |
|---|---|---|
release | Android | Compile l'APK release, extrait binaire d'application, calcule le hash de pubspec.lock et verrouille la Release sur le serveur. |
patch | Android | Compile le nouveau binaire d'application, vérifie le hash contre la Release existante et publie le patch OTA. |
release-ios | iOS | Compile Runner.app, extrait le binaire App et diff_base dans .shorebird_cache/, et verrouille la Release iOS. |
patch-ios | iOS | Compile app.dill, génère le snapshot ELF (gen_snapshot_arm64), crée le lien artefact de patch (aot-tools.dill link) et publie le patch. |
release-all | Android + iOS | Enchaîne successivement release puis release-ios pour verrouiller les deux plateformes en une seule commande. |
patch-all | Android + iOS | Enchaîne successivement patch puis patch-ios pour déployer le patch sur Android et iOS simultanément. |
2. Déroulement étape par étape du script
Le script exécute un cycle rigoureux garantissant l'intégrité avant tout appel réseau :
- Synchronisation des clés : Récupération de la clé publique de signature depuis le serveur.
- Contrôle d'immuabilité : Vérification que la release n'est pas verrouillée en production.
- Compilation et Publication : Construction de l'archive et transmission au serveur TkushPatch.
- Confirmation : Validation du statut du correctif et journalisation du build.
Étape 1 : Synchronisation de la clé publique RSA
Le script interroge l'endpoint /api/admin/v1/crypto/public-key de votre serveur Serveur TkushPatch et met à jour automatiquement la clé patch_public_key dans shorebird.yaml :
PUB_KEY=$(curl -s "$OTA_SERVER_URL/api/admin/v1/crypto/public-key" | sed -n 's/.*"patch_public_key":"\([^"]*\)".*/\1/p')
Étape 2 : Protection contre le Release Overwrite (HTTP 409)
Avant de lancer une compilation longue, le script vérifie si la Release demandée est déjà verrouillée sur le serveur via /releases/lookup. Si elle existe déjà, la compilation est avortée immédiatement pour éviter d'écraser un binaire Store de production.
Étape 3 : Localisation de la toolchain Shorebird
Le script localise automatiquement les outils installés par Shorebird sous macOS :
SHOREBIRD_FLUTTER_DIR="$(ls -d "$HOME"/.shorebird/bin/cache/flutter/* | head -n 1)"
SHOREBIRD_FLUTTER="$SHOREBIRD_FLUTTER_DIR/bin/flutter"
SHOREBIRD_DART="$SHOREBIRD_FLUTTER_DIR/bin/cache/dart-sdk/bin/dart"
GEN_SNAPSHOT_IOS="$SHOREBIRD_FLUTTER_DIR/bin/cache/artifacts/engine/ios-release/gen_snapshot_arm64"
ANALYZE_SNAPSHOT_IOS="$SHOREBIRD_FLUTTER_DIR/bin/cache/artifacts/engine/ios-release/analyze_snapshot_arm64"
ENGINE_REV="$(cat "$SHOREBIRD_FLUTTER_DIR/bin/internal/engine.version" | tr -d '[:space:]')"
AOT_TOOLS_DILL="$HOME/.shorebird/bin/cache/artifacts/aot-tools/$ENGINE_REV/aot-tools.dill"
Étape 4 : Gestion du cache iOS (diff_base)
Pour iOS, Shorebird nécessite le binaire original de référence (App) ainsi que les métadonnées de liaison (supplement). Le script stocke ces éléments dans un cache local dédié :
.shorebird_cache/ios_release_<version>/
├── App
├── diff_base
├── Runner.app
└── supplement/
├── App.arm64.link
└── App.arm64_table.json
Lors d'un patch-ios, le script effectue une vérification d'intégrité stricte : l'empreinte SHA-256 du diff_base local doit correspondre exactement à celle enregistrée sur le serveur Serveur TkushPatch. En cas de différence, la génération du patch est annulée pour empêcher tout crash SIGSEGV sur iPhone.
3. Comparatif : ota-publish.sh vs CLI tk-ota-push
Bien que le script shell soit parfaitement fonctionnel pour les tests locaux, la CLI Dart tk-ota-push est la solution recommandée en production :
| Fonctionnalité | Script Bash ota-publish.sh | CLI Dart tk-ota-push |
|---|---|---|
| Compatibilité OS | macOS et Linux (Bash/POSIX) | Multiplateforme native (macOS, Linux, Windows) |
| Authentification | Variable d'environnement statique uniquement | PKCE Web interactive (login), SSO d'entreprise, auto-refresh |
| Multi-Tenancy | Manuel | Natif (tenant_id résolu dans shorebird.yaml, session ou flag) |
| Multi-Flavors & ABI | Monolithique Android/iOS | Multi-Flavors (--flavor, --target), multi-ABI (aarch64 + arm) |
| Détection d'intégrité native | Hash pubspec.lock uniquement | Scanner natif complet (classes.dex, manifestes, libs C++) |
| Intégration CI/CD | Sortie texte shell | Format JSON structuré (--json), codes de retour standardisés |
| Gouvernance & Rollout | Déploiement direct 100 % | Rollout progressif (--rollout 10), pays (--countries), Staged 4-yeux |