Release script multi-instances (cloudyfy + farewell), remotes et docs §16
- 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
This commit is contained in:
parent
eb7c4c1110
commit
1a06c3c844
@ -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 <hôte> -w`) :
|
||||
`gitea.cloudyfy.fr` ✓ présent ; `gitea.farewell.dev` → à ajouter :
|
||||
`security add-internet-password -s gitea.farewell.dev -a Siphonight -w <TOKEN> -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
|
||||
|
||||
@ -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 <hôte> -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 <TOKEN> -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 <TOKEN> -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user