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:latestCela 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_successVariables 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-hugoConfigure 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_keysVérifier que ça fonctionne#
Fais un push sur la branche main :
git add .
git commit -m "Test CI/CD"
git push origin mainSur 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.htmlNotes 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
mainpour éviter les déploiements accidentels.
Après trois mois de fonctionnement sans problèmes. C’est simple mais efficace.
Équipement recommandé#
- Raspberry Pi 3 B+ — Serveur léger à faible consommation pour commencer ton homelab
- Raspberry Pi 4 (4GB) — La base parfaite pour homelab, Docker et monitoring
Liens d’affiliation. Aucun coût supplémentaire pour toi.