4
Scripts
Alban Dumerain edited this page 2026-01-21 14:10:59 +01:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Script Debian (zsh) — scripts/release.sh

#!/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 lapplication Wails
# - Renommer proprement le binaire
# - Générer une archive ZIP prête pour la release Gitea

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

APP="paycheck"        # Nom de lapplication / binaire
ARCH="amd64"          # Architecture cible
PLATFORM="linux"      # Plateforme cible

echo "== Paycheck - Release Linux =="

# Vérification que lon est bien à la racine du dépôt
# (wails.json est un bon marqueur)
if [[ ! -f "wails.json" ]]; then
  echo "ERREUR : wails.json introuvable."
  echo "Lance ce script depuis la racine du dépôt Git."
  exit 1
fi

# 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
  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
  exit 1
fi

# Vérification que lon est EXACTEMENT sur un tag
# --exact-match échoue si HEAD nest pas pointé par un tag
TAG="$(git describe --tags --exact-match 2>/dev/null || true)"

if [[ -z "$TAG" ]]; then
  echo "ERREUR : tu n'es pas positionné sur un tag."
  echo "Astuce : git fetch --tags && git checkout vX.Y.Z"
  exit 1
fi

# Vérification du format du tag (SemVer strict)
# Ex: v1.0.0
if [[ ! "$TAG" =~ '^v[0-9]+\.[0-9]+\.[0-9]+$' ]]; then
  echo "ERREUR : le tag '$TAG' ne respecte pas le format vX.Y.Z"
  exit 1
fi

echo "Tag détecté : $TAG"
echo "Commit utilisé : $(git rev-parse HEAD)"

# =========================
# Build du frontend
# =========================
echo "== Build frontend =="

pushd frontend >/dev/null

# Utilisation de npm ci si possible (build reproductible)
if [[ -f package-lock.json ]]; then
  npm ci
else
  npm install
fi

# Build Vite / frontend
npm run build

popd >/dev/null

# =========================
# Build Wails
# =========================
echo "== Build Wails =="

# Nettoyage des anciens binaires
rm -rf build/bin || true

# Build Linux
wails build

OUTDIR="build/bin"
SRC="$OUTDIR/$APP"

# Vérification que le binaire a bien été généré
if [[ ! -f "$SRC" ]]; then
  echo "ERREUR : binaire attendu introuvable : $SRC"
  echo "Contenu actuel de $OUTDIR :"
  ls -la "$OUTDIR" || true
  exit 1
fi

# Nom final standardisé du binaire
# Exemple : paycheck-v1.0.1-linux-amd64
FINAL="${APP}-${TAG}-${PLATFORM}-${ARCH}"

# Copie du binaire sous son nom final
cp -f "$SRC" "$OUTDIR/$FINAL"

# =========================
# Création de larchive ZIP
# =========================
echo "== Création de l'archive ZIP =="

pushd "$OUTDIR" >/dev/null

# -9 : compression maximale
zip -9 "${FINAL}.zip" "$FINAL"

popd >/dev/null

echo "Release Linux terminée avec succès."
echo "Artefact prêt : $OUTDIR/${FINAL}.zip"


Rendre le script executable :

chmod +x scripts/release.sh


Script Windows PowerShell — scripts/release.ps1


#requires -Version 5.1
# Script de release Windows pour Paycheck
# Objectif :
# - Garantir que le build est fait EXACTEMENT depuis un tag vX.Y.Z
# - Construire le frontend
# - Builder lapplication Wails en Windows/amd64
# - Renommer proprement le binaire
# - Générer une archive ZIP prête pour la release Gitea

$ErrorActionPreference = "Stop"
# Stop : PowerShell arrête le script dès quune commande échoue

$App = "paycheck"     # Nom du binaire (sans .exe)
$Arch = "amd64"       # Architecture cible (x86_64)
$Platform = "windows" # Plateforme cible

Write-Host "== Paycheck - Release Windows =="

# Vérification que lon est bien à la racine du dépôt
# (wails.json est un bon marqueur)
if (!(Test-Path "wails.json")) {
  throw "ERREUR : wails.json introuvable. Lance ce script depuis la racine du dépôt."
}

# Vérification que le dépôt Git est propre
# On refuse toute release avec des fichiers modifiés non commités
$porcelain = git status --porcelain
if ($porcelain) {
  Write-Host "ERREUR : le dépôt Git n'est pas propre."
  Write-Host "Commit ou stash tes modifications avant de lancer une release."
  git status --porcelain
  exit 1
}

# Vérification que lon est EXACTEMENT sur un tag
# --exact-match échoue si HEAD nest pas pointé par un tag
$tag = ""
try {
  $tag = (git describe --tags --exact-match).Trim()
} catch {
  $tag = ""
}

if ([string]::IsNullOrWhiteSpace($tag)) {
  throw "ERREUR : tu n'es pas positionné sur un tag. Astuce : git fetch --tags ; git checkout vX.Y.Z"
}

# Vérification du format du tag (SemVer strict), ex: v1.0.0
if ($tag -notmatch '^v\d+\.\d+\.\d+$') {
  throw "ERREUR : le tag '$tag' ne respecte pas le format vX.Y.Z"
}

Write-Host "Tag détecté : $tag"
Write-Host "Commit utilisé : $(git rev-parse HEAD)"

# =========================
# Build du frontend
# =========================
Write-Host "== Build frontend =="

Push-Location frontend

# Utilisation de npm ci si possible (build reproductible)
if (Test-Path "package-lock.json") {
  npm ci
} else {
  npm install
}

# Build Vite / frontend
npm run build

Pop-Location

# =========================
# Build Wails (Windows/amd64)
# =========================
Write-Host "== Build Wails =="

# Nettoyage des anciens binaires
if (Test-Path "build\bin") {
  Remove-Item -Recurse -Force "build\bin"
}

# Build Wails Windows/amd64
# -o : force le nom de sortie (ici paycheck.exe)
wails build -platform windows/amd64 -o "$App.exe"

$outDir = "build\bin"
$src = Join-Path $outDir "$App.exe"

# Vérification que le binaire a bien été généré
if (!(Test-Path $src)) {
  throw "ERREUR : binaire attendu introuvable : $src"
}

# Nom final standardisé du binaire
# Exemple : paycheck-v1.0.1-windows-amd64.exe
$finalExe = Join-Path $outDir "$App-$tag-$Platform-$Arch.exe"

# Copie du binaire sous son nom final
Copy-Item $src $finalExe -Force

# =========================
# Création de larchive ZIP
# =========================
Write-Host "== Création de l'archive ZIP =="

$zipPath = Join-Path $outDir "$App-$tag-$Platform-$Arch.zip"

# Nettoyage si le zip existe déjà
if (Test-Path $zipPath) {
  Remove-Item -Force $zipPath
}

# Zip du binaire final
Compress-Archive -Path $finalExe -DestinationPath $zipPath -Force

Write-Host "Release Windows terminée avec succès."
Write-Host "Artefact prêt : $zipPath"

Exécution (si la politique PowerShell bloque)

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\scripts\release.ps1