Pelican!

Ce site est désormais motorisé par le moteur de blog statique Pelican.

Je cherchais un truc simple pouvant être hébergé sur l'espace de stockage mis à ma disposition par mon fournisseur de mail, Fastmail.

Je ne m´étendrais pas ici sur la configuration de Pelican, la documentation en ligne fait ca très bien. Je détaillerais simplement le setup que j'ai mis en place pour automatiser la publication des pages résultantes sur l'espace de stockage Fastmail.

Donc, en gros, l'idée, c'est d'avoir un git local dans lequel je gère les articles que je vais publier sur ce blog. Ce git local est synchronisé avec un serveur distant, dans un datacenter loin d'ici. A chaque fois que je pousse un truc sur le git remote, je veux que le site soit regénéré et mis à jour.

Pour configurer git, la procédure décrite par hr sur son site marche très bien. Une fois le dépôt git configuré, j'ai commencé à écrire ce texte. Au passage, j'ai ajouté un fichier .gitignore pour ne pas suivre certains répertoires, notamment output et pelican-{themes,plugins}.

Une fois le texte écrit, il faut pousser les fichiers sources vers le git remote. Il suffit pour celà d'utiliser la commande git push.

Mais d'abord, on va mettre en place un commit-hook, pour que, avant de pousser notre article sur le dépôt remote, on regénère le site et on le publie. Le code de ce commit-hook, .git/hooks/pre-push, ressemble à ca:

#!/bin/sh
# On récupère le dernier message de commit
lastcommit=`git log origin/master..HEAD --oneline`
# On génère la version du site avec les settings de publication
make publish
# On pousse le contenu du répertoire output sur l'espace WebDAV
cd output && /home/guigui/bin/davcpy.sh . https://myfiles.messagingengine.com
# Enfin, On ajoute le contenu des répertoires sous le controle de git
# et on commite et on pousse vers le dépot distant.
git add -A && git commit -m "$lastcommit" && git push origin master

Pour la copie sur l'espace WebDAV fourni par Fastmail, on utilise un client WebDAV, cadaver. Sauf que cadaver, c'est un vieux machin, qui ne supporte pas la récursion. Donc, pour pousser un répertoire dans lequel se trouve des sous-répertoires, faut itérer à la main, c'est anti-pratique au possible.

D'ou la ruse, davcpy.sh, qui itère sur les répertoires pour les créer si besoin, et uploade récursivement les fichiers:

#!/bin/sh

usage () { echo "$0 <src> <cadaver-args>*" >/dev/stderr; }
error () { echo "$1" >/dev/stderr; usage; exit 1; }

test $# '<' 3 || \
        error "Source and cadaver arguments expected!";

src="$1"; shift;
test -r "$src" || \
    error "Source argument should be a readable file or directory!";

cd "$(dirname "$src")";
src="$(basename "$src")";
root="$(pwd)";
rc="$(mktemp)";
{   
    find "$src" '(' -type d -a -readable ')' \
    -printf 'mkcol "%p"\n';
    find "$src" '(' -type f -a -readable ')' \
    -printf 'cd "%h"\nlcd "%h"\n'            \
    -printf 'mput "%f"\n'                    \
    -printf 'cd -\nlcd "'"$root"'"\n';
    echo "quit";
} > "$rc";

cadaver -r "$rc" "$@";
rm -f "$rc";

La dernière touche, c'est d'automatiser la connexion à l'espace WebDAV, pour ne pas avoir à rentrer son identifiant et son mot de passe à chaque fois. Cadaver peut s'automatiser comme un client ftp, en utilisant le fichier .netrc dans son $HOME directory. Dans mon cas, il ressemble à cà:

machine myfiles.messagingengine.com
        login yourfastmailemailadress
        password yourfastmailpassword

Ainsi, après avoir écrit cet article, en committant plusieurs fois en cours de route, il suffira de faire un 'git push' pour générer la version "publiable" de l'article, committer les changements dans le dépôt distant, et copier les fichiers dans l'espace de stockage qui va bien.

Note: dans l'exemple ci-dessous, les erreurs à la création des répertoires sont normales, parce que les répertoires existent déjà sur le serveur distant.

[guigui@localhost guigui2.net]$ git push
Enter passphrase for key '/home/guigui/.ssh/id_rsa': 
pelican /home/guigui/repos/guigui2.net/content -o /home/guigui/repos/guigui2.net/output -s /home/guigui/repos/guigui2.net/publishconf.py 
Done: Processed 1 articles and 0 pages in 0.15 seconds.
Creating `.': failed:
405 Method Not Allowed
Creating `./author': failed:
405 Method Not Allowed
Creating `./tag': failed:
405 Method Not Allowed
Creating `./theme': failed:
[...]
Uploading tags.html to `/tags.html':
Progress: [=============================>] 100.0% of 2388 bytes succeeded.
Uploading index.html to `/index.html':
Progress: [=============================>] 100.0% of 8914 bytes succeeded.
Uploading guillaume-guigui2-lasmayous.html to `/author/guillaume-guigui2-lasmayous.html':
Progress: [=============================>] 100.0% of 8946 bytes succeeded.
Uploading git.html to `/tag/git.html':
Progress: [=============================>] 100.0% of 8920 bytes succeeded.
Uploading hooks.html to `/tag/hooks.html':
Progress: [=============================>] 100.0% of 8922 bytes succeeded.
Uploading pelican.html to `/tag/pelican.html':
[...]
Connection to `myfiles.messagingengine.com' closed.

blogroll

social