To Jekyll and Beyond

Publié le 08/11/2020

Apr√®s avoir pas mal chipot√© entre Pelican, Wordpress, mon propre g√©n√©rateur, mes envies, mes r√Ęleries, j'ai finalement switch√© vers Jekyll.

A première vue, c'est un générateur qui fait un peu figure de mamie, au milieu des petits nouveaux que sont Hugo, Hexo ou Zola. Ce qui m'a décidé:

  1. Quel que soit le générateur, il m'aurait fallu repasser dans tous mes articles pour compléter le frontmatter en YAML.
  2. Je n'ai jamais accroché à la syntaxe des templates de Hugo (ce qui a même valu au créateur de Zola de démarrer son propre générateur de site statique)
  3. Le frontmatter de Zola est en ... TOML. Il est prévu d'autoriser une version stricte de YAML, mais ce n'est pas encore intégré sur la branche principale. Quitte à retravailler tous mes articles dans un format, autant que ce format soit relativement portable et ne me demande pas trop de travail la prochaine que j'aurai une envie de changement.
  4. Jekyll est orient√© blogs. Il n'est pas n√©cessaire de trop r√©fl√©chir √† sa structuration, dans la mesure o√Ļ toute l'architecture est orient√©e vers du contenu chronologique.
  5. Jekyll vient avec un r√©pertoire fourni de plugins et de th√®mes. A nouveau, comme la structure est bien document√©e, ce sont les th√®mes qui s'adaptent au contenu, et pas l'inverse - je pense principalement √† Hugo, o√Ļ chaque th√®me peut d√©finir un ensemble de nouvelles propri√©t√©s pour pr√©senter un affichage coh√©rent, ou √† Zola o√Ļ certains th√®mes ne fonctionnent que si la structure des r√©pertoires exig√©e par le th√®me est respect√©e.

Et pour couronner le tout, certains plugins permettent de se passer de frontmatter, disposer d'un moteur de recherche (basé sur lunr.js) ou d'une table des matières.

En bref, c'est joli, fonctionnel, facile à mettre en place, permissif et flexible. Tout ce que j'aime dans un outil :-)

Le seul point un chouia négatif concernerait la mise en place en elle-même, puisqu'il faut disposer d'un environnement Ruby, de plusieurs dépendances, que l'installation sous Windows n'est pas des plus faciles, ... et en même temps, je m'en fiche, parce que la génération va passer par Drone.

Zou, c'est parti pour la configuration!

Configuration des clés SSH

Par sécurité (?), j'ai créé un nouvel utilisateur jekyll sur le serveur.

adduser --disabled-login --gecos 'jekyll' jekyll
su - jekyll
ssh-keygen -t ed25519
cat .ssh/ed25519 > .ssh/authorized_keys

Configuration de Drone

Pour configurer Drone, il n'y a pas grand chose à faire. Juste quelques essais à réaliser (et donc quelques builds qui ont échoué).

Build 1 - ruby:latest

Le premier build a r√©ussi, mais je n'ai pas pris beaucoup de risques: j'ai juste c√Ębl√© la derni√®re image disponible pour Ruby, puis d√©marr√© la construction du site √† partir des sources. Forc√©ment, √ßa a r√©ussi. Mais entre le t√©l√©chargement de l'image, la r√©cup√©ration des pr√©requis et la construction des d√©pendances, il faut compter pr√®s de 5 minutes pour avoir un r√©sultat. Il y a sans doute moyen d'am√©liorer √ßa...

Build 2 - ruby:latest + deploy step

Le deuxième build ajoute une étape de déploiement via SCP au pipeline. Sauf que comme un gros débile, j'ai mal nommé les secrets entre le pipeline et les secrets. On recommence.

Build 3 - ruby:latest + deploy step (2)

Avec les bons secrets, ça passe. Jusqu'à l'authentification de mon utilisateur jekyll sur le serveur. Il fallait encore ajouter la clé dans le fichier /home/jekyll/.ssh/authorized_keys pour qu'il puisse se connecter.

Après cela, le déploiement s'est correctement déroulé! Plus qu'à accélérer les étapes qui peuvent l'être.

Build 4 - jekyll:latest

Permission denied @ dir_s_mkdir à l'étape de construction :-( Après une petite recherche, il fallait ajouter chown -R jekyll:jekyll /drone dans les commandes à exécuter.

Build 5 - jekyll:latest + deploy = everything's fine!

Le fichier .drone.yml final ressemble à ceci:

kind: pipeline
name: default

steps:
- name: build
    image: jekyll/jekyll:latest
    commands:
    - chown -R jekyll:jekyll /drone
    - gem update --system
    - gem install bundler
    - bundle install
    - bundle exec jekyll build
- name: deploy
    image: appleboy/drone-scp
    settings:
    host: grimbox.be
    user:
        from_secret: ssh_user
    key:
        from_secret: ssh_key
    port: 22
    source:
        - _site/
    target: /var/www/grimbox.be

trigger:
    branch: [master]
    event: [push, tag]

Il y a sans doute moyen d'améliorer encore une étape ou deux, par exemple une petite notification avec l'état final via Telegram ou par email.

Configuration d'Nginx

Avec le pipeline ci-dessus, les fichiers sources sont copiés vers le répertoire /var/www/grimbox.be/_site. J'ai simplement modifié la variable root dans mon fichier de configuration.

Conclusion

A chaque push ou tag sur la branche principale, les sources sont envoyées dans un container avec la dernière version de jekyll, qui s'occupe de la construction, pour ensuite la passer via SCP à mon serveur.

Au final, je pense que c'est un tout petit peu de l'overkill que d'instancier un nouveau container juste pour envoyer des fichiers via SCP... Et je me demande si ce type d'outil ne serait pas simplement présent sur l'image jekyll de base, pour économiser un chouia en ressource. Le soucis alors serait que l'étape de déploiement serait inclue dans l'étape de construction...

Mais au final, j'ai ce que je voulais:

  • Mes sources dans un d√©p√īt Git, avec historique.
  • Un pipeline de d√©ploiement continu (relativement simple, je vous l'accorde)
  • La possibilit√© d'utiliser n'importe quel √©diteur: Codium, l'√©diteur de Gitea, ...
  • Une fonction de recherche sur le site
  • Quelques friandises utiles et une chouette pr√©sentation au travers du th√®me minimal-mistakes - que j'aimerais encore peaufiner un peu.
  • La possibilit√© de s√©parer mes articles selon leur cat√©gorie, tout en conservant une trame chronologique qui ne soit pas proprement s√©par√©e en sections.

Et le tout, avec un time-to-market de moins de 40 secondes entre le push et la mise en production :-)

Ressources