Aller au contenu principal

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]
ModePlateforme cibléeAction réalisée
releaseAndroidCompile l'APK release, extrait binaire d'application, calcule le hash de pubspec.lock et verrouille la Release sur le serveur.
patchAndroidCompile le nouveau binaire d'application, vérifie le hash contre la Release existante et publie le patch OTA.
release-iosiOSCompile Runner.app, extrait le binaire App et diff_base dans .shorebird_cache/, et verrouille la Release iOS.
patch-iosiOSCompile 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-allAndroid + iOSEnchaîne successivement release puis release-ios pour verrouiller les deux plateformes en une seule commande.
patch-allAndroid + iOSEnchaî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 :

Étapes du script d'automatisation CI/CD
  1. Synchronisation des clés : Récupération de la clé publique de signature depuis le serveur.
  2. Contrôle d'immuabilité : Vérification que la release n'est pas verrouillée en production.
  3. Compilation et Publication : Construction de l'archive et transmission au serveur TkushPatch.
  4. 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.shCLI Dart tk-ota-push
Compatibilité OSmacOS et Linux (Bash/POSIX)Multiplateforme native (macOS, Linux, Windows)
AuthentificationVariable d'environnement statique uniquementPKCE Web interactive (login), SSO d'entreprise, auto-refresh
Multi-TenancyManuelNatif (tenant_id résolu dans shorebird.yaml, session ou flag)
Multi-Flavors & ABIMonolithique Android/iOSMulti-Flavors (--flavor, --target), multi-ABI (aarch64 + arm)
Détection d'intégrité nativeHash pubspec.lock uniquementScanner natif complet (classes.dex, manifestes, libs C++)
Intégration CI/CDSortie texte shellFormat JSON structuré (--json), codes de retour standardisés
Gouvernance & RolloutDéploiement direct 100 %Rollout progressif (--rollout 10), pays (--countries), Staged 4-yeux