Actualiser Scripts
97
Scripts.md
97
Scripts.md
@@ -2,80 +2,125 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
#!/bin/zsh
|
#!/bin/zsh
|
||||||
|
# Script de release Linux pour Paycheck
|
||||||
|
# Objectif :
|
||||||
|
# - Garantir que le build est fait EXACTEMENT depuis un tag vX.Y.Z
|
||||||
|
# - Construire le frontend
|
||||||
|
# - Builder l’application Wails
|
||||||
|
# - Renommer proprement le binaire
|
||||||
|
# - Générer une archive ZIP prête pour la release Gitea
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
# -e : stoppe le script à la première erreur
|
||||||
|
# -u : erreur si variable non définie
|
||||||
|
# -o pipefail : erreur si une commande dans un pipe échoue
|
||||||
|
|
||||||
# Paycheck release helper (Linux)
|
APP="paycheck" # Nom de l’application / binaire
|
||||||
# - Requires: git, node/npm, wails, zip
|
ARCH="amd64" # Architecture cible
|
||||||
# - Enforces: exact tag checkout (vX.Y.Z)
|
PLATFORM="linux" # Plateforme cible
|
||||||
|
|
||||||
APP="paycheck"
|
echo "== Paycheck - Release Linux =="
|
||||||
ARCH="amd64"
|
|
||||||
PLATFORM="linux"
|
|
||||||
|
|
||||||
echo "== Paycheck Linux release =="
|
# Vérification que l’on est bien à la racine du dépôt
|
||||||
|
# (wails.json est un bon marqueur)
|
||||||
# Ensure we're in repo root (contains wails.json)
|
|
||||||
if [[ ! -f "wails.json" ]]; then
|
if [[ ! -f "wails.json" ]]; then
|
||||||
echo "ERROR: wails.json not found. Run this script from the repo root."
|
echo "ERREUR : wails.json introuvable."
|
||||||
|
echo "Lance ce script depuis la racine du dépôt Git."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Ensure clean working tree
|
# Vérification que le dépôt Git est propre
|
||||||
|
# On refuse toute release avec des fichiers modifiés non commités
|
||||||
if [[ -n "$(git status --porcelain)" ]]; then
|
if [[ -n "$(git status --porcelain)" ]]; then
|
||||||
echo "ERROR: Working tree is not clean. Commit/stash changes before releasing."
|
echo "ERREUR : le dépôt Git n'est pas propre."
|
||||||
|
echo "Commit ou stash tes modifications avant de lancer une release."
|
||||||
git status --porcelain
|
git status --porcelain
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Ensure we are exactly on a tag vX.Y.Z
|
# Vérification que l’on est EXACTEMENT sur un tag
|
||||||
|
# --exact-match échoue si HEAD n’est pas pointé par un tag
|
||||||
TAG="$(git describe --tags --exact-match 2>/dev/null || true)"
|
TAG="$(git describe --tags --exact-match 2>/dev/null || true)"
|
||||||
|
|
||||||
if [[ -z "$TAG" ]]; then
|
if [[ -z "$TAG" ]]; then
|
||||||
echo "ERROR: You are not on an exact tag."
|
echo "ERREUR : tu n'es pas positionné sur un tag."
|
||||||
echo "Hint: git fetch --tags && git checkout vX.Y.Z"
|
echo "Astuce : git fetch --tags && git checkout vX.Y.Z"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Vérification du format du tag (SemVer strict)
|
||||||
|
# Ex: v1.0.0
|
||||||
if [[ ! "$TAG" =~ '^v[0-9]+\.[0-9]+\.[0-9]+$' ]]; then
|
if [[ ! "$TAG" =~ '^v[0-9]+\.[0-9]+\.[0-9]+$' ]]; then
|
||||||
echo "ERROR: Tag '$TAG' does not match SemVer format vX.Y.Z"
|
echo "ERREUR : le tag '$TAG' ne respecte pas le format vX.Y.Z"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Tag: $TAG"
|
echo "Tag détecté : $TAG"
|
||||||
echo "Commit: $(git rev-parse HEAD)"
|
echo "Commit utilisé : $(git rev-parse HEAD)"
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Build du frontend
|
||||||
|
# =========================
|
||||||
|
echo "== Build frontend =="
|
||||||
|
|
||||||
# Frontend install/build (clean, reproducible)
|
|
||||||
echo "== Frontend =="
|
|
||||||
pushd frontend >/dev/null
|
pushd frontend >/dev/null
|
||||||
|
|
||||||
|
# Utilisation de npm ci si possible (build reproductible)
|
||||||
if [[ -f package-lock.json ]]; then
|
if [[ -f package-lock.json ]]; then
|
||||||
npm ci
|
npm ci
|
||||||
else
|
else
|
||||||
npm install
|
npm install
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Build Vite / frontend
|
||||||
npm run build
|
npm run build
|
||||||
|
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
|
||||||
# Build
|
# =========================
|
||||||
echo "== Wails build =="
|
# Build Wails
|
||||||
|
# =========================
|
||||||
|
echo "== Build Wails =="
|
||||||
|
|
||||||
|
# Nettoyage des anciens binaires
|
||||||
rm -rf build/bin || true
|
rm -rf build/bin || true
|
||||||
|
|
||||||
|
# Build Linux
|
||||||
wails build
|
wails build
|
||||||
|
|
||||||
OUTDIR="build/bin"
|
OUTDIR="build/bin"
|
||||||
SRC="$OUTDIR/$APP"
|
SRC="$OUTDIR/$APP"
|
||||||
|
|
||||||
|
# Vérification que le binaire a bien été généré
|
||||||
if [[ ! -f "$SRC" ]]; then
|
if [[ ! -f "$SRC" ]]; then
|
||||||
echo "ERROR: Expected binary not found at $SRC"
|
echo "ERREUR : binaire attendu introuvable : $SRC"
|
||||||
echo "Contents of $OUTDIR:"
|
echo "Contenu actuel de $OUTDIR :"
|
||||||
ls -la "$OUTDIR" || true
|
ls -la "$OUTDIR" || true
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Nom final standardisé du binaire
|
||||||
|
# Exemple : paycheck-v1.0.1-linux-amd64
|
||||||
FINAL="${APP}-${TAG}-${PLATFORM}-${ARCH}"
|
FINAL="${APP}-${TAG}-${PLATFORM}-${ARCH}"
|
||||||
|
|
||||||
|
# Copie du binaire sous son nom final
|
||||||
cp -f "$SRC" "$OUTDIR/$FINAL"
|
cp -f "$SRC" "$OUTDIR/$FINAL"
|
||||||
|
|
||||||
echo "== Package =="
|
# =========================
|
||||||
|
# Création de l’archive ZIP
|
||||||
|
# =========================
|
||||||
|
echo "== Création de l'archive ZIP =="
|
||||||
|
|
||||||
pushd "$OUTDIR" >/dev/null
|
pushd "$OUTDIR" >/dev/null
|
||||||
|
|
||||||
|
# -9 : compression maximale
|
||||||
zip -9 "${FINAL}.zip" "$FINAL"
|
zip -9 "${FINAL}.zip" "$FINAL"
|
||||||
|
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
|
||||||
echo "OK: $OUTDIR/${FINAL}.zip"
|
echo "Release Linux terminée avec succès."
|
||||||
|
echo "Artefact prêt : $OUTDIR/${FINAL}.zip"
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
Rendre le script executable :
|
Rendre le script executable :
|
||||||
|
|||||||
Reference in New Issue
Block a user