Nach der erfolgreichen Umstellung auf Hugo habe ich mich gefragt, wie ich denn mit Hilfe von git beim Hinzufügen neuer Inhalte die statische Webseite automatisch neu genieren und auch sofort hochladen kann. In der Hugo-Dokumentation wird dabei auf CI/CD-Pipelines, z.B. von Github, gesetzt. Gerade heute wurde wieder einmal öffentlich, wie schnell doch Projekte durch kommerzielle Anbieter gefährdet werden können. Zur Vermeidung von irgendwelchen Kopfschmerzen wollte ich genau diese Abhängigkeit meiner Webseite von anderen Diensten vermeiden.
Die Lösung war so einfach: git Hooks.
Beim Ausführen von git-Aktionen wie z.B. push können per Hook weitere Aktionen ausgeführt werden. Im Hook post-receive habe ich folgendes Skript hinterlegt:
#!/bin/bash
GIT_REPO=$HOME/Websites/blog-tausys-de.git
WORKING_DIRECTORY=$HOME/Websites/blog-tausys-de.working
PUBLIC_HTML=$HOME/Websites/blog-tausys-de.public_html
MY_DOMAIN=blog.tausys.de
set -e
rm -rf $WORKING_DIRECTORY
rm -rf $PUBLIC_HTML.{old,new}
git clone --recurse-submodules -j8 $GIT_REPO $WORKING_DIRECTORY
hugo -s $WORKING_DIRECTORY -d $PUBLIC_HTML.new -b "https://${MY_DOMAIN}"
~/venv/pagefind/bin/python3 -m pagefind --site $PUBLIC_HTML.new
rm -rf $WORKING_DIRECTORY
mv $PUBLIC_HTML $PUBLIC_HTML.old
mv $PUBLIC_HTML.new $PUBLIC_HTML
rm -rf $PUBLIC_HTML.oldDas (bare) git-Repository liegt bei mir direkt auf dem Server im Verzeichnis $HOME/Websites/blog-tausys-de.git. Zum Generieren der Webseite werden mehrere andere Verzeichnisse mit jeweils eigenen Suffix benutzt.
Nach der Generierung der Seite mit Hugo wird noch ein Suchindex mit pagefind erstellt. Das Verzeichnis $PUBLIC_WWW ist gleichzeitig das Verzeichnis aus dem der Webserver die Webseite ausliefert. Alternativ kann natürlich die neu generierte Webseite auch per rsync auf den eigenen Server hochladen werden.
Nach jedem Push auf das git-Repository wird jetzt die Webseite neu gebaut und steht sofort im Webserver zur Verfügung.