Déploiement continu de Hugo avec gitlab et docker

Hugo est un générateur de page web statique. Le contenu est écrit dans un format tel que le markdown, et hugo se charge de transformer ce contenu en pages html. Ces pages peuvent ensuite etre servies par n’importe quel serveur web capable de servire des pages statiques.

Installation

Comment mettre en place le déploiement continu du blog hugo ? Objectif : Dès qu’il y a un push sur master, le blog se met à jour avec le dernier contenu.

Container web server

Démarrer un serveur web dans un container docker. Nous allons utiliser nginx ici

docker run nginx:alpine -v blog-content:/usr/share/nginx/html -p 8080:80

Ici on bind le port 8080 de l’host sur le port 80 du container, sur lequel écoute nginx par défaut. Si on dispose d’un load balancer, il n’y a pas besoin de bind le port de l’host, il suffit de rediriger les requetes vers le port 80 du container.

Configuration du build gitlab

Configuration du runner

Il faut ajouter le volume au runner.

Pour cela, on modifie la conf du shared runner. Elle est dans le ficher /etc/gitlab-runner/config.toml. Dans la section [runners.docker], ajouter l’element “blog-content:/blog-content” à l’élement volumes (le créer s’il est vide) Exemple:

[runners.docker]
  host = ""
  hostname = ""
  volumes = ["/data", "blog-content:/blog-content"]

Le build gitlab se configure à l’aide du fichier gitlab-ci.yml On utilise la configuration suivante :

pages:
  image: publysher/hugo
  stage: build
  script:
  - apt-get install git
  - git submodule update --init --recursive
  - hugo
  - echo "Compilation suceeded"
  - rm -rf /blog-content/*
  - cp -r public/* /blog-content/
  only:
  - master

Les 2 premieres lignes sont utilisées pour cloner récursivement le thème. Ensuite, hugo permet de compiler le blog en fichiers html statiques. On déploie ensuite le blog, en remplaçant les fichiers dans le volume

On peut maintenant pusher des modifications sur master, le site sera mis à jour en quelques secondes.