GitLab – Continous Integration-Server mit Docker für Tests

gitlabdocker Zum Entwickeln eigener Projekte habe ich zu Hause einen eigenen GitLab-Server installiert, den ich seit geraumer Zeit auch für Unit-Tests und Lint verwende. GitLab bietet dazu über einen Continous Integration-Server (kurz CI-Server), die Möglichkeit beim Einchecken von neuem Code automatisch die Tests ablaufen zu lassen und dem Entwickler bei Misserfolg über eine Mail in Kenntnis zu setzen. Zur Konfiguration des CI-Servers gibt es mehrere Möglichkeiten. Zum Einen kann der Code direkt auf dem Host des Servers ausgeführt werden. Das hat jedoch den Nachteil, dass ich bei bestimmten Entwicklungsumgebungen extrem aufpassen muss, dass diese mir nicht Probleme auf dem Server machen. Beispielsweise, wenn ich in Python bestimmte Bibliotheken in einer bestimmten Version benötige, diese jedoch von einem Programm auf dem Server in einer anderen Version gebraucht werden. Zum Anderen habe ich aber auch die Möglichkeit den Code in einem Docker-Container auszuführen. Dies hat mehrere Vorteile. Die angesprochene Problematk wird gelöst, da alle Entwicklungsumgebungen in einem separaten Container gestartet werden, was den Host nicht verändert und es lassen sich damit unterschiedliche Versionen testen. Soll die Software beispielsweise mit Nodejs 6.11.3 und 8.5.0 kompatibel sein, lässt sich beides testen, indem unterschiedliche Docker-Images zum Einsatz kommen.

Für die Konfiguration von GitLab mit Docker müssen wir zunächst einmal Docker installieren. Leider werden nicht immer die aktuellen stabilen Versionen von bestimmen Paketen mitgeliefert. Daher deinstallieren wir erstmal Docker, falls dies bereits vorhanden ist und fügen dann die aktuellen stabilen Quellen hinzu, bevor wir es letztlich installieren. Ich installiere das Ganze auf einem Ubunutu Server 16.04.3 LTS.

# remove old docker installation
sudo apt remove docker docker-engine docker.io
# add current stable docker sources
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# update sources
sudo apt update
# install community edition from docker
sudo apt-get install docker-ce
# upload and start docker container hello-world
sudo docker run hello-world

Nach dem letzten Befehl sudo docker run hello-world solltet ihr eine Ausgabe bekommen, die mit Hello from Docker beginnt, womit ihr die Installation von Docker erfolgreich abgeschlossen habt. Jetzt müssen wir den GitLab-Runner installieren und entsprechend mit Docker einen GitLab-Runner konfigurieren. Zur Installation des GitLab-Runner genügt folgender Befehl:

sudo apt install -y gitlab-ci-multi-runner

Für die Konfiguration benötigen wir jetzt noch ein paar individuelle Informationen eures GitLab-Servers. Dazu meldet ihr euch als Admin auf eurem GitLab-Server an und wechselt in der Admin-Area auf den Reiter Runners (sollte <GitLab-Server>/admin/runners sein). Dort findet ihr unter How to setup a shared Runner for a new project die Informationen, welche URL (<GitLab-Server>) und Token (<Token>) ihr im Folgdendne angeben müsst. Dazu einfach im folgenden Befehl die Platzhalter ersetzen und letztlich alles mit Enter quittieren.

sudo gitlab-runner register --url "<GitLab-Server>" --registration-token "<Token>" --description "docker" --executor "docker" --docker-image node:6.11.3

Dadurch haben wir jetzt einen GitLab-Runner konfiguriert, der als Standard-Image ein Nodejs-Server in Version 6.11.3 verwendet. Die Angabe des Docker-Images lässt sich aber in jeder gitlab-ci-Datei seperat definieren. Aktualisiert ihr jetzt die geöffnete GitLab-Seite (<GitLab-Server>/admin/runners), sollte dort ein neuer Runner-Eintrag vorhanden sein.

Möchtet ihr jetzt beispielsweise eure Nodejs-Applikation in Version 6.11.3 und 8.5.0 testen, so könnt ihr eurem Projekt die Datei .gitlab-ci.yml hinzufügen und folgenden Inhalt hinzufügen. Dadurch werden beide Versionen getestet.

node_6:
  image: node:6.11.3
  script:
   - npm install
   - npm run test

node_8:
  image: node:8.5.0
  script:
   - npm install
   - npm run test

Mit dieser Konfiguration laufen eurere Tests jetzt in einem vom Server-System abgekapselten Docker-Images, womit ihr die auf dem Server installierten Pakete unangetastet lassen könnt. Weiterhin könnt ihr jetzt mit unterschiedlichen Docker-Images euere Tests laufen lassen und somit besser eure Software testen. Ich hoffe der Beitrag hilft euch bei der Konfiguration und verbessert eueren Alltag. Solltet ihr Fragen oder Anregungen haben, dann könnt ihr mich jederzeit gerne kontaktieren.


Geschrieben von Christian Decker am 17.09.2017