diff --git a/.gitea/workflows/deploy-staging-live.yml b/.gitea/workflows/deploy-staging-live.yml index d90f8f3..74ebfe2 100644 --- a/.gitea/workflows/deploy-staging-live.yml +++ b/.gitea/workflows/deploy-staging-live.yml @@ -93,7 +93,7 @@ jobs: git log -1 --oneline - - name: Gate — decide HOTPATCH vs FULL rebuild + - name: Gate — decide SKIP vs HOTPATCH vs FULL rebuild env: INPUT_FORCE: ${{ inputs.force }} run: | @@ -109,24 +109,49 @@ jobs: echo "== changed files ==" echo "$CHANGED" | sed -n '1,260p' + # 0) Forçage manuel if [[ "$FORCE" == "1" ]]; then - echo "GO=1" >> /tmp/deploy.env + echo "GO=1" >> /tmp/deploy.env echo "MODE='full'" >> /tmp/deploy.env echo "✅ force=1 -> MODE=full (rebuild+restart)" exit 0 fi - # Auto mode: uniquement annotations/media => hotpatch only + # 1) Détection des classes de changements + HAS_FULL=0 + HAS_HOTPATCH=0 + + # FULL si build-impacting (zéro surprise) + if echo "$CHANGED" | grep -qE '^(src/content/|src/anchors/|src/pages/|scripts/)'; then + HAS_FULL=1 + fi + + # HOTPATCH si annotations/media if echo "$CHANGED" | grep -qE '^(src/annotations/|public/media/)'; then + HAS_HOTPATCH=1 + fi + + echo "Gate flags: HAS_FULL=$HAS_FULL HAS_HOTPATCH=$HAS_HOTPATCH" + + # 2) Décision (priorité au FULL) + if [[ "$HAS_FULL" == "1" ]]; then + echo "GO=1" >> /tmp/deploy.env + echo "MODE='full'" >> /tmp/deploy.env + echo "✅ build-impacting change -> MODE=full (rebuild+restart)" + exit 0 + fi + + if [[ "$HAS_HOTPATCH" == "1" ]]; then echo "GO=1" >> /tmp/deploy.env echo "MODE='hotpatch'" >> /tmp/deploy.env echo "✅ annotations/media change -> MODE=hotpatch" - else - echo "GO=0" >> /tmp/deploy.env - echo "MODE='skip'" >> /tmp/deploy.env - echo "ℹ️ no annotations/media change -> skip deploy" + exit 0 fi + echo "GO=0" >> /tmp/deploy.env + echo "MODE='skip'" >> /tmp/deploy.env + echo "ℹ️ no deploy-relevant change -> skip deploy" + - name: Toolchain sanity + resolve COMPOSE_PROJECT_NAME run: | set -euo pipefail