Déploiement d'un site Hugo sur Gitlab et Github
On y pense pas toujours, mais le temps de maintenance d’un site peu vite prendre du temps. Bien qu’avec un Wordpress ça se fasse simplement, il faut toujours suivre son site. L’avantage des générateurs de site statiques est que la maintenance disparait. Alors comme beaucoup aujourd’hui, j’en ai adopté un il y a 2 ans environ. Tout fonctionneait parfaitement même si le thème par défaut que je n’avais pas modifier ne me plaisais pas trop.
Aujourd’hui, je vais vous parler de Hugo. Ce générateur de site static est à la mode mais ce n’est pas la seule raison de mon changement. Je suis un peu alergique au modification d’un système d’exploitation autrement que par son gestionnaire de paquet (à la rigueur j’accepte la compilation de source installé dans /usr/local/). J’ai donc exclu lektor à cause de pip.
Je passerai volontairement sur l’installation et la création d’un premier site qui sont bien documentés.
L’article du jour concerne le déploiement continu (alias CD) du site sur Gitlab Pages et Github Page depuis Gitlab CI.
Pour un déploiement simple sur Gitlab, il n’y a pas grand chose à faire pour que ça fonctionne. L’exemple de .gitlab-ci.yml proposé sur le site de hugo fonctionne parfaitement.
Pour un déploiement en simultané sur Github, il va nous faloir générer une pair de clé ssh dédiée pour l’opération. La commande suivante devrait nous permettre d’y parvenir :
ssh-keygen -t ed25519 -b 256 -f github
Le contenu de la clé publique sera utiliser pour créer une nouvelle clé de déploiement dans les préférences du projet Github :

Le contenu de la clé privée sera, lui, utilisé comme variable dans l’intégration et livraison continue du projet Gitlab au coté de l’email et du login :

Maintenant il ne reste plus qu’à rajouter quelques lignes dans la section script du fichier .gitlab-ci.yml pour récupérer le dépôt depuis Github, nétoyer le répertoire et pushé le tout un fois le build fait. Cela nous donne quelque chose comme ceci:
pages:
script:
- mkdir -m 700 ~/.ssh; echo "$GITHUB_KEY" > ~/.ssh/id_ed25519; chmod 600 ~/.ssh/id_ed25519; ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
- git clone [email protected]:${MY_NAME}/project_name.github.io.git public
- rm -fr public/*
- hugo
- git config --global user.email "$MY_EMAIL"; git config --global user.name "$MY_NAME"
- cd public; git add -A; git commit -m "Auto update"; git push --force
artifacts:
paths:
- public
only:
- master
Edit: La synchronisation fonctionne bien et restera en l’état pour le moment, github gère son certificat let’s encrypt lui même, ce qui ne permet pas de faire du loadbalancing pour le moment.