Automatisierter Upload nach Git-Push

Continuous Deployment muss nicht immer umfangreich oder kompliziert konfiguriert werden. Oft braucht man keine Tests oder Stage-Umgebungen, wenn man schnell eine Website ausrollen will oder nur Kleinigkeiten wie Texte oder Styles anpasst.
Aber auch andere Anwendungen können relative einfach mit git hooks automatisch nach bestimmten Aktionen, wie push, commit, rebase oder update, ausgeführt werden.
Angenommen, wir wollen nach jedem erfolgreichen git commit unsere lokalen Daten auf unseren Webhosting-Server hochladen. Im Beispiel verwende ich einen normalen SSH-Zugang. Auf dem Server ist bereits ein Verzeichnis mit entsprechenden Berechtigungen für den Benutzer angelegt.
Zuallererst brauchen wir ein Git-Repository. Nach dem Initialisieren des Repos wird ein Ordner mit dem Namen .git erstellt. In diesem befindet sich ein Unterordner /hooks.
Zur Wahl steht nun:
- pre-commit: Das Skript wird vor dem commit ausgeführt
- post-commit: Das Skript wird nach dem commit ausgeführt
In dem Beispiel wollen wir erst einen Erfolgreichen commit und anschließend die Dateien hochladen.
Also erstellen wir in /hooks eine Datei mit dem Namen post-commit
Stellen sicher, dass der Benutzer auch Rechte für die Ausführung der Datei hat:
chmod +x post-commit
Änderung der Berechtigung für post-commit
Dann erstellen wir eine Funktion, welche mithilfe von scp die Dateien auf den Server verschiebt. Zuvor wird noch überprüft, ob die Dateien auch existieren.
#!/bin/sh
# Definieren der Dateien und Serververbindung
FILES_TO_UPLOAD=("index.html" "styles.css" "scripts.js")
REMOTE_USER="your-username"
REMOTE_HOST="your-remote-host"
REMOTE_PATH="path/on/remote/server"
# Jede Datei einzeln prüfen und hochladen
for FILE in "${FILES_TO_UPLOAD[@]}"; do
# Checken, ob die Datei existiert
if [ -f "$FILE" ]; then
# Hochladen mit scp
scp "$FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
if [ $? -ne 0 ]; then
echo "Datei konnte nicht hochgeladen werden $FILE."
exit 1
fi
else
echo "Datei $FILE existiert nicht."
exit 1
fi
done
# Fortfahren mit dem commit
exit 0
post-commit mit SCP
Nach jedem erfolgreichem commit wird nun diese Funktion ausgeführt und die Dateien auf den Server hochgeladen.
Natürlich kann man diese Funktion noch um alle möglichen Features erweitern. Wie z.B. löschen von nicht mehr vorhandenen Dateien, automatisierte Tests, ausführen von Skripten auf dem Server, neu starten von Prozessen auf dem Server und so weiter.
Das Beispiel soll erstmal nur zeigen, dass so etwas überhaupt möglich ist. Man braucht nicht zwangsweise diese fancy CI/CD Funktionen von GitHub. Vor allem hat man so die volle Kontrolle darüber und muss seine Secrets nicht mit der Cloud teilen.