~~NOTOC~~
===== Webseiten veröffentlichen mit Gitlab =====
Gitlab kann u.a. auch dafür verwendet werden, Webauftritte mit eigenem Editor-Workflow zu erstellen bzw. zu managen. Dazu bietet Gitlab standardmäßig das //Pages// Feature an. Hierbei wird das Ergebnis, der fertige Webauftritt, unter der //Pages-URL//
https://BENUTZER.io.noc.ruhr-uni-bochum.de/PROJEKTNAME
bzw.
https://GRUPPENNAME.io.noc.ruhr-uni-bochum.de/PROJEKTNAME
veröffentlicht. Mit einfachen Mitteln kann die verwendete CI/CD-Pipeline, die für die Erstellung der Webseiten sorgt, so erweitert werden, dass diese auf einem entfernten Server veröffentlicht werden.
==== Eckdaten und Voraussetzungen ====
Um die fertigen Webseiten auf dem entfernten Server zu veröffentlichen wird ein SSH-Zugang zu diesem Server benötigt, da nicht die "normalen" Zugangsdaten für diesen Server verwendet werden sollen (die Zugangsdaten müssen auf dem Gitlab-Server hinterlegt werden). Vollständiger Shell-Zugang mit installiertem rsync wäre optimal, in diesem Beispiel steht aber nur der minimale SFTP Zugang zur Verfügung.
Für das Beispiel wird mein Gitlab-Projekt //talks// verwendet, in dem ich viele meiner Vorträge archiviert habe, mit dem Ziel diese auf dem Homepage-Server der RUB zu veröffentlichen.
==== Zugang ermöglichen ====
Damit nicht die normalen Zugangsdaten für den Hompepage-Server im Gitlab hinterlegt werden müssen, wird ein SSH-Schlüsselpaar für genau diesen Zweck erzeugt:
user@work:~$ ssh-keygen -t ed25519 -C 'GitLab deployment key'
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519): gitlab-deployment
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in gitlab-deployment
Your public key has been saved in gitlab-deployment.pub
The key fingerprint is:
SHA256:FtulN3htxaX0VwaZixcYDOZ1nMT0q7xMH4iiL0x8rAc GitLab deployment key
The key's randomart image is:
+--[ED25519 256]--+
| oooB*=+|
| o .ooB*o|
| . . ...o*|
| + +..o.o|
| . S + +.o. |
| E o oooo |
| o +. . = . |
| +... o o .|
| .+. o . |
+----[SHA256]-----+
Der Public-Key wird in der Datei ''authorized_keys'' im ''.ssh'' Unterverzeichnis im Homeverzeichnis auf dem Homepage-Server hinterlegt. Ein Test soll zeigen, ob der Zugang funktioniert. Der Befehl
sftp -i gitlab-deployment //loginid//@homepage.ruhr-uni-bochum.de
sollte ohne Passwort-Abfrage direkt mit dem Homepage-Server verbinden.
==== Gitlab Projekt modifizieren ====
Der Private-Key wird auf dem Gitlab-Server hinterlegt. Im Gitlab-Projekt wird dazu in **Settings** -> **CI/CD** -> **Variables** -> **Expand** mittels **Add Variable** eine neue Variable mit dem Namen ''SSH_PRIVATE_KEY'' angelegt. In das Feld //Value// kann anschließend der Inhalt der vorhin erzeugten Datei ''gitlab-deployment'' kopiert werden. Zusätzlich werden noch drei weitere Variablen angelegt, um die Konfiguration vom Repository zu trennen:
* **SSH_HOST**: ''homepage.ruhr-uni-bochum.de''
* **SSH_USER**: //LoginID//
* **TARGET_DIR**: Zielverzeichnis (in diesem Beispiel ''talks'')
Die Steuerdatei für das CI/CD (''.gitlab-ci.yml'') wird jetzt wie folgt erweitert (alles innerhalb des ''pages:'' Blocks):
Ein ''before-script:'' Block wird erstellt oder der vorhandene um die folgenden Zeilen erweitert:
- eval $(ssh-agent -s)
- echo "${SSH_PRIVATE_KEY}" | tr -d '\r' | ssh-add -
und im ''script:'' Block wird ganz unten der Befehl für die Auslieferung hinzugefügt:
- lftp -u ${SSH_USER}, -e "mirror -R ${CI_PROJECT_DIR}/public/ ${TARGET_DIR}/; quit" sftp://${SSH_HOST}
Die komplette Steuerdatei sieht im Beispielprojekt dann wie folgt aus:
pages:
stage: deploy
before_script:
- eval $(ssh-agent -s)
- echo "${SSH_PRIVATE_KEY}" | tr -d '\r' | ssh-add -
script:
- make -f rules pages
- lftp -u ${SSH_USER}, -e "mirror -R ${CI_PROJECT_DIR}/public/ ${TARGET_DIR}/; quit" sftp://${SSH_HOST}
artifacts:
paths:
- public
only:
refs:
- master
changes:
- public/*
- PDF/*
tags:
- pages
Sobald jetzt Änderungen übermittelt (''git commit'' / ''git push'') werden, wird auch die Zielseite immer aktualisiert.
==== Das Ergebnis====
* https://ajobs.io.noc.ruhr-uni-bochum.de/talks
sieht exakt aus wie
* https://homepage.ruhr-uni-bochum.de/andreas.jobs/talks