Mettre en place une CI/CD Gitlab pour ce blog

Dans cet article, je mets en place une simple CI/CD Gitlab pour déployer un site statique généré par zola. En fait c'est l'occasion d'arrêter de déployer ce blog à la main et j'en fait un article 😉.

Configuration de la CI/CD Gitlab

Le gitlab-ci.yml a donc deux stages :

stages:
  - build
  - deploy

Le stage de Build

build:
  stage: build
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  script:
    - apt update && apt install -qy wget
    - wget -qO - https://github.com/getzola/zola/releases/download/v0.10.1/zola-v0.10.1-x86_64-unknown-linux-gnu.tar.gz | tar -zxvf -
    - zola build
  artifacts:
    paths:
      - public/

Ici j'utilise la variable GIT_SUBMODULE_STRATEGY car mon thème zola est un sous-module git de mon blog ainsi le dépôt est cloné de manière récursive par les runners Gitlab. Simplement, le binaire zola est récupéré puis le site statique est construit. Le dossier de build par défaut de zola est le dossier public, d'où la valeur de la variable artifacts.paths.

Stage de déploiement

deploy:
  stage: deploy
  script:
    - apt-get update && apt install -qy openssh-client
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
    - ssh user@mywebsite.com "rm -rf /path/to/the/public/directory"
    - scp -r public/ user@mywebsite.com:/path/to/the/public/directory

Les variables d'environnement $SSH_PRIVATE_KEY et $SSH_KNOWN_HOSTS doivent être renseignées dans les variables de la CI/CD Gitlab du projet :

Pour obtenir la valeur de la variable $SSH_KNOWN_HOSTS cela peut se faire via la commande ssh-keyscan :

ssh-keyscan mywebsite.com

Ces quelques lignes servent à :

Un seul stage

C'est peut-être ridicule d'avoir deux stages pour ce blog. Étant donnée la simplicité des tâches, il est préférable de tout faire dans un seul stage.

image: debian:buster-slim

buildanddeploy:
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  script:
    - apt-get update && apt install -qy wget openssh-client
    - wget -qO - https://github.com/getzola/zola/releases/download/v$ZOLA_VERSION/zola-v$ZOLA_VERSION-x86_64-unknown-linux-gnu.tar.gz | tar -zxvf -
    - ./zola build
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
    - ssh blog@zeph.one "rm -rf /home/blog/blog/public"
    - scp -r public/ blog@zeph.one:/home/blog/blog/

Une variable est même utilisée pour enregistrer la version de Zola :