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é jadis par ce site même, peut être visible par ici : BoboTiG/luma deploy.yml.

📜 Historique#

2024-02-04

Premier jet.