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.

Mon PI

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 :

CI lint - error

🐳 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

CI use our runner

  • 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é :

CI use our runner

đŸȘ› 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

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 :

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 🚀 đŸ’Ș.