Jekyll mit GitLab Veröffentlichen
Geschrieben von Stephan am 20 January 2015.
Da ich ja nun meinen kleinen Dev-Blog habe, möchte ich diesen natürlich auch easy verwalten und veröffentlichen können. Also habe ich mich dazu entschieden, diesen über einen Seitengenerator zu verwirklichen.
Als Seiten Generator nutze ich Jekyll, da ich keine dynamischen Inhalte habe, sondern meist nur statischen Inhalt. Die einzelnen Posts werden hierbei mit Markdown formatiert und dann auf dem Server “zusammengebaut”.
Also wäre das mein Workflow:
Post mit Markdown schreiben, diesen auf meinen Server hochladen, dort dann den Befehl
$ jekyll build
ausführe und die nun compilierte Seite ins /var/www kopiere. Ziemlich aufwendig für einen Blog, oder?
Also habe ich mir was anderes überlegt: Warum verwalte ich meinen Blog nicht einfach über git und lasse dann nach jedem push auf den Server einfach das “jekyll build” laufen?
Gesagt getan: Meine GitLab Instanz kümmert sich nun mittels git um die Versionierung meiner Seite. Nach dem dann ein push durchgeführt worden ist, fehlt nur noch der Part, dass “jekyll build” automatisch ausgeführt wird. Nach etwas googlen habe ich herausgefunden, das git sogenannte “hooks” beherrscht. Diese “Haken” werden auf dem Server ausgeführt. Bei git werden diese unter hooks/ gespeichert und können jegliche Skriptsprache enthalten, sofern der passende Interpret er auf dem Server vorhanden ist. Für mein Vorhaben eignet sich die “post-receive” am besten.
Allerdings gibt es da nun ein Problem: GitLab an sich unterstützt diese hooks nicht, da es eine andere Implementierung der git-shell nutzt. Also hieß es wieder googlen und ich fand heraus, dass GitLab das schon kann, nur dass es dort ander s abläuft: Man kann bei GitLab ein verzeichnis anlegen, dass “custom_hooks” heißt und das die Aufgaben der “normalen” ho oks übernimmt. Also zeige ich euch nun, wie das ganze funktioniert:
Zunächst legt ihr als GitLab User (im normalfall git) das custom_hooks Verzeichnis auf eurem Server an und öffnet bzw le gt die Date “post-receive” an:
usr@serv:~$ su git
git@serv:~$ mkdir /home/git/repositories/<Benutzer/Gruppe>/<Projekt>.git/custom_hooks
git@serv:~$ $EDITOR /home/git/repositories/<Benutzer/Gruppe>/<Projekt>.git/custom_hooks/post-receive
Ersetzt $EDITOR durch euren Editor (vi, vim, nano…). In der nun offenen Datei fügt ihr folgenden Inhalt ein:
1 #!/bin/bash
2 GIT_REPO=git@server.tld:<Benutzer/Gruppe>/<Projekt>.git
3 TMP_GIT_CLONE=/tmp/blog
4 PUBLIC=/var/www/<Projekt>
5
6 git clone -b master $GIT_REPO $TMP_GIT_CLONE
7 jekyll build -s $TMP_GIT_CLONE -d $PUBLIC
8
9 rm -rf $TMP_GIT_CLONE
10
11 exit 0
Unter GIT_REPO tragt ihr die git URL zu eurem git Repository ein, das TMP_GIT_CLONE Verzeichnis steht euch frei, was ihr da nehmt, ich habe mich für /tmp/blog entschieden. Der PUBLIC Pfad führt zu dem Verzeichnis auf eurem Server, wo die Sei te gespeichert und erreichbar sein soll. Wichtig: Das Verzeichnis muss vom Benutzer git beschreibbar sein, da die hook mit diesem User ausgeführt wird.
Speichert nun diese Datei und macht sie mittels chmod +x ausführbar.
Nun kommen wir zu einem Stolperstein: Mit dem Skript von oben klont ihr das git Repository mit dem User git. Dieser hat aber im normalfall keinen Zugriff auf irgendein Repository. Aber dafür hat GitLab auch vorgesorgt: Sogenannte “Deploy Ke ys”. Das sind öffentliche Schlüssel, die einen reinen Lesezugriff auf ein Repository ermöglichen. Und diesen erzeugen wi r nun. Als git User auf dem Server zunächst das Schlüsselpaar generieren:
git@serv:~$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [ENTER drücken]
Wichtig: Vergebt KEIN Passwort, denn sonst funktioniert das ganze nicht!
Den soeben generierten Schlüssel können wir nun mittels cat ~/.ssh/id_rsa.pub ausgeben lassen. Wir kopieren ihn und füge n ihn bei GitLab ein. Dazu meldet ihr euch an eurer GitLab Instanz an, wechselt zum Repository des Blogs, klickt links a uf “Settings” (bei GitLab 7.7.0.rc3) und dann auf “Deploy Keys”. Dort den Schlüssel einfügen, einen passenden Titel eing eben und speichern. Mehr ist von GitLab aus nicht zu tun.
Wenn alles geklappt hat, sollte beim nächsten git push auf den Server die hook ausgeführt werden und eure Jekyll Seite a utomatisch mit dem neuesten Inhalt generiert werden!
Happy blogging!