Files
Ustagammon/scripts/deploy.sh

66 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Publie la branche main sur CapRover (voir docs/deploiement.md).
#
# Le site est construit et testé sur le PC, puis envoyé sous forme d'archive :
# le serveur ne fait que copier les fichiers dans une image Caddy.
#
# Prérequis : CLI caprover (via fnm) connecté à la machine CapRover
# (caprover login).
set -euo pipefail
CAPROVER_MACHINE="${CAPROVER_MACHINE:-sans-pub}"
CAPROVER_APP="${CAPROVER_APP:-ustagammon}"
SITE_URL="${SITE_URL:-https://ustagammon.sans.pub}"
die() {
echo "Erreur : $1" >&2
exit 1
}
cd "$(git rev-parse --show-toplevel)"
# La CLI caprover est installée avec Node par fnm.
if ! command -v caprover >/dev/null && command -v fnm >/dev/null; then
eval "$(fnm env --shell bash)"
fnm use --silent-if-unchanged lts-latest >/dev/null || true
fi
command -v caprover >/dev/null || die "CLI caprover introuvable (voir docs/deploiement.md)"
# On ne publie que main, propre et identique à origin/main.
[ "$(git branch --show-current)" = "main" ] || die "lancer le déploiement depuis la branche main"
git diff --quiet HEAD || die "des modifications ne sont pas commitées"
git fetch -q origin main
[ "$(git rev-parse main)" = "$(git rev-parse origin/main)" ] \
|| die "main diffère d'origin/main : git pull (ou fusionner la MR) d'abord"
# Le jeton CapRover expire ; caprover ls ne le vérifie pas. Sans terminal
# (stdin fermé), la CLI ne peut pas demander le mot de passe : elle doit
# échouer, et sa sortie ne doit pas contenir de demande de mot de passe (le
# 2026-11-09, elle a demandé le mot de passe puis rendu 0 sans rien publier).
if ! session=$(caprover api -n "$CAPROVER_MACHINE" -t /user/system/info -m GET -d '{}' -o false </dev/null 2>&1) \
|| grep -qi "password\|not valid anymore" <<<"$session"; then
die "session CapRover expirée : lancer caprover login dans un terminal"
fi
echo "Vérification avant publication : make lint et make test"
make lint
make test
make package
echo "Publication de main ($(git rev-parse --short main)) sur l'app $CAPROVER_APP"
caprover deploy -n "$CAPROVER_MACHINE" -a "$CAPROVER_APP" -t build/ustagammon.tar </dev/null
# La CLI peut rendre 0 sans avoir publié : on vérifie le résultat réel, le
# commit servi par le site (version.json), pendant deux minutes au plus.
commit=$(git rev-parse main)
for _ in $(seq 24); do
served=$(curl -fsS "$SITE_URL/version.json?verif=$RANDOM" 2>/dev/null || true)
if grep -q "\"$commit\"" <<<"$served"; then
echo "Publié : $SITE_URL sert $(git rev-parse --short main)."
exit 0
fi
sleep 5
done
die "le site ne sert pas le commit $(git rev-parse --short main) après 2 minutes : la publication a échoué (version servie : ${served:-aucune})"