Gitlab CI Test

H. Hoegl, 2021-01-05

Grober Aufbau

Aufgabe:

Das Gitlab Repository

https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/ci-test

enthaelt einen Text, der mit Spinx geschrieben wurde. Dieser Text soll durch CI/CD in Gitlab auf einem Buildserver mit Sphinx uebersetzt werden in HTML und danach in das Web-Verzeichnis auf den Deployment Server kopiert werden.

Drei beteiligte Rechner:

  1. Gitlab

  2. Build-Server

    Das ist der Rechner elk. Darauf läuft der „Runner“ in einem Docker Container. Alle Jobs die der Runner erledigt (siehe .gitlab-ci.yml) werden ebenfalls in Containern ausgefuehrt.

  3. Deployment-Server

    Das ist der Rechner login.rz.hs-augsburg.de, er liefert u.a. die Webseiten aus.

Build server

  • elk.informatik.hs-augsburg.de

  • docker.io installieren (sudo apt install docker.io)

  • Neues Schluesselpaar erzeugen:

    $ ssh-keygen -t ed25519 -C "hubert.hoegl@hs-augsburg.de"
    

    Die angegebene Email ist nur ein Kommentar. Man sollte auch kenntlich machen, dass das der Key fuer den Rechner elk ist (fehlt noch).

    Siehe in .ssh die zwei Dateien id_ed25519 und id_ed25519.pub. Den privaten Schlüssel als Variable SSH_PRIVATE_KEY in Gitlab eintragen.

  • Neue Variable SSH_KNOWN_HOSTS in Gitlab anlegen mit dem Inhalt:

    |1|2oPsdov3eNS2O6ob/2AT2YUdpTg=|MkWXX3YFZR+5wDEpTZkFnq34X3c= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLwGli2ru55RJc/gis8RcE5A0TgG7uumEMKFe35sCsyn+kbkbpLRPOpqcjouNuXnWeqmHEiP0cne4HDlbzhVQks=
    

    So bekommt man diesen Inhalt:

    (base) hhoegl@elk ~/ci-test $ ssh-keygen -H  -F login.rz.hs-augsburg.de
    # Host login.rz.hs-augsburg.de found: line 16
    |1|2oPsdov3eNS2O6ob/2AT2YUdpTg=|MkWXX3YFZR+5wDEpTZkFnq34X3c= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLwGli2ru55RJc/gis8RcE5A0TgG7uumEMKFe35sCsyn+kbkbpLRPOpqcjouNuXnWeqmHEiP0cne4HDlbzhVQks=
    

    Auf dem Build Server wird spaeter in einem Docker Container ein Ubuntu Linux gestartet. Darin wird dann .ssh angelegt und die .ssh/known_hosts Datei angelegt aus der Variable SSH_KNOWN_HOSTS. Somit ist dem Container (ssh client zum Login Rechner) dann der login Rechner bekannt. Siehe die .gitlab-ci.yml in diesem Repo.

  • Der oeffentliche Schluessel des Buildservers elk (~/.ssh/id_ed25519.pub) muss in der authorized_keys des Deploy-Servers login.rz.hs-augsburg.de eingetragen werden.

Runner auf dem Buildserver installieren

Lit.: https://docs.gitlab.com/runner/install/docker.html

Option 2 waehlen: Use Docker volumes to start the Runner container:

(base) hhoegl@elk ~ $ sudo docker volume create gitlab-runner-config
gitlab-runner-config

(base) hhoegl@elk ~ $ sudo docker run -d --name gitlab-runner --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v gitlab-runner-config:/etc/gitlab-runner \
  gitlab/gitlab-runner:latest

So war die Ausgabe dieses Kommandos:

(base) hhoegl@elk ~ $ sudo docker run -d --name gitlab-runner --restart always     -v /var/run/docker.sock:/var/run/docker.sock     -v gitlab-runner-config:/etc/gitlab-runner     gitlab/gitlab-runner:latest
Unable to find image 'gitlab/gitlab-runner:latest' locally
latest: Pulling from gitlab/gitlab-runner
d72e567cc804: Pull complete
#0f3630e5ff08: Pull complete
b6a83d81d1f4: Pull complete
795a1e0f662d: Pull complete
e26343354a23: Pull complete
df2906232f5a: Pull complete
e9423d1eea92: Pull complete
45a5486ea8e3: Pull complete
Digest: sha256:07d7c6d82b11646aa048427fadd9a1c0e5faa1efcea7e06689eadcf9b52da006
Status: Downloaded newer image for gitlab/gitlab-runner:latest
292a3298dbf47c6bcfa3ec681ac936644d24ff5b5144beeac35caff646161d5b

Nun muss man den Docker-Runner registrieren

Lit.: https://docs.gitlab.com/runner/register/index.html#docker

# fuer Docker volume mounts
sudo docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register

 So ist das Kommando gelaufen, einige Eingaben sind erforderlich:

(base) hhoegl@elk ~ $ sudo docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register
Runtime platform                                    arch=amd64 os=linux pid=6 revision=ece86343 version=13.5.0
Running in system-mode.

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://r-n-d.informatik.hs-augsburg.de:8080
Please enter the gitlab-ci token for this runner:
PgC9UhGXBBhhK84-yMQg
Please enter the gitlab-ci description for this runner:
[621561dc4271]:
Please enter the gitlab-ci tags for this runner (comma separated):
sphinx
Registering runner... succeeded                     runner=R1rrsRmV
Please enter the executor: kubernetes, parallels, shell, docker+machine, ssh, virtualbox, docker-ssh+machine, custom, docker, docker-ssh:
docker
Please enter the default Docker image (e.g. ruby:2.6):
ubuntu:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
  • Das Gitlab-CI Token bekommt man in den Gitlab CI/CD Settings.

  • Den Executor „docker“ nehmen.

Lit.: https://docs.gitlab.com/runner/executors/docker.html

Jetzt sieht man unter

https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/ci-test/-/settings/ci_cd

den neuen Runner.

_images/runner.jpg

Der neu erstellte Runner in Gitlab.

Siehe im Repo die Datei .gitlab-ci.yml.

Test

Nach commit und push des Repo laeuft die Pipeline los:

https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/ci-test/-/pipelines

Man sieht die Pipeline Stages „build“ und „deploy“ nacheinander mit einem grünen Haken. Der Vorgang dauert auf elk ca. 1 Minute.

Auf dem login Rechner sieht man das Ergebnis des „Deployment“:

http://www.hs-augsburg.de/homes/hhoegl/citest/main.html

Zweiten Runner einrichten

Weiteren Runner einrichten für ein anderes Repo:

https://r-n-d.informatik.hs-augsburg.de:8080/dvati/versuche

Kommandos:

sudo docker volume create gitlab-runner-config-dvati

# Achtung: Name gitlab-runner gibt es schon, deshalb gitlab-runner2
sudo docker run -d --name gitlab-runner2 --restart always -v /var/run/docker.sock:/var/run/docker.sock -v gitlab-runner-config-dvati:/etc/gitlab-runner gitlab/gitlab-runner:latest

# Registrieren (die noetigen Eingaben findet man in Settings/CI des Repo
# "versuche")
sudo docker run --rm -it -v gitlab-runner-config-dvati:/etc/gitlab-runner gitlab/gitlab-runner:latest register

Somit gibt es nun zwei Runner Container:

(base) hhoegl@elk ~/ci-test $ sudo docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED           STATUS          PORTS       NAMES
23ab2e9935d4        gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   18 minutes ago    Up 18 minutes               gitlab-runner2
292a3298dbf4        gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   4 hours ago       Up 4 hours                  gitlab-runner

Literatur