Kurz howto Continuous Delivery mit GitLab CI

Aufbauend auf den Beitrag Kurz howto Continuous Integration mit GitLab CI wird dieser um Continuous Delivery erweitert. Dies geschieht anhand eines ssh-key ohne Passphrase und der weiteren Konfiguration der .gitlab-ci.yml. Im Netzwerk befindet sich ein zweiter Server, der die Daten per scp vom GitLab Server erhält.

Anlegen ssh-key für den gitlab-runner user.

:~# su - gitlab-runner
:~$ ssh-keygen                        #-> leere passphrase
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gitlab-runner/.ssh/id_rsa):
Created directory '/home/gitlab-runner/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/gitlab-runner/.ssh/id_rsa.
Your public key has been saved in /home/gitlab-runner/.ssh/id_rsa.pub.
The key fingerprint is:
d7:6f:99:eb:2b:7b:5a:4e:60:16:14:e2:94:b5:60:a5 gitlab-runner@debtest
The key's randomart image is:
+---[RSA 2048]----+
|            =+=. |
|           +.= . |
|           E o   |
|             . . |
|         S . =   |
|         . o o o |
|              B  |
|            .=.. |
|            o*=. |
+-----------------+

Der komplette Inhalt von /home/gitlab-runner/.ssh/id_rsa.pub wird auf den Remote-Server in die Datei .ssh/authorized_keys kopiert. Der Einfachheit halber in ein bestehendes user Konto in diesem falle hp.

:~$ cd /home/hp
:~$ mkdir .ssh
:~$ vim .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDU4J55viEEJ+gNrRyWGEt+u6tLLa2K2xzsWcZXUB9KkIgFRJRdE7bFV+aA0IVg1rEbFFH8ZXxPE3hj9dhr4WRZj3tLSZPLxSgYRbabN3aPe6ZcCBCfNqt1RnQVPKxokHpbIMv1TggpQ7EPsIsyaKFBb/lecROSdjDn4cdJ+KdFDpYGkPrJDqe09SD2io+VbkZGd1jVJhPk1Heua5PfgFNWVIOBpiwaPYwnPhYl71qmDPWKuMme6AzAh/qBXirKRqBpRJtBZFTpimPTYCEIfvGGe+U2iXrdQR6iW+GtaAAwxp3QURgjBaHXWyKAAQ00fn9eMEN52yf6DFIWaeZgcFkT gitlab-runner@debtest

:~$ chmod 600 .ssh/authorized_keys
:~$ chmod 700 .ssh
:~$ chown -R hp. .ssh

Ein Testaufruf auf der Konsole zeigt, ob der ssh Zugriff ohne weitere Eingabe funktioniert. Beim ersten Aufruf muss noch eine Frage mit yes zum akzeptieren des Remote-Server ssh-key beantwortet werden. Diese Meldung sollte bei einem erneuten Aufruf wegfallen und ein Login ohne weitere Eingabe sollte möglich sein.

:~# su - gitlab-runner
:~$ ssh hp@192.168.202.225
The authenticity of host '192.168.202.225 (192.168.202.225)' can't be established.
ECDSA key fingerprint is 6b:12:3f:a0:fe:bf:2d:1e:a3:9b:4a:21:f1:3f:95:f1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.202.225' (ECDSA) to the list of known hosts.

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
hp@devdeb:~$

Die Erweiterung für das Deployment der .gitlab-ci.yml im Repository.

tidy_html:
    stage: test
    script:
        - tidy -q -e *.html
        - php -l *.php
        - zip /tmp/htmltest-$(date '+%s').zip *

deploy to devdeb:
    stage: deploy
    script: scp -r * hp@192.168.202.225:/opt/cd_test/
    environment: devdeb

Bei einem Commit in das Repository kann im GitLab GUI der Build Test und das Deployment unter Pipelines -> Pipelines beobachtet werden.

gitlab pipelines status
gitlab pipelines status

Je nachdem, ob bei stage Test oder stage Deploy der Build fehlschlägt, wird dies ebenfalls angezeigt.

gitlab pipelines
gitlab pipelines

Mit weiteren Klicks auf die verschiedenen „Icons“ werden wieder erweiterte Informationen zur Verfügung gestellt. Hier ein Beispiel für das fehlgeschlagene Deployment auf den Remote-Server.

gitlab pipelines failed deploy
gitlab pipelines failed deploy

Unter Pipelines -> Environments und dem konfigurierten environment: devdeb aus der .gitlab-ci.yml befinden sich alle erfolgreich gelaufenen Deployments. Diese können mit einem Klick auf Rollback auf einen zurückliegenden Stand zurückgesetzt werden.

gitlab pipelines environments
gitlab pipelines environments