Versioning, déploiement et mise à jour automatique
Gestion des versions :
- Fichier VERSION (1.0.0) comme source de vérité
- config/update.php : URL Gitea, AUTO_UPDATE (false par défaut), rétention des sauvegardes
Artisan commands :
- app:check-update : interroge l'API Gitea, cache Redis 1h, déclenche app:update si AUTO_UPDATE=true
- app:update : télécharge l'archive, sauvegarde pg_dump, rsync, composer install, migrate, reload php-fpm
- app:rollback : liste les sauvegardes et restaure via psql
UpdateService :
- Téléchargement via Http::sink() (streaming, pas de charge mémoire)
- Sauvegarde pg_dump dans storage/app/backups/ avant chaque mise à jour
- Rechargement php-fpm gracieux (kill -USR2 1) sans downtime
- Purge automatique des anciennes sauvegardes (configurable)
Docker (refactor pour volume-mount) :
- Dockerfile : runtime seulement (PHP + extensions + composer + rsync + pg_client)
Le code n'est plus copié dans l'image → les mises à jour ne nécessitent pas de rebuild
- entrypoint.sh : composer install + key:generate + caches au démarrage du container
- docker-compose.prod.yml : montage du code comme volume (.:/var/www/html)
Scripts de déploiement :
- bin/build-release.sh : rsync + tar.gz + sha256, exclut vendor/node_modules/tests
- install.sh : guide d'installation Docker complète (première mise en service)
Interface admin :
- Bandeau "mise à jour disponible" dans le dashboard admin (version courante + cible)
- Badge version + icône "à jour" en pied de tableau de bord
- Commande à copier-coller pour appliquer depuis le container
Planification :
- routes/console.php : Schedule::command('app:check-update')->daily()
- .env.example : variables GITEA_*, AUTO_UPDATE, UPDATE_BACKUPS_TO_KEEP
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Executable
+75
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# MesRelevés — Script de construction d'une archive de release
|
||||
#
|
||||
# Usage : bin/build-release.sh
|
||||
#
|
||||
# Prérequis : node/npm (pour les assets), rsync, tar
|
||||
# Produit : mesreleves-X.Y.Z.tar.gz + mesreleves-X.Y.Z.tar.gz.sha256
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
set -euo pipefail
|
||||
|
||||
# Se positionner à la racine du projet
|
||||
cd "$(git rev-parse --show-toplevel)"
|
||||
|
||||
VERSION=$(cat VERSION | tr -d '[:space:]')
|
||||
ARCHIVE="mesreleves-${VERSION}.tar.gz"
|
||||
|
||||
echo "──────────────────────────────────────────────"
|
||||
echo " MesRelevés — Build de la release v${VERSION}"
|
||||
echo "──────────────────────────────────────────────"
|
||||
|
||||
# ── 1. Vérifications ──────────────────────────────────────────────────────────
|
||||
if git diff --quiet HEAD 2>/dev/null && git diff --cached --quiet 2>/dev/null; then
|
||||
:
|
||||
else
|
||||
echo "AVERTISSEMENT : des modifications non commitées seront incluses."
|
||||
fi
|
||||
|
||||
# ── 2. Build des assets frontend ─────────────────────────────────────────────
|
||||
echo "→ Build des assets frontend (npm run build)..."
|
||||
npm run build --silent
|
||||
|
||||
# ── 3. Copie dans un répertoire temporaire (sans vendor, sans fichiers dev) ──
|
||||
TMPDIR=$(mktemp -d)
|
||||
BUILDDIR="${TMPDIR}/mesreleves-${VERSION}"
|
||||
trap 'rm -rf "${TMPDIR}"' EXIT
|
||||
|
||||
echo "→ Copie des fichiers dans ${BUILDDIR}..."
|
||||
rsync -a \
|
||||
--exclude='.git/' \
|
||||
--exclude='.env' \
|
||||
--exclude='node_modules/' \
|
||||
--exclude='vendor/' \
|
||||
--exclude='storage/logs/' \
|
||||
--exclude='storage/framework/cache/' \
|
||||
--exclude='storage/framework/sessions/' \
|
||||
--exclude='storage/framework/views/' \
|
||||
--exclude='tests/' \
|
||||
--exclude='phpunit.xml' \
|
||||
--exclude='.editorconfig' \
|
||||
--exclude='.gitattributes' \
|
||||
--exclude='.gitignore' \
|
||||
--exclude='*.tar.gz' \
|
||||
--exclude='*.sha256' \
|
||||
--exclude='.phpunit.result.cache' \
|
||||
. "${BUILDDIR}/"
|
||||
|
||||
# ── 4. Création de l'archive ─────────────────────────────────────────────────
|
||||
echo "→ Création de l'archive ${ARCHIVE}..."
|
||||
tar -czf "${ARCHIVE}" -C "${TMPDIR}" "mesreleves-${VERSION}/"
|
||||
|
||||
# ── 5. Somme de contrôle SHA-256 ─────────────────────────────────────────────
|
||||
sha256sum "${ARCHIVE}" > "${ARCHIVE}.sha256"
|
||||
CHECKSUM=$(awk '{print $1}' "${ARCHIVE}.sha256")
|
||||
|
||||
# ── Résumé ────────────────────────────────────────────────────────────────────
|
||||
SIZE=$(du -sh "${ARCHIVE}" | cut -f1)
|
||||
echo ""
|
||||
echo "✓ Archive créée : ${ARCHIVE} (${SIZE})"
|
||||
echo " SHA-256 : ${CHECKSUM}"
|
||||
echo ""
|
||||
echo "Prochaines étapes :"
|
||||
echo " 1. git tag v${VERSION} && git push origin v${VERSION}"
|
||||
echo " 2. Créer une release sur Gitea (tag v${VERSION})"
|
||||
echo " 3. Joindre ${ARCHIVE} et ${ARCHIVE}.sha256 à la release"
|
||||
Reference in New Issue
Block a user