GitHub : Déployer un site web vers Gandi

Gandi permet de déployer un site web via git ou SFTP. Voyons comment automatiser le déploiement via SFTP.

Prérequis

Nous utiliserons lftp pour l’envoi des fichiers :

sudo apt install lftp

Manuel

Les étapes suivantes peuvent servir à déployer depuis n’importe quelle machine et ne sont pas liées à GitHub.

Constantes

D’abord, nous aurons besoin de définir ces constantes :

SFTP_URL='HOST'
SFTP_USER='USERNAME'
SFTP_PASSWORD='PASSWORD'
SFTP_PATH='/mnt/vhost/site/subfolder/'

⚠️ Approuver la Connexion

Indication

Bien que nécessaire, cette étape est à ne faire qu’une seule fois par machine.

Approuver la connexion au serveur pour éviter l’erreur « Fatal error: Host key verification failed » :

mkdir -p ~/.ssh \
    && ssh-keyscan -H "${SFTP_URL}" >> ~/.ssh/known_hosts

Répliquer

Voici la dernière étape qui permet de faire un miroir d’un dossier local vers un dossier distant (remplacer FOLDER par le dossier local) :

lftp \
    -e "mirror --delete --transfer-all --reverse --verbose=1 ./FOLDER ${SFTP_PATH} ; quit" \
    -u "${SFTP_USER},${SFTP_PASSWORD}" \
    "sftp://${SFTP_URL}"

Automatisation

Maintenant que les étapes sont connues, nous utiliserons un workflow GitHub pour déployer le site à chaque changement poussé sur la branche principale du dépôt.

Secrets

Dans les paramètres du dépôt GitHub, créer des secrets identiques aux constantes déclarées plus haut.

Workflow

Voici le script YAML complet :

.github/workflows/deploy.yml
name: Deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install dependencies
        run: sudo apt install -y lftp

      - name: Setup SSH
        run: |
          mkdir -p ~/.ssh
          ssh-keyscan -H ${{ secrets.SFTP_URL }} >> ~/.ssh/known_hosts

      - name: Mirror
        run: |
          lftp \
            -e 'mirror --delete --transfer-all --reverse --verbose=1 ./FOLDER ${{ secrets.SFTP_PATH }} ; quit' \
            -u '${{ secrets.SFTP_USER }},${{ secrets.SFTP_PASSWORD }}' \
            'sftp://${{ secrets.SFTP_URL }}'

Exemple Complet

Un exemple spécifique à Python, utilisé par ce site même, peut être visible par ici : BoboTiG/luma deploy.yml.

📜 Historique

2024-02-04

Premier jet.