Pipeline CI : build, test et empaquetage de l'APK Android sur chaque push sur main #64
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Suite à l'issue #39
(portage mobile Capacitor) : le projet natif Android existe déjà
(
apps/web/android/, généré parnpx cap add android, branchefeat/capacitor-android-native— PR pas encore mergée au moment où ceticket est écrit). Le seul suivi manuel resté documenté sur #39 est
"build APK + test appareil, toujours manuel dans Android Studio (la CI ne
build pas Android)". Le but ici : que ce build+test+empaquetage se fasse
automatiquement à chaque push sur
main, produisant un APK téléchargeable.Trouvé en creusant le pipeline existant, hors scope de ce ticket (voir
plus bas) :
.github/workflows/release.yml(déclenché par un tagvX.Y.Z) référence des actions GitHub sans URL complète(
actions/checkout@v4au lieu dehttps://github.com/actions/checkout@v4,contrairement à
ci.ymlqui a bien été mis à jour pour l'hébergementForgejo auto-hébergé) et utilise
softprops/action-gh-release, une actionde release spécifique à GitHub — très probablement cassé depuis la
migration vers Forgejo. Signalé mais pas corrigé ici (décision prise avec
l'utilisateur : ce ticket reste scopé à l'artefact sur
main).Décisions validées avec l'utilisateur
release.ymlConception — pourquoi le keystore ne peut pas être généré par la CI
Android refuse d'installer la mise à jour d'une appli si elle est signée
par une clé différente de la version déjà installée — le keystore doit donc
être créé une seule fois, à la main, hors CI, puis rester stable pour
toujours :
Le fichier + ses mots de passe deviennent des secrets du dépôt Forgejo —
même précédent que
PORTAINER_WEBHOOK_URLdéjà utilisé dansrelease.yml:ANDROID_KEYSTORE_BASE64(le.jksencodé en base64)ANDROID_KEYSTORE_PASSWORDANDROID_KEY_ALIASANDROID_KEY_PASSWORDMOBILE_API_URL(l'URL publique de l'API — même valeur queapps/web/.env.capacitor.example'sVITE_API_URL, mais comme secretplutôt qu'en dur, cohérent avec "aucun secret avec une valeur par défaut")
Conception — configuration Gradle de signature
apps/web/android/app/build.gradlen'a aujourd'hui aucunesigningConfig(vérifié :buildTypes.release, lignes 19-24, neréférence rien) —
assembleReleaseproduirait donc un APK non signé enl'état. Ajouter, lu depuis l'environnement et jamais codé en dur :
Conception — le job CI
Dans
ci.ymldirectement (pas un nouveau fichier de workflow séparé) :un 6e job
build-android, avecneeds: [lint, test, intent-service-test, build, e2e]etif: github.ref == 'refs/heads/main'. C'est ce qui répondréellement à "testée" — GitHub/Forgejo Actions n'a pas de mécanisme natif
pour qu'un job d'un autre fichier de workflow attende un run ailleurs,
donc rester dans le même fichier est ce qui permet un vrai
needs:bloquantplutôt qu'un simple déclenchement en parallèle qui ignorerait un échec des
tests.
"Testée" dans ce contexte précis : aucune suite de tests instrumentés
Android n'existe (zéro code natif au-delà de la coquille générée par
Capacitor) — il n'y a rien de spécifiquement "mobile" à tester au sens
Espresso/UI natif. "Testée" est donc satisfait par le blocage sur les 5 jobs
existants (Mocha, Cypress, lint, build, pytest du service NLP) avant de
packager quoi que ce soit — pas une suite native à inventer pour cette
itération.
Risque connu à documenter, pas à résoudre par avance
Aucun build Android n'a jamais tourné sur ce runner Forgejo auto-hébergé
(
act) — contrairement àlint/test/build/e2e, rien ne prouveaujourd'hui qu'installer le SDK Android + builder via Gradle tienne dans un
temps/espace disque raisonnable sur cette machine. À vérifier par un
premier run réel plutôt que par une supposition ici ; si le SDK Android
doit être retéléchargé à chaque run,
actions/cachesur~/.android/sdk/~/.gradle(même esprit que le cache Cypress déjà présentdans
e2e) sera probablement nécessaire pour un temps de build raisonnablesur les runs suivants.
Fichiers à toucher
.github/workflows/ci.yml— nouveau jobbuild-android.apps/web/android/app/build.gradle— blocsigningConfigs.apps/web/android/.gitignore— s'assurer querelease.keystore(lefichier décodé en CI) et tout
*.jks/*.keystorelocal sont bienignorés, jamais commités.
#39) : documenter les 5 secrets requis et comment générer/renouveler le
keystore.
Hors scope
release.ymlpour Forgejo (voir la note en Contexte) —signalé, pas traité ici sur demande explicite de l'utilisateur.
téléchargeable pour cette itération, pas une chaîne de distribution.
🤖 Filed by Claude Code