In vergangenen Beiträgen habe ich darüber berichtet, wie ich unter YunoHost und auf meiner Synology NAS einen GitLab Runner installiert habe. Dieser Beitrag soll die Installation auf einem Linux Server mit Hilfe von Docker zeigen.
Voraussetzung
Ich habe ein V-Server mit einem Debian System aktiv und auf diesem möchte ich den Docker Container mit dem GitLab Runner starten. Bevor ich den Docker Container aufsetzen kann, muss ich Docker installieren. Dazu findest du genug Quellen im Internet. Ich melde mich über SSH auf meinem Server an, installiere Docker und kann dann den GitLab Runner aufsetzen.
GitLab Runner Container erstellen
Als erstes werde ich den Docker Container erstellen und starten.
docker run -d --name gitlab-runner --restart always --memory 8g\
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
In der ersten Zeile gebe ich ein paar Parameter für den Docker Container an. Den Namen setze ich auf gitlab-runner und der Neustart Modus wird auf always gesetzt. Alternativ zu always geht auch unless-stopped. Zusätzlich möchte ich den Arbeitsspeicher auf 8GB begrenzen, weil ich in der Vergangenheit schlechte Erfahrung gemacht habe, wenn ich dies nicht mache.
In Zeile zwei und drei möchte ich Verzeichnisse einbinden (mounten). Als erstes ist es das Konfigurationsverzeichnis, damit ich die Konfigurationsdatei auch auf dem Server direkt ansehen kann. Da ich innerhalb des GitLab Runners Docker benötige, muss ich zusätzlich die Docker Engine einbinden.
In der vierten Zeile gebe ich noch das Docker Image des GitLab Runners an. Ich verwende die aktuellste Version.
Arbeiten mit dem Gitlab Runner
Neuen Runner registrieren
Als nächstes werde ich einen GitLab Runner registrieren, damit ich diesen auch für meine GitLab CI/CD Pipeline verwenden kann. Dies mache ich mit dem folgenden Befehl:
docker exec -it gitlab-runner gitlab-runner register
Bei der Registrierung benötige ich die URL meines GitLab Systems und einen Token. Ich möchte den Runner als shared Runner einrichten, damit ich diesen in allen Projekten verwenden kann. Um den Token zu bekommen muss ich im Admin Bereich zu den Runners navigieren (Overview>Runners). Hier finde ich den Registrierungstoken über den Button Register an instance runner. Den muss ich kopieren und entsprechend eintragen.
Anschließend gebe ich eine Beschreibung und die gewünschten Tags ein. Als nächstes gebe ich an, wie der GitLab Runner ausgeführt werden soll. In meinem Fall wähle ich docker aus. Das default Docker Image setze ich auf ein Microsoft Image mit .NET 6.0. Weitere Docker Images sind auf der Docker Hub Seite zu finden. Das default Docker Image wird verwendet, wenn kein anderes Image in der .gitlab-ci.yml Datei angegeben wird.
Die Registrierung war erfolgreich und der GitLab Runner wird mir in GitLab unter den shared Runners angezeigt.
Verschiedene Befehle für den GitLab Runner Container
Hier sind ein paar nützliche Befehle zum Arbeiten mit dem GitLab Runner Container:
# GitLab Runner auflisten
docker exec -it gitlab-runner gitlab-runner list
# GitLab Runner stoppen
docker exec -it gitlab-runner gitlab-runner stop
# GitLab Runner starten
docker exec -it gitlab-runner gitlab-runner start
# GitLab Runner neustarten
docker exec -it gitlab-runner gitlab-runner restart
# GitLab Runner aus GitLab entfernen
docker exec -it gitlab-runner gitlab-runner unregister --name <NAME>
Konfigurationsdatei
Die Konfigurationsdatei der GitLab Runner können wir uns auf dem Server ansehen.
cat /srv/gitlab-runner/config/config.toml
In der Konfigurationsdatei sind ein paar globale Optionen definiert und im unteren Teil ist dann die Konfiguration für jeden registrierten GitLab Runner hinterlegt. Meine Konfigurationsdatei sieht folgendermaßen aus:
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "Dotnet Runner"
url = "<GitLab url>"
token = "<GitLab Token>"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "mcr.microsoft.com/dotnet/sdk:6.0"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0