name: Deploy on: push: branches: - main jobs: deploy: name: Deploy to Production runs-on: docker container: image: forgejo-ci-php:latest steps: - name: Checkout code run: | git clone --depth 50 --branch main https://oauth2:${{ github.token }}@forge.studio-variable.com/${{ github.repository }}.git . - name: Deploy via FTP env: USERNAME: ${{ secrets.USERNAME }} PASSWORD: ${{ secrets.PASSWORD }} PREPRODUCTION_HOST: ${{ secrets.PREPRODUCTION_HOST }} shell: bash run: | BEFORE="${{ github.event.before }}" ZEROS="0000000000000000000000000000000000000000" # Mode incrémental si BEFORE est un SHA connu (pas un premier push) et atteignable if [ "$BEFORE" != "$ZEROS" ] && git cat-file -e "${BEFORE}^{commit}" 2>/dev/null; then INCREMENTAL=true echo "=== Mode incrémental — fichiers modifiés depuis $BEFORE ===" git diff --name-status "$BEFORE" HEAD echo "============================================================" else INCREMENTAL=false echo "=== Mode full mirror (premier push ou BEFORE hors portée) ===" fi # vendor/ et kirby/ ne sont mis à jour que si composer.lock a changé. # Sans --ignore-time : les timestamps de composer install garantissent que # tous les fichiers sont transférés (évite les incohérences contenu/taille). # Escape hatch : inclure [deploy-vendor] dans le message de commit pour forcer. COMMIT_MSG=$(git log -1 --pretty=%B) if $INCREMENTAL; then if git diff --name-only "$BEFORE" HEAD | grep -q "^composer\.lock$" \ || echo "$COMMIT_MSG" | grep -q "\[deploy-vendor\]"; then VENDOR_CHANGED=true echo "=== vendor/ et kirby/ seront mis à jour ===" else VENDOR_CHANGED=false echo "=== composer.lock inchangé — vendor/ et kirby/ ignorés ===" fi else VENDOR_CHANGED=true fi if $VENDOR_CHANGED; then composer install --no-dev --optimize-autoloader fi { echo "set ftp:ssl-allow no" # Continuer même si une commande échoue (mkdir sur dossier existant retourne 550) echo "set cmd:fail-exit no" echo "open -u $USERNAME,$PASSWORD $PREPRODUCTION_HOST" if $INCREMENTAL; then # Incrémental : tous les fichiers modifiés depuis le SHA avant le push git diff --name-status "$BEFORE" HEAD | while IFS=$'\t' read -r status file; do case "$file" in .forgejo/*|local/*|site/accounts/*|site/cache/*|site/sessions/*) continue ;; esac if [ "$status" = "D" ]; then echo "rm -f \"$file\"" elif [ -f "$file" ]; then echo "mkdir -p \"$(dirname "$file")\"" echo "put \"$file\" -o \"$file\"" fi done else # Premier déploiement : full mirror echo "mirror --reverse --verbose --ignore-time --parallel=10 -x local/ assets assets" echo "mirror --reverse --verbose --ignore-time --parallel=10 -x accounts/ -x cache/ -x sessions/ site site" fi if $VENDOR_CHANGED; then echo "mirror --reverse --verbose --parallel=10 kirby kirby" echo "mirror --reverse --verbose --parallel=10 vendor vendor" fi echo "quit" } > /tmp/lftp-script.txt echo "=== Script lftp généré ===" cat /tmp/lftp-script.txt echo "==========================" lftp -f /tmp/lftp-script.txt