Installation D'un GitLab Runner Sur Un Raspberry PI en 10 Minutes
â Un runner ?
L’intĂ©gration continue de GitLab, plus connue sous le nom de GitLab CI fonctionne avec des runners qui exĂ©cutent les pipelines que vous dĂ©crivez dans vos projets. Sur gitlab.com, GitLab met Ă disposition des runners avec cependant une limitation en termes d’utilisation voir ici.
Les runners, dĂ©veloppĂ©s en Go, peuvent ĂȘtre installĂ©s sur n’importe quelle structure que ce soit sur le cloud ou chez vous de façon Ă avoir totalement la main sur leurs configurations.
đ€·ââïž Pourquoi un Raspberry PI ?
Depuis quelques annĂ©es, j’ai un projet perso sur GitLab qui me sert de “cobaye”, dans le sens oĂč il subit mes diffĂ©rentes tentatives de manipulation de langages, framework ou divers outils sur des cas d’utilisation sortant du contexte d’un simple “hello world”. Et le raspberry est une solution simple et pas chĂšre pour pouvoir tester cela.
AprĂšs avoir achetĂ© un raspberry pour y installer de la domotique, me voilĂ parti dans l’achat d’un autre raspberry oĂč j’ai pu dĂ©ployer k3s, une distribution Kubernetes trĂšs lĂ©gĂšre et adaptĂ©e aux machines ayant peu de mĂ©moire. Pour une infrastructure ARM telle un raspberry, câest lâidĂ©al. Lorsque j’ai voulu gĂ©nĂ©rer mon application pour cette structure ARM, j’ai sollicitĂ© fortement les runners jusqu’Ă arriver Ă recevoir des alertes sur la consommation Ă©levĂ©e de runners GitLab.
Alors pourquoi pas essayer tout simplement d’installer mon propre runner sur un raspberry ?
đ Mon raspberry PI
Je suis parti sur l’achat de la derniĂšre version de raspberry, un Raspberry Pi 4 ModĂšle B 8 Go Kit avec une carte SD de 64 Go disponible Ă 135,99 euros sur Amazon.
AprĂšs avoir installĂ© la derniĂšre version de Debian (la carte SD Ă©tait dĂ©jĂ configurĂ©e, dans le cas contraire vous pouvez aller sur ce site pour avoir la procĂ©dure Ă suivre), l’installation du runner GitLab peut ĂȘtre effectuĂ©e.
đ Installation du runner
L’installation se fait rapidement aprĂšs avoir tĂ©lĂ©chargĂ© le bon package armhf
curl -L0 debian gitlab-runner-armhf https://s3.amazonaws.com/gitlab-runner-downloads/master/deb/gitlab-runner_armhf.deb
puis exĂ©cuter le fichier d’installation (aprĂšs avoir donnĂ© les droits suffisant) :
sudo apt install -y gitlab-runner-armhf
A partir de lĂ , la commande gitlab-runner
est disponible :
đł Installation de docker
Comme je me base sur un exĂ©cuteur docker, j’ai Ă©galement dĂ» installer docker sur mon raspberry, ce qui se fait rapidement avec ces commandes :
sudo apt-get update && sudo apt-get upgrade
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker pi
Pour que la modification soit prise en compte, vous devez recharger le shell ou vous déconnecter/reconnecter à votre raspberry. La bonne installation de docker peut se vérifier en récupérant la version via la commande docker version
et en exécutant une image , par exemple hello-world via cette commande docker pull hello-world
qui doit renvoyer cela :
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm32v7)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Cette image est souvent citĂ©e pour vĂ©rifier son environnement, qu’il soit sous Windows, Linux, Mac ou ARM. Cette image est multi-plateformes et cela peut se vĂ©rifier sur le Docker Hub ou avec la commande docker inspect hello-world
.
pi@raspberrypi:~ $ docker inspect hello-world | grep 'Architecture'
"Architecture": "arm",
đŸ L’enregistrement du runner
Une fois le gitlab-runner créé, un lien entre votre runner et un projet GitLab existant est nécessaire. Pour cela, il suffit de lancer la commande
sudo gitlab-runner register
L’exĂ©cutable vous proposera de saisir :
- l’url de votre instance GitLab
- le token de votre projet, disponible dans Settings > CI/CD > Runners oĂč vous pouvez trouver le token d’enregistrement
- un tag associé à votre runner
- un exĂ©cuteur oĂč il est courant d’utiliser docker. Dans ce cas l’image par dĂ©faut pour exĂ©cuter votre CI vous sera demandĂ©e.
đ Plus de docs sur le site de GitLab : Doc GitLab
âïž La configuration de votre runner
Pour que votre CI utilise votre runner, vos scripts de CI doivent ĂȘtre modifiĂ©s pour indiquer le nom du tag de votre runner :
stages:
- build
my-job:
stage: build
tags: ["runner-pi"] # le tag associé à votre runner défini lors de l'enregistrement de votre runner
image:
name: golang:alpine
script:
- go mod download
- go get -d -v
- GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main .
Pour vérifier que votre pipeline a bien utilisé votre runner, il est possible de voir sur un job le runner utilisé :
đȘ Customisation du runner
Le fichier config.toml
La configuration du gitlab-runner est stockée dans le fichier /etc/gitlab-runner/config.toml
. Par défaut le nombre de job exécuté en parallÚle est de 1. Vous pouvez modifier cette valeur dans la premiÚre ligne du fichier et passer la variable concurrent
Ă 4 par exemple.
Le swap
Une autre dĂ©couverte (merci Guillaume), c’est autour du swap du raspberry. Cet espace de mĂ©moire est de base initiĂ© Ă 100MB et il est prĂ©conisĂ© par GitLab de monter Ă 4GB de swap. A prendre avec prĂ©caution car une forte charge du swap peut tout simplement ruiner votre carte SD.
En tout cas, pour faire l’upgrade de votre swap, il suffit de :
- arrĂȘter votre swap :
sudo dphys-swapfile swapoff
- ouvrir le fichier de configuration du swap :
sudo vi /etc/dphys-swapfil
- modifier la valeur du paramĂštre swap :
CONF_SWAPFILE
avec la valeur que vous désirez en MB (je suis resté à 2048 MB). - démarrer le swap :
sudo dphys-swapfile swapon
Kaniko
Dans mes pipelines GitLabCI, j’utilise habituellement l’outil Kaniko pour builder et pusher mes images dans un registry.
Sur Raspberry, l’exĂ©cution d’image Kaniko n’est pas possible malgrĂ© la prise en compte d’image taggĂ©e arm. A l’heure oĂč j’Ă©cris cet article, trois issues Ă©voquent ce problĂšme :
- https://github.com/GoogleContainerTools/kaniko/issues/1591
- https://github.com/GoogleContainerTools/kaniko/issues/1587
- https://github.com/GoogleContainerTools/kaniko/issues/1488
Pour pallier à cela, je me suis basé sur les commandes Docker :
- docker login -u gitlab-ci-token -p $CI_SECRET registry.gitlab.com
- docker build -t registry.gitlab.com/<le nom de votre image>:$CI_COMMIT_BRANCH -f $CI_PROJECT_DIR/Dockerfile .
- docker push registry.gitlab.com/<le nom de votre image>:$CI_COMMIT_BRANCH
oĂč :
- $CI_SECRET est une variable définie dans les paramÚtres de votre projet (Settings > CI/CD > Variables).
đ Edit : suite Ă des Ă©changes avec Philippe CharriĂšre, Kaniko fonctionne correctement avec un raspberry PI basĂ© sur une image Ubuntu.
Et voilĂ , votre runner GitLab est disponible sur votre raspberry et votre projet GitLab y est reliĂ©, il ne reste plus qu’Ă vous amuser avec đ đȘ.