am 16. September 2009
Immer mehr Projekte setzen auf SVN Pre Commit Hooks. Auch liest man immer öfters, dass dies sozusagen zum guten Ton gehört. Aber das wäre nicht der Blog, der er ist, wenn ich nicht wieder was zu motzen hätte. Dass diese Hooks eine nette Idee sind bezweifel ich ja gar nicht, aber man kann sie auch falsch einsetzen. Und genau darüber möchte ich heute versuchen zu reden.
Erst mal für alle die es nicht wissen, bei diesen Hooks geht es darum bei einem Einchecken in das Repository gewisse Eigenschaften zu testen. Falls diese nicht eingehalten wurden, verhindert das System das Einchecken. Wunderbare Sache, wenn man dieses Feature in kleinen Dosen anwendet. Zu einem Problem wird es aber, wenn man es übertreibt. Ich gebe mal drei Beispiel, ihr könnt euch ja mal aussuchen, welche davon euch gefallen und welche nicht.
- php -l
Ich hatte ja schon über den Syntax Check von PHP geschrieben. Dieses Tool in einen Hook eingebaut checked mir jedes mal vor einem Commit, ob mein Code syntaktisch korrekt ist.
- PHP_CodeSniffer
Auch ein Tool, dessen Einsatz ich oft genug empfohlen habe. Der Sniffer in Kombination mit SVN verhindert, dass unsauberer Code in mein Repository gelangt. So kann ich von ausgehen, dass meine Code Formatierung und diverse Metriken immer dem Standard entsprechen.
- Commit Eigenschaften
Immer wieder gerne in der Prüfung: Entspricht meine Commit Message unseren Standards. Ist zum Beispiel das die Bug-ID enthalten oder ähnliches.
Und bei welchen würdet ihr sagen, dass es eine gute Idee ist? Bei mir ist es wie folgt. 1) Sehr gut. 3) Ist ok. 2) NEIN!
Ich höre immer öfters, dass Leute ihre Codeformatierung an einen Hook hängen. Aber stellt man sich mal die Situation vor, dass die Webseite wegen eines kleinen Fehlers down ist. Er wird sofort gefunden und gefixed. Jede Sekunde kann Geld kosten. Was machen wir also? Möglichst schnell comitten damit der Fehler aus dem Produktivsystem raus ist. Sollte es jetzt in diesem Workflow eine Instanz geben, die mir verbietet einzuchecken, nur weil ich Tabs statt Spaces verwendet habe? Ich glaube nicht. Ich hoffe, ihr seht wo ich hin will. Ich finde es immer unschön einen Workflow zu unterbrechen, nur weil etwas “unschön” ist. Der php -l Check hingegen ist etwas anderes. Alles was diesen Test nicht besteht ist definitiv kaputt.
Was die Commit Eigenschaften angeht, da bin ich auch erst nach Diskussion abgewichen, dass ich es für eine doofe Idee halte. Aber so viel Zeit muss sein, damit man, falls beim Hotfix etwas schief geht noch Anhaltspunkte hat, was da denn jetzt nun passiert ist. Soviel Zeit muss also sein, um es später dokumentiert zu haben, was passiert ist.
Aber nur weil ich den CodeSniffer nicht an dieser Stelle einsetzen würde, würde ich trotzdem sagen, dass er sehr sinnvoll ist – habe ja schließlich genügend drüber geschrieben. Nur sollte man dieses Tool in seiner Continuous Integration Lösung verorten. Ich bekomme also alle meine Informationen, die ich brauche, um meinen COde sauber zu halten und verändere oder blockiere den Workflow nicht, da alles wunderbar parallel und unabhängig abläuft.
Das ganze kann natürlich bei Projekten ganz anders sein, deren Ausfall egal ist. Dort kann man so Spielereien einbauen, denn es ist sicher ein schönes Gefühl zu wissen, dass der Code sauber ist und es gar nicht möglich ist “schlechten” Code einzubauen. Was ich also sagen wollte mit meiner provokanten Überschrift: Ich würde den Workflow des Entwicklers nicht mit unkritischen Dingen beeinträchtigen. Sollte man aber diese Tests nicht im Commit machen, dann unbedingt im Continuous Integration, denn ansonsten sind die Tests wertlos. Ich hoffe mal, dass das genügend Diskussionsstoff war.
PS: Der Artikel ist übrigens absichtlich ein wenig überspitzt, damit wir ein wenig diskutieren können.