de DevOps Software Gitlab

Gitlab - Runner hinzufügen mit docker

Wenn man eine Pipeline ausführen möchte benötigt man Server die genau diese Anweisungen ausführen. In Gitlab nennt man das einen Runner. Ein Runner dabei auf verschiedene Art und Weise installiert und konfiguriert werden. Wir beschäftigen uns hier mit der Art einen Runner als docker-compose zu verwalten und zu steuern.

Vorraussetzungen bei Gitlab

Um den Worker hinzufügen zu können müssen wir erst einmal ein neues Zertifikat für Gitlab erzeugen. Sollte bereits ein neues eigenes Zertifikat bei Gitlab drin sein muss selber geprüft werden ob es mit diesem Zertifikat geht. Bei dem Standard-Passwort fehlt leider das subjectAltName im Zertifikat und ist damit für eine Runner Anmeldung unbrauchbar.

Wir generieren also ein neues Zertifikat und kopieren es an direkt an die richtige Stelle. Danach müssen wir Gitlab neu starten.

1# generieren von Zertifikaten
2openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout your-host.tld.key -out your-host.tld.crt -days 356 -subj "/C=CC/ST=State/L=City/O=Your Organization Name/OU=Your Department/CN=your-host.tld" -addext "subjectAltName = DNS:localhost,DNS:gitlab.fritz.box"
3
4# Kopieren der Zertifikate in die Gitlab Konfiguration
5
6cp your-host.tld* /etc/gitlab/ssl/

Bedenke dabei, dass die Zertifikate natürlöich noch umgenannt werden müssen, so dass die Namen den Namen in dem Ordner gleich sind bzw. die vorhandene Zertifikate überschrieben wurden.

Gitlab nun einmal neu starten und wir können unser Runner anmelden.

1gitlab-ctl restart

Unseren Runner anmelden

Um einen neuen Runner anzumelden müssen wir in die Runner Konfiguration navigieren. Diese finden wir in dem Admin-Bereich unter CI/CD => Runners. Die Seite sollte ohne vorhandene Runner wie folgt aussehen

Leere Runner Seite

Wir klicken oben Rechts nun auf den Button New instance runner.

Leere Runner Seite

Die Einstellungsseite für unseren Runner öffnet sich und wir können sowas festlegen, dass er nur Jobs ausführt die bestimmte Tags (die müssen wir dann selber definieren) haben oder aber auch Jobs ausführt die gar keine Tags haben. Wir müssen außerdem noch eine Beschreibung für den Runner festlegen.

Wenn wir das alles ausgefüllt haben klicken wir auf create runner.

Leere Runner Seite

Den Runner registrieren

Nun bekommen wir ein Token, womit wir unseren Runner registrieren können. Wir erstellen uns also erstmal eine Datei, die wir docker-compose.yml nennen. Wir brauchen nun für unsere Runner ein Container, der uns die Konfiguration generiert und einen der diese anschließend benutzt. Um keine Benutzereingaben zu machen können wir beim registrieren den Parameter --non-interactive mitgeben. Wir mounten also ggf. das Zertifikat von unserrer Gitlab Instanz mit min den Container und rufen den register Befehl auf.

1version: '3.8'
2services:
3  gitlab-runner-init1:
4    image: gitlab/gitlab-runner
5    volumes:
6     - ./gitlab.fritz.box.crt:/ssl/gitlab.fritz.box.crt

Runner Image mit dem Zertifikat

Das command sieht nun erstmal wie folgt aus:

1register --non-interactive

Hier muss natürlich nun alle Parameter angegeben werden, die man für den Runner benötigt. Um eine genaue Liste zu bekommen kann man mittels help eine Übersicht über alle Parameter bekommen. Für uns ist aber, da wir einen docker Runner aufsetzen möchten wichtig, dass wir das baseimage mitgeben.

1register - register --non-interactive --url=https://gitlab.fritz.box --token=DEIN_TOKEN --executor=docker --tls-ca-file=/ssl/gitlab.fritz.box.crt --docker-image=alpine:latest --description=docker-runner

vollständdiger register Befehl. Der Token muss aber natürlich ebenfalls gewechselt werden

Dieses Register erstellt nun eine Konfigurationsdatei. Diese können wir außerhalb des Containers schreiben lassen und von einem anderen Container (den eigentlichen runner) dann laufen lassen. Dafür fügen wir oben bei volumes z.B. unsere config1 hinzu und schreiben quasi das gleiche für einen weiteren service den wir gitlab-runner1 nennen. Wichtig ist hierbei, dass dieser gitlab-runner1 natürlich unsere Config mounted und auf den init Container wartet.

 1version: '3.8'
 2services:
 3  gitlab-runner-init1:
 4    image: gitlab/gitlab-runner
 5    volumes:
 6     - ./gitlab.fritz.box.crt:/ssl/gitlab.fritz.box.crt
 7     - ./config1:/etc/gitlab-runner/
 8    command:
 9      - register
10      - --non-interactive
11      - --url=https://gitlab.fritz.box
12      - --token=DEIN_TOKEN
13      - --executor=docker
14      - --tls-ca-file=/ssl/gitlab.fritz.box.crt
15      - --docker-image=alpine:latest
16      - --description=docker-runner
17  gitlab-runner1:
18    image: gitlab/gitlab-runner
19    volumes:
20      - ./gitlab.fritz.box.crt:/ssl/gitlab.fritz.box.crt
21      - ./config1:/etc/gitlab-runner/
22    depends_on:
23      gitlab-runner-init1:
24        condition: service_completed_successfully

Mit einem docker-compose up in gleichen Verzeichnis werden die Container gestartet

Das ganze kann natürlich nun beliebig erweitert werden mit z.B. zwei Workern wie hier als Beispiel gezeigt wird.

 1version: '3.8'
 2services:
 3  gitlab-runner-init1:
 4    image: gitlab/gitlab-runner
 5    volumes:
 6     - ./gitlab.fritz.box.crt:/ssl/gitlab.fritz.box.crt
 7     - ./config1:/etc/gitlab-runner/
 8    command:
 9      - register
10      - --non-interactive
11      - --url=https://gitlab.fritz.box
12      - --token=DEIN_TOKEN
13      - --executor=docker
14      - --tls-ca-file=/ssl/gitlab.fritz.box.crt
15      - --docker-image=alpine:latest
16      - --description=docker-runner
17  gitlab-runner-init2:
18    image: gitlab/gitlab-runner
19    volumes:
20     - ./gitlab.fritz.box.crt:/ssl/gitlab.fritz.box.crt
21     - ./config2:/etc/gitlab-runner/
22    command:
23      - register
24      - --non-interactive
25      - --url=https://gitlab.fritz.box
26      - --token=DEIN_TOKEN
27      - --executor=docker
28      - --tls-ca-file=/ssl/gitlab.fritz.box.crt
29      - --docker-image=alpine:latest
30      - --description=docker-runner
31  gitlab-runner1:
32    image: gitlab/gitlab-runner
33    volumes:
34      - ./gitlab.fritz.box.crt:/ssl/gitlab.fritz.box.crt
35      - ./config1:/etc/gitlab-runner/
36    depends_on:
37      gitlab-runner-init1:
38        condition: service_completed_successfully
39  gitlab-runner2:
40    image: gitlab/gitlab-runner
41    volumes:
42      - ./gitlab.fritz.box.crt:/ssl/gitlab.fritz.box.crt
43      - ./config2:/etc/gitlab-runner/
44    depends_on:
45      gitlab-runner-init2:
46        condition: service_completed_successfully