Webhook-Konfiguration automatisieren

Ich habe mir ein paar Gedanken darüber gemacht, wie ich mein automatisches Deployment noch ein wenig verbessern könnte.

In meinem Artikel über GitLab-Webhooks1 habe ich beschrieben, wie man mit wenigen Schritten den eigenen Deployprozess vereinfachen kann. Findet ein Push in einem GitLab-Projekt statt, wird ein Webhook aufgerufen, der sich dafür sorgt, dass das neue Update auch Stage- oder Liveserver landet.

In meiner Lösung benutze ich ein PHP-Script, welches ein Konfigurationsdatei ausliest, um festzustellen, ob das Projekt, welches den Webhook aufruft, bekannt ist und wenn ja, welche Branches deployt werden sollen.

Mit der Lösung bin ich immer noch sehr zufrieden, allerdings störte es mich sehr, dass ich

  1. immer das Grundverzeichnis für ein neues Projekt im Apache-Document-Root von Hand anlegen und entsprechende Rechte setzen musste.
  2. die Deploy-Konfiguration von Hand erweitern musste.

Da die Konfiguration in meinem Fall fast immer die gleichen Werte enthält, bis eben auf den Pfad und den Namen des Projektes, habe ich versucht das Erstellen ein bisschen zu vereinfachen.

addProject Bash-Script

Ich habe mir also ein kleines Bash-Script geschrieben, was mir ein bisschen Arbeit abnimmt.

  • Es erstellt das Grundverzeichnis des Projektes im Document-Root.
  • Es erweitert die Deploy-Konfiguration mit Standardparametern und passt automatisch den Pfad und den Projektnamen an

Damit es nicht zu Dublizierungen kommt, oder wohlmöglich etwas überschrieben wird, prüft das Script auch noch, ob das Projekt bereits vorhanden ist.

#!/bin/bash

cd /var/www/
if [ ! -d "$1" ]; then
    mkdir -p "$1/logs"
    chown YOURUSERNAME:www-data $1-$2
    chmod -R 775 $1
    cd /var/www/DEPLOYSCRIPTDIRECTORX/
    head -n -2 deploy.json > temp.txt ; mv temp.txt deploy.json
    printf "\t},\n\t\"$1\": {\n\t\t\"path\":\t\t\"/var/www/$1\",\n\t\t\"limit\":\t\"master\"\n\t}\n}" >> deploy.json
else
    echo Project already exists!
fi
exit

Und so funktioniert es

Um das Script aufzurufen, gibt an in der Shell folgenden Befehl ein:
/path/to/script.sh projectTitle

In meinem Script gibt es noch einen zweiten Parameter, der die Auftragsnummer des Projektes enthält, welche mit im Verzeichnisnamen auftauchen soll, das habe ich hier aber weg gelassen. Theoretisch können weitere Paramter aber einfach mittels $2, $3, $4 … abgefragt werden.

Der obige Befehl würde das Verzeichnis projectTitle in /var/www erstellen.

Der Ablauf

Zunächst wechselt das Script in das Document-Root vom Apache, bei mir ist das /var/www kann aber auch z.b. /srv/http sein, das sollten Sie ggf. in Zeile 3 und 10 anpassen (bei mir kommt z.B. noch ein bisschen was hinten dran, weil ich nicht alles einfach im Document-Root liegen habe)

Dann wird geprüft es bereits ein Verzeichnis mit dem gewünschen Namen gibt. Ist das der Fall, wird das Script mit einer entsprechenden Meldung beendet. Ansonsten geht es weiter.

Das Verzeichnis wird erstellt und die entsprechenden Rechte gesetzt. Damit das Deploy-Script später auch ins Verzeichnis schreiben kann, wird die Gruppe auf www-data gesetzt und der Gruppe Schreib- und Ausführrechte gegeben. Läuft der Webserver oder das Deploy-Script unter einem anderen User, muss dessen Gruppe gesetzt werden. Außerdem wird im Verzeichnis noch ein logs-Verzeichnis erstellt.

Danach wechselt das Script in das Verzeichnis in die dem Deploy-Konfiguration liegt und erweitert diese. Zunächst werden die letzten beiden Zeilen gelöscht, das ist die schließende Klammer des JSON und die schließende Klammer des letzten Projektes.
Dann bekommt das letzte Projekt eine neue schließende Klammer, gefolgt von einem Komma (damit der neue Eintrag folgen kann).
Schließlich wird der eigentliche Eintrag angelegt, der Projektname wird geschrieben, der Pfad gesetzt und als Standardeinstellung wird der master-Branch als limit gesetzt, so dass nur dieser deployt wird. Sollen alle Branches deployt werden, muss an entsprechender Stelle im Script das master gegen null getauscht werden (oder auch z.b. stage, master)
Schließlich wird die schließende Klammer für das JSON noch gesetzt.

Damit ist das neue Projekt eingerichtet und kann benutzt werden. Ich habe das Script in mein GitHub-Repository2 gelegt, viel Spaß damit!