Déployer son site statique automatiquement sur un Raspberry à la manière de Netlify
@devops

#bash #jekyll  2020-03-01T09:20

Netlify permet, entre autre entre, de se brancher à Github et de builder ton site statique automatiquement à chaque commit et de le déployer sur un serveur. Ce service est vraiment top car tu n’as rien à faire. Netlify s’occupe de tout.

C’est génial mais tu n’as pas forcément envie de dépendre d’un service tiers de plus. Ou alors comme moi, tu héberge toi-même ton serveur web.

J’ai une solution low tech à base de Crontab qui ne demande aucune dépendance: un script Bash. Assez basiquement il s’occupe de:

  1. faire un git pull si nécessaire
  2. rebuild le site avec Jekyll
  3. mettre à jour les sources du site

Ca tiens en 13 lignes de code. Voilà ce que ça donne:

#!/bin/bash
# deploy.sh

UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")

git fetch origin

if [ $LOCAL = $BASE ]; then
  git pull origin master
  /home/pi/.rvm/gems/ruby-2.4.0/wrappers/jekyll build
  rm -rf /var/www/portfolio/*
  cp -r _site/* /var/www/portfolio/
fi

Ce fichier est versionné avec mon projet Jekyll, je l’ai sobrement appelé deploy.sh et il est situé à la racine du projet.

Il suffit ensuite d’appeler ce script toutes les heures par exemples en mettant en place un CRON. Pour l’installer, il suffit de lancer la commande:

$ crontab

et ensuite copier / coller la ligne suivante (en adaptant à ton cas spécifique).

0 *  *   *   *    cd /home/pi/portfolio && ./deploy.sh

Et voilà, c’est terminé.

La seule limitation est le délais de latence vu que le CRON ne se lance que toutes les heures. On pourrais modifier le CRON pour l’executer toutes les minutes mais le mieux serais d’écouter un webhook de Github lors de la création d’un commit et relancer le build. C’est l’idéal mais c’est plus compliqué et du coup c’est un peu exagéré pour mon usage. Ca fait le taff et c’est très bien.

Licence Creative Commons
Cet article de Alexandre Rousseau est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.