PLB · GitHub Actions

Architecture des workflows CI/CD — Analyse interactive

flutterflow
Flux d'exécution — Vue globale
Déclencheur : Un git push sur la branche flutterflow lance simultanément l'Orchestrateur et deux workers autonomes (Android icons + iOS icon). Les 5 autres workflows ne se lancent qu'à la demande de l'Orchestrateur via workflow_dispatch.
🚀
git push
branch: flutterflow
déclenche
🎼
Orchestrateur
orchestrate-autofix.yml
dispatch séquentiel ×7
FILE D'ATTENTE
Restore Android icons
Restore iOS icon
iOS Export Compliance
Restore Entitlements
Patch pbxproj
Restore Firebase plist
Increment version
+
AUSSI DIRECTS (push)
🤖
Restore Android Icons
push + dispatch
🍎
Restore iOS Icon
push + dispatch
résultat final
🤖
Android
icons + FCM meta
🍎
iOS
AppIcon + Info.plist + entitlements + pbxproj
🔥
Firebase
GoogleService-Info.plist
📦
pubspec.yaml
version bump auto
Commit auto
github-actions[bot]
🔒 Mécanismes de sécurité
Bot Guard
Tous les workers vérifient github.actor != 'github-actions[bot]' pour éviter une boucle infinie de triggers.
Concurrency
Les 5 workflows dispatch-only utilisent concurrency: cancel-in-progress: false — un seul run à la fois par branche, les suivants font la queue.
Push race condition
Chaque commit utilise git pull --rebase + 3 tentatives de push pour gérer les conflits lorsque plusieurs workers commitent en parallèle.
Secrets base64
Les fichiers sensibles (entitlements, Firebase plist) sont stockés encodés en base64 dans les GitHub Secrets et restaurés à chaque push.
📋 Détail des 8 workflows
🎯 Séquence d'exécution — Orchestrateur
Logique de l'orchestrateur : Pour chaque workflow de la file, il mémorise l'ID du dernier run connu (beforeId), envoie un workflow_dispatch, puis poll toutes les 5 secondes (max 30 min) jusqu'à conclusion: success. En cas d'échec, il arrête tout.
1 Restore Android icons
Synchronise .assets/android/icons/android/app/src/main/res/
android/res/ colors.xml AndroidManifest.xml
2 Restore iOS app icon
Synchronise .assets/ios/AppIcon.appiconset/ios/Runner/Assets.xcassets/
AppIcon.appiconset
3 Ensure iOS Export Compliance Key
Force ITSAppUsesNonExemptEncryption = false dans Info.plist (via Python + plistlib)
ios/Runner/Info.plist
4 Restore iOS entitlements
Décode et restaure les fichiers .entitlements depuis les GitHub Secrets base64
secret: runner secret: runnerRelease Runner.entitlements RunnerRelease.entitlements
5 Patch pbxproj (CODE_SIGN_ENTITLEMENTS)
Injecte CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; dans Debug/Release/Profile via regex Python
project.pbxproj Debug / Release / Profile
6 Restore Firebase plist
Décode et restaure GoogleService-Info.plist depuis le secret base64
secret: FIREBASE_PLIST_BASE64 GoogleService-Info.plist
7 Increment version in pubspec.yaml
Remplace le build number par github.run_number (monotone, ex: 1.0.0+42)
pubspec.yaml version: X.Y.Z+RUN_NUMBER
Algorithme de polling
// Pour chaque workflow de la queue :
1. getWorkflowIdByName(name)           // trouve l'ID par nom
2. dispatchWorkflow(workflowId)         // POST workflow_dispatch + mémorise beforeId
3. waitForCompletion(id, beforeId, name) // poll toutes les 5s, max 360 × 5s = 30 min

// Critères de détection du bon run :
runs
  .filter(r => r.id !== beforeId)          // exclut l'ancien run
  .filter(r => r.event === "workflow_dispatch")
  .filter(r => r.head_branch === branch)
  .sort((a, b) => new Date(b.created_at) - new Date(a.created_at))[0]

// Résultat :
"completed" + "success" → passe au suivant ✅
"completed" + autre   → throw Error ❌ (arrêt de la queue)
timeout 30 min         → throw Error ❌
💻 Code source des workflows
← Sélectionne un workflow
🔐 Secrets & Permissions
Attention : Ces secrets doivent être configurés dans Settings → Secrets and variables → Actions du repo GitHub pour que les workflows fonctionnent.
WF_PAT
Personal Access Token avec permissions actions:write — requis pour que l'orchestrateur puisse déclencher d'autres workflows via l'API.
orchestrate-autofix
runner
Contenu de Runner.entitlements encodé en base64 (certificat de développement).
restore_entitlment
runnerRelease
Contenu de RunnerRelease.entitlements encodé en base64 (certificat de production).
restore_entitlment
FIREBASE_PLIST_BASE64
Contenu de GoogleService-Info.plist encodé en base64 — fichier Firebase exclu du repo.
restore_firebase_plist
🛡 Matrice des permissions
Workflow contents: read contents: write actions: read Déclencheur
orchestrate-autofixpush dispatch
restore_android_iconspush dispatch
restore_ios_app_iconpush dispatch
ensure-ios-export-compliancedispatch only
restore_entitlmentdispatch only
patch_pbxprojdispatch only
restore_firebase_plistdispatch only
increment_versiondispatch only
📁 Répertoire du projet PLB
passe_la_balle — Flutter (FlutterFlow) · Supabase · Firebase FCM · Stripe · v1.0.0+150 Cliquer sur un dossier pour l'ouvrir / fermer
📦 Stack technique
🎯
Flutter / Dart
Framework UI · FlutterFlow généré · SDK ≥3.0
🗄️
Supabase
Auth · PostgreSQL · Realtime · Storage · Edge Functions
🔥
Firebase
FCM push notifications · iOS ImageNotification extension
💳
Stripe
Gestion abonnements via subscribe / unsubscribe actions
🌐
Netlify
Héberge docs/ — documentation interactive
🤖
GitHub Actions
8 workflows CI/CD auto-réparation à chaque push
🗃️ Tables Supabase (lib/backend/supabase/database/tables/)
Actions Dart personnalisées (lib/custom_code/actions/)