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