de DevOps Software Gitlab

Gitlab - Runner hinzufügen als systemd-Service

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 systemd-Service zu verwalten und zu steuern.

Um das zu tun brauchen wir erst einmal natürlich unseren Server und das Paket wo die Runner Binary drin ist. Das Paket können wir uns unter folgender URL downloaden.

1# vorher setzen wir noch einmal die Architektur für unser Paket
2export arch=amd64
3curl curl -LJO "https://s3.dualstack.us-east-1.amazonaws.com/gitlab-runner-downloads/latest/deb/gitlab-runner_${arch}.deb"

Das ganze wird nun installiert mittels des dpkg Befehls.

1dpkg -i gitlab-runner_${arch}.deb

Die gitlab-runner CLI sollte nun zur Verfügung stehen. Das ganze können wir natürlci hauch ausprobieren, indem wir die CLI einmal aufrufen und uns z.B. die Version anzeigen lassen.

1root@gitlab:~# gitlab-runner --version
2Version:      16.9.1
3Git revision: 782c6ecb
4Git branch:   16-9-stable
5GO version:   go1.21.7
6Built:        2024-02-28T16:51:21+0000
7OS/Arch:      linux/amd64

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

Wir kriegen hier oben einmal einen Befehl wie genau wir einen neuen Runner registrieren können. Diesen können wir uns auch genauso rauskopieren und abspeichern, da wir den Runner vorher installieren müssen. Für die Installation legen wir einen User und ein Verzeichnis fest. Normalerweise kann man hier einfach den User gitlab-runner und deren homedir nehmen, welches beides bei der Installation über das deb Paket erstellt wird.

1gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

Wir sollten nun wieder die Übersicht über alle Runner bekommen und sehen nun eine neue Kategorie für unsere Runner.

Leere Runner Seite

Unter dieser werden nun alle gleichen Runner angegeben, die sich mit den gleichen Token registriert wurden.

Nun kann man ganz einfach den zuvor abgespeicherten Befehl ausführen und es sollte die Abfrage kommen welche Art von Runner man haben möchte executor. Ich habe hier docker genommen und in meiner Pipeline die Möglichkeit zu haben docker-Container zu starten. Man kann hier aber auch Shell auswählen damit jeder Befehl innerhalb der Pipeline lokal ausgeführt wird. Danach kommen je nachdem was man für einen executor gewählt hat noch bestimmte andere Abfragen wie z.B. das baseimage oder die Standard Shell. Meldung oder eine Änhliche Meldung bekommen.

 1root@gitlab:~# gitlab-runner register  --url https://gitlab.fritz.box  --token glrt-Qnctr4s9XxyW1sbexeN8
 2Runtime platform                                    arch=amd64 os=linux pid=6504 revision=782c6ecb version=16.9.1
 3Running in system-mode.
 4
 5There might be a problem with your config based on jsonschema annotations in common/config.go (experimental feature):
 6jsonschema: '/runners/0/docker/services_limit' does not validate with https://gitlab.com/gitlab-org/gitlab-runner/common/config#/$ref/properties/runners/items/$ref/properties/docker/$ref/properties/services_limit/type: expected integer, but got null
 7
 8Enter the GitLab instance URL (for example, https://gitlab.com/):
 9[https://gitlab.fritz.box]:
10Verifying runner... is valid                        runner=Qnctr4s9X
11Enter a name for the runner. This is stored only in the local config.toml file:
12[gitlab]:
13Enter an executor: docker-windows, docker+machine, docker-autoscaler, ssh, docker, parallels, virtualbox, kubernetes, instance, custom, shell:
14docker
15Enter the default Docker image (for example, ruby:2.7):
16ubuntu
17Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
18
19Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

der runner ist damit aktiv und er sollte als Online angezeigt werden.

Leere Runner Seite

Troubleshooting

Es kann vorkommen, dass das Zertifikat angemeckert wird. Das kann man mittels --tls-ca-file Parameter mit angeben. Hier wird einfach auf das gitlab.crt Zertifikat verwiesen.

 1root@gitlab:~# gitlab-runner register  --url https://gitlab.fritz.box  --token glrt-Qnctr4s9XxyW1sbexeN8  --tls-ca-file=/etc/gitlab/ssl/gitlab.fritz.box.crt
 2Runtime platform                                    arch=amd64 os=linux pid=6483 revision=782c6ecb version=16.9.1
 3Running in system-mode.
 4
 5There might be a problem with your config based on jsonschema annotations in common/config.go (experimental feature):
 6jsonschema: '/runners/0/docker/services_limit' does not validate with https://gitlab.com/gitlab-org/gitlab-runner/common/config#/$ref/properties/runners/items/$ref/properties/docker/$ref/properties/services_limit/type: expected integer, but got null
 7
 8Enter the GitLab instance URL (for example, https://gitlab.com/):
 9[https://gitlab.fritz.box]:
10ERROR: Verifying runner... failed                   runner=Qnctr4s9X status=couldn't execute POST against https://gitlab.fritz.box/api/v4/runners/verify: Post "https://gitlab.fritz.box/api/v4/runners/verify": tls: failed to verify certificate: x509: certificate signed by unknown authority
11PANIC: Failed to verify the runner.

geht nun und der runner meldet sich richtig an