From 1a06c3c844d7b652c5274cdb458e9d7e792ab223 Mon Sep 17 00:00:00 2001 From: Siphonight Date: Sat, 5 Sep 2026 20:21:35 +0200 Subject: [PATCH] =?UTF-8?q?Release=20script=20multi-instances=20(cloudyfy?= =?UTF-8?q?=20+=20farewell),=20remotes=20et=20docs=20=C2=A716?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/gitea-release.py : argument d'instance (URL/owner/trousseau par hôte), usage inchangé sinon ; tokens par instance dans le trousseau macOS - remotes : origin (cloudyfy, HTTPS) + farewell (SSH, alias giteassh:2222) - docs §16/§16.bis : deux remotes, scopes des tokens, commande d'ajout au trousseau pour farewell --- docs/DEVELOPPEMENT.md | 30 +++++++++++++++------- scripts/gitea-release.py | 55 ++++++++++++++++++++++++++++++---------- 2 files changed, 63 insertions(+), 22 deletions(-) diff --git a/docs/DEVELOPPEMENT.md b/docs/DEVELOPPEMENT.md index eae5b8c..9c27083 100644 --- a/docs/DEVELOPPEMENT.md +++ b/docs/DEVELOPPEMENT.md @@ -680,18 +680,22 @@ cd ~/projects/HormoneTrack adb install -r app/build/outputs/apk/debug/app-debug.apk ``` -**Git (initialisé le 2026-09-05, branche `main`, remote Gitea)** : -- Dépôt : `https://gitea.cloudyfy.fr/Siphonight/HormoneTrack` (privé) ; +**Git (initialisé le 2026-09-05, branche `main`, DEUX remotes Gitea)** : +- `origin` → `https://gitea.cloudyfy.fr/Siphonight/HormoneTrack` (privé, HTTPS + trousseau) +- `farewell` → `git@farewell:Siphonight/HormoneTrack.git` (SSH, alias `farewell` + = `giteassh.farewell.dev:2222` avec clé dédiée, cf `~/.ssh/config`) - Historique = commits logiques par couche (toolchain / moteur / UI / docs) ; - **Chaque release = tag annoté** (`v1.1.0`, `v1.2.0`, …) : `git tag -a vX.Y.Z -m "…" && git tag` pour lister ; - `local.properties`, `build/`, `.gradle/`, `.idea/`, **`local-test-data/`** sont ignorés (`.gitignore`) — ce dernier protège les données de santé de test ; - Avant chaque commit de release : `./gradlew testDebugUnitTest` doit être vert ; -- Push : `git push -u origin main --tags` (auth par trousseau macOS — token Gitea - à scope `write:repository` ; ⚠️ un token SANS `write:user` ne permet PAS de - créer un repo via API ni d'utiliser push-to-create, mais suffit pour push, - créer des releases et y attacher des fichiers). +- Push : `git push origin main --tags` + `git push farewell main --tags` + (farewell : auth SSH par clé `clé SSH dédiée` ; le push-to-create y est + DÉSACTIVÉ → le repo doit exister au préalable sur l'instance). + ⚠️ Tokens Gitea : scope `write:repository` suffit pour push, releases et + assets ; il NE permet PAS de créer un repo via API (il faut `write:user`) + ni d'utiliser push-to-create. ### 16.bis Releases Gitea avec APK téléchargeable @@ -699,7 +703,8 @@ Les releases Gitea embarquent l'APK de chaque version — les utilisateurs n'ont besoin de compiler. **Le corps de chaque release = la section CHANGELOG de la version** (markdown rendu par Gitea), extrait automatiquement. -Le tout est automatisé par `scripts/gitea-release.py` : +Le tout est automatisé par `scripts/gitea-release.py` — **multi-instances** +(`cloudyfy` par défaut, `farewell`) : ```bash # 1. Construire l'APK au niveau du tag @@ -707,10 +712,17 @@ git checkout vX.Y.Z && ./gradlew assembleDebug cp app/build/outputs/apk/debug/app-debug.apk /tmp/apks/HormoneTrack-vX.Y.Z.apk git checkout main -# 2. Créer (ou mettre à jour) la release : corps = CHANGELOG + APK attaché -python3 scripts/gitea-release.py vX.Y.Z /tmp/apks/HormoneTrack-vX.Y.Z.apk +# 2. Publier sur chaque instance (corps = CHANGELOG + APK attaché) +python3 scripts/gitea-release.py cloudyfy vX.Y.Z /tmp/apks/HormoneTrack-vX.Y.Z.apk +python3 scripts/gitea-release.py farewell vX.Y.Z /tmp/apks/HormoneTrack-vX.Y.Z.apk +# sans APK : python3 scripts/gitea-release.py farewell vX.Y.Z (corps seul) ``` +Le script choisit l'instance (URL, owner) et lit le token Gitea correspondant +dans le trousseau macOS (`security find-internet-password -s -w`) : +`gitea.cloudyfy.fr` ✓ présent ; `gitea.farewell.dev` → à ajouter : +`security add-internet-password -s gitea.farewell.dev -a Siphonight -w -U`. + Le script : - extrait la section `## [X.Y.Z]` de `docs/CHANGELOG.md` comme corps ; ⚠️ piège : le tag git porte le « v » (`v1.2.3`) mais la CHANGELOG non diff --git a/scripts/gitea-release.py b/scripts/gitea-release.py index f5be064..d9e7980 100755 --- a/scripts/gitea-release.py +++ b/scripts/gitea-release.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 """Publie/met à jour une release Gitea : corps = section CHANGELOG de la version, -APK en pièce jointe (optionnel). Réutilisable à chaque release. +APK en pièce jointe (optionnel). Réutilisable à chaque release, multi-instances. Usage : - python3 scripts/gitea-release.py v1.2.3 [chemin/vers/app.apk] + python3 scripts/gitea-release.py [instance] vX.Y.Z [chemin/vers/app.apk] +- instance : « cloudyfy » (défaut) ou « farewell » — voir INSTANCES ci-dessous ; - le corps est extrait de docs/CHANGELOG.md (section « ## [X.Y.Z] », SANS « v » — le tag git porte le « v », la CHANGELOG non : piège corrigé, cf §16.bis) ; - si la release existe déjà, son corps est mis à jour (PATCH) ; @@ -12,8 +13,11 @@ Usage : est remplacé). Auth : le token Gitea est lu dans le trousseau macOS -(security find-internet-password -s gitea.cloudyfy.fr -w) — scope requis : +(security find-internet-password -s -w) — scope requis : write:repository (suffit pour releases + assets, pas pour créer un repo). +Pour ajouter un token au trousseau : + security add-internet-password -s gitea.farewell.dev -a Siphonight \ + -w -U """ import json import re @@ -22,18 +26,28 @@ import sys import urllib.error import urllib.request -GITEA = "https://gitea.cloudyfy.fr" -OWNER, REPO = "Siphonight", "HormoneTrack" +# Instances connues : clé = nom court, hôte = service du trousseau +INSTANCES = { + "cloudyfy": {"url": "https://gitea.cloudyfy.fr", "owner": "Siphonight", + "host": "gitea.cloudyfy.fr"}, + "farewell": {"url": "https://gitea.farewell.dev", "owner": "Siphonight", + "host": "gitea.farewell.dev"}, +} + CHANGELOG = "docs/CHANGELOG.md" -def gitea_token() -> str: +def gitea_token(host: str) -> str: out = subprocess.run( - ["security", "find-internet-password", "-s", "gitea.cloudyfy.fr", "-w"], + ["security", "find-internet-password", "-s", host, "-w"], capture_output=True, text=True ).stdout.strip() if not out: - sys.exit("Token Gitea introuvable dans le trousseau macOS") + sys.exit( + f"Token Gitea introuvable dans le trousseau pour {host}\n" + f" Ajoute-le avec : security add-internet-password -s {host} " + f"-a Siphonight -w -U" + ) return out @@ -68,10 +82,21 @@ def changelog_section(version: str) -> str: def main(): - tag = sys.argv[1] if len(sys.argv) > 1 else sys.exit("Usage: gitea-release.py vX.Y.Z [app.apk]") - apk_path = sys.argv[2] if len(sys.argv) > 2 else None - token = gitea_token() - base = f"{GITEA}/api/v1/repos/{OWNER}/{REPO}" + args = sys.argv[1:] + # Premier argument = instance s'il n'est pas un tag (un tag commence par « v ») + instance = "cloudyfy" + if args and not args[0].startswith("v"): + instance = args.pop(0) + if instance not in INSTANCES: + sys.exit(f"Instance inconnue : {instance} (attendu : {', '.join(INSTANCES)})") + if not args: + sys.exit(f"Usage: gitea-release.py [{instance}] vX.Y.Z [app.apk]") + tag = args[0] + apk_path = args[1] if len(args) > 1 else None + + conf = INSTANCES[instance] + base = f"{conf['url']}/api/v1/repos/{conf['owner']}/{REPO_NAME}" + token = gitea_token(conf["host"]) body = changelog_section(tag) # Récupère la release du tag (crée-la si absente) @@ -112,8 +137,12 @@ def main(): link = "—" action = "créée" if created else "mise à jour" - print(f"Release {tag} {action} (id {release_id}) — corps {len(body)} caractères, APK : {link}") + print(f"[{instance}] Release {tag} {action} (id {release_id}) — " + f"corps {len(body)} caractères, APK : {link}") +# Nom du dépôt (identique sur les deux instances) +REPO_NAME = "HormoneTrack" + if __name__ == "__main__": main()