Aller au contenu

CI/CD avec GitLab Runner local pour déployer automatiquement un blog Hugo

Rogelio Guerra Riverón
Auteur
Rogelio Guerra Riverón
Construction de ma propre infrastructure web depuis zéro. Je documente chaque étape : serveurs, réseaux, conteneurs et tout ce qui se présente.

Introduction
#

Fatigué de faire des déploiements manuels de mon blog Hugo chaque fois que je publie un article. J’ai décidé de mettre en place un pipeline CI/CD local avec GitLab Runner. Le résultat : automatique, fiable et sans dépendre de services externes.

Prérequis
#

Tu as besoin de :

  • Un serveur avec Docker installé
  • Un référentiel sur GitLab (peut être auto-hébergé ou gitlab.com)
  • Hugo installé localement pour les tests
  • Accès SSH configuré sur ton serveur

Installation de GitLab Runner
#

D’abord, tu dois installer GitLab Runner sur ton serveur. Je l’ai fait dans Docker parce que j’avais déjà le démon en cours d’exécution.

docker pull gitlab/gitlab-runner:latest

docker run -d --name gitlab-runner \
  --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  gitlab/gitlab-runner:latest

Cela monte le socket Docker pour que le runner puisse exécuter des conteneurs imbriqués. Important pour construire des images.

Enregistrer le Runner
#

Tu as besoin d’un token de ton projet GitLab. Tu le trouves à : Configuración del proyecto → CI/CD → Runners

Puis tu exécutes :

docker exec -it gitlab-runner gitlab-runner register \
  --url https://gitlab.com/ \
  --registration-token TU_TOKEN_AQUI \
  --executor docker \
  --docker-image alpine:latest \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock \
  --description "Runner Local Hugo"

Choisis Docker comme exécuteur. C’est le plus propre pour ce cas.

Configurer le pipeline
#

À la racine de ton référentiel, tu crées .gitlab-ci.yml :

stages:
  - build
  - deploy

variables:
  DEPLOY_PATH: /home/deploy/blog-hugo/public

build:
  stage: build
  image: alpine:latest
  before_script:
    - apk add --no-cache hugo git
  script:
    - hugo --minify
    - echo "Build completado"
  artifacts:
    paths:
      - public/
    expire_in: 1 week
  only:
    - main

deploy:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk add --no-cache openssh-client rsync
    - mkdir -p ~/.ssh
    - echo "$DEPLOY_KEY" | base64 -d > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - ssh-keyscan -H localhost >> ~/.ssh/known_hosts
  script:
    - rsync -avz --delete public/ deploy@localhost:${DEPLOY_PATH}
    - ssh deploy@localhost 'sudo systemctl restart nginx'
  only:
    - main
  when: on_success

Variables d’environnement
#

Dans Configuración del proyecto → CI/CD → Variables, ajoute :

  • DEPLOY_KEY : Ta clé SSH privée en base64 (cat ~/.ssh/id_rsa | base64 -w0)
  • DEPLOY_PATH : Chemin où tu veux les fichiers (j’utilise /home/deploy/blog-hugo/public)

Utilisateur de déploiement
#

Sur ton serveur, tu crées un utilisateur spécifique :

sudo useradd -m -s /bin/bash deploy
sudo usermod -aG docker deploy
sudo mkdir -p /home/deploy/blog-hugo/public
sudo chown deploy:deploy /home/deploy/blog-hugo

Configure la clé SSH publique du runner :

sudo -u deploy ssh-keygen -t ed25519 -N "" -f /home/deploy/.ssh/id_rsa
cat /home/deploy/.ssh/id_rsa.pub >> /home/deploy/.ssh/authorized_keys

Vérifier que ça fonctionne
#

Fais un push sur la branche main :

git add .
git commit -m "Test CI/CD"
git push origin main

Sur GitLab, tu vois le pipeline en temps réel. Si tout va bien, en quelques secondes ton blog sera déployé.

sudo -u deploy cat /home/deploy/blog-hugo/public/index.html

Notes finales
#

  • Le runner local ne quitte jamais ton réseau. Contrôle total.
  • Les temps de build sont rapides parce que tout est sur la machine locale.
  • Si tu as besoin de mettre en cache des dépendances, configure des volumes persistants dans Docker.
  • J’ai mis des restrictions sur la branche main pour éviter les déploiements accidentels.

Après trois mois de fonctionnement sans problèmes. C’est simple mais efficace.


Équipement recommandé
#

Liens d’affiliation. Aucun coût supplémentaire pour toi.