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.
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
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
Wir klicken oben Rechts nun auf den Button New instance runner
.
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
.
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