Git pre-push hooks – „schone die Pipeline“

In der Zeit von CI/CD werden auf dem Zentralen Git Repository oft post-receive hooks eingerichtet, welche aus der aktuellen Codebase ein Build erstellen und dann Unit/Integraitons -Tests durchführen. Dazu werden oft Tools wie travis, GitLab und wie sie auch alle heissen, verwendet. Der grösste nachteil dieser Tools sind die Kosten, welche oft in minuten in denen der Dienst (die Pipeline) läuft berechnet wird.

Um die genutzten Pipelineminuten möglichst tief zu halten, bietet sich an, lokal einen pre-push hook einzurichten, welcher vor dem Pushen auf das Zentrale repository schon einmal erste Checks durchführt, so verhindert man viele Fehlgeschlagene Builds, weil ein Entwickler seine Unit Tests nicht ausgeführt hatte oder sich nicht an die Codeingstandards gehalten hatte, welche für das Projekt vorgesehen waren.

Das Einrichten solcher hooks geht relativ einfach.

Die Datei pre-push im git Verzeichnis anlegen

nano .git/hooks/pre-push

Ein Shell Script erstellen wie hier, welches Unittests ausführt, ein Build erstellt, oder Coding Standards überprüft.

#!/bin/bash
#execute some stuff and then ask if you really want to push
./ci/codesniffer.sh
phpunit
read -p "You're about to push, are you sure you won't break the build? " -n 1 -r < /dev/tty
echo
if [[ $REPLY =~ ^[Yy]$ ]] # if you clicked Y or y
then
    exit 0 # push will execute
fi
exit 1 # push will not execute

Nicht vergessen die Berechtigungen der Datei zu setzen.

chmod ug+x .git/hooks/pre-push

Nun wie gewohnt mit git push <origin> <branchnamne> den branch auf das Zentrale Repository Pushen.

Sobald das pre-push mit exit != 0 geschlossen wird, bricht unterbricht es das pushen in das Zentrale Repository.

Es kann natürlich so eingestellt werden, das dies nur für Bestimmte Origins oder Branches Aktiv ist.

Weitere Beispiele findet Ihr in meinem GitHub Repo – Pull Requests und Issues für Verbesserungen sind sehr Willkommen!

 
Veröffentlicht am
 

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.