git pre/post hooks verwenden

Datum

git bietet die Möglichkeit Scriptbefehle vor und nach einem commit, push, rebase, etc. auszuführen.

Somit können zum Beipsiel vor einem commit noch einmal automatisch diverse Tests durchgeführt werden.

Ordnerstruktur

Grundsätzlich wird in jedem .git Verzeichnis die entsprechende Ordnerstruktur mit Beispielen angelegt:

.git/hooks/
├── applypatch-msg.sample
├── commit-msg.sample
├── fsmonitor-watchman.sample
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── prepare-commit-msg.sample
├── pre-push.sample
├── pre-rebase.sample
├── pre-receive.sample
└── update.sample

An diese Stelle werden die entsprechenden post/pre Scripte abgelegt, bzw. verlinkt.
Wichtig ist hierbei, das die Scripte keine Endung haben und nur z.B. pre-commit heißen dürfen.

Eine Übersicht über die entsprechenden Hooks und deren Verwendung erhält man hier: githooks.com

pre-commit

um beispielsweise ein Ansible-Playbook vor einem git-commit noch mit einem Syntax-Check und einem ansible-lint Check zu prüfen legt man sich ein entsprechendes Shell-Script an.

Das hat auch den Vorteil, dass diese pre/post Scripte nicht nur im Terminal, sondern auch dann ausgeführt werden wenn eine IDE den git commit Befehl durchführt.

Ich nenne dies einfach pre-commit.sh und dies hat folgenden Inhalt:

#!/usr/bin/env bash
echo "[*] Führe ansible-lint Check durch"
/bin/ansible-lint playbook.yml
RESULT=$?
[ $RESULT -ne 0 ] && exit 1
exit 0

Dieses Script führt ansible-lint auf das gewünschte Playbook aus und anschließend wird der Exit-Code geprüft. Wenn der ansible-lint Check fehlschlägt wird das pre-commit Script mit dem Exit-Code 1 beendet und es wird somit anschließend kein commit durchgeführt.

Dieses pre-commit Script wird nun ausführbar gemacht und anschließend in den .git/hooks Ordner verlinkt.

chmod +x pre-commit.sh
ln -s $(pwd)/pre-commit.sh .git/hooks/pre-commit

Wenn nun ein commit durchgeführt wird, wird das pre-commit Script automatisch vorher ausgeführt:

$ git add . && git commit -m "test"
[*] Führe ansible-lint Check durch
[master 073dd9d] test
 1 file changed, 0 insertions(+), 0 deletions(-)
post-commit

Ein post-commit Script lässt sich zum Beispeil dazu nutzen nach einem erfolgreichen commit automtisch ein git push auszuführe.

post-commit.sh:

#!/usr/bin/env bash
echo "[*] Führe \"git push\" durch"
git push

Anschließend wird auch dieses Script ausführbar gemacht und entsprechend in den .git/hooks Ordner verlinkt:
chmod +x post-commit.sh
ln -s $(pwd)/post-commit.sh .git/hooks/post-commit

Nun wird vor jedem commit das Playbook geprüft, dann der commit durchgeführt und anschließend automatisch ein git push durchgeführt.

$ git add . && git commit -a -m "test"
[*] Führe ansible-lint Check durch
[*] Führe "git push" durch
Objekte aufzählen: 8, Fertig.
Zähle Objekte: 100% (8/8), Fertig.
Delta-Kompression verwendet bis zu 8 Threads.
Komprimiere Objekte: 100% (5/5), Fertig.
Schreibe Objekte: 100% (6/6), 555 bytes | 555.00 KiB/s, Fertig.
Gesamt 6 (Delta 2), Wiederverwendet 0 (Delta 0)
To gitlab:ansible/systeme_aktualisieren.git
   11c6322..8ef1258  master -> master

Autor
Kategorien Automatisierung, Scripting

PRTG Map