Pre-Commit als Grundlage für Codequalität
Bei der Softwareentwicklung ist es von entscheidender Bedeutung, die Codequalität zu sichern und Fehler frühzeitig zu minimieren. Die Website Linksdrall-Ansatz legt den Schwerpunkt darauf, Probleme so früh wie möglich zu erkennen und zu beheben und nicht erst später in der Entwicklung oder nach der Bereitstellung. Pre-commit unterstützt diesen Ansatz, indem es mehrsprachige Pre-commit-Hooks verwaltet, d. h. Skripte, die automatisch ausgeführt werden, bevor ein Commit abgeschlossen wird. Diese Hooks fungieren als erste Verteidigungslinie, um Codierungsstandards durchzusetzen, Fehler zu verhindern und die Sicherheit zu erhöhen.
In diesem Artikel wird untersucht, wie die Kombination von Pre-Commit und dem Shift-Left-Ansatz die Entwicklungsabläufe verbessern kann, was zu zuverlässigerer und wartbarerer Software führt. Wir untersuchen die Vorteile der Verwendung von Pre-Commit-Hooks, ihre Funktion innerhalb des Shift-Left-Frameworks und bieten praktische Ratschläge für eine effektive Implementierung. Durch die Einführung dieser Praktiken können Teams die Codequalität verbessern, die Entwicklungszyklen beschleunigen und robuste Softwarelösungen effizienter bereitstellen.
In diesem Artikel:
Verständnis von Pre-Commit
Allgemeine Hooks in Versionierungssystemen
In Versionskontrollsystemen wie Git sind Hooks Skripte, die durch verschiedene Ereignisse innerhalb des Repositorys ausgelöst werden. Diese Skripte können Aufgaben automatisieren, Richtlinien durchsetzen oder Arbeitsabläufe verbessern. Hooks werden im Allgemeinen in zwei Typen eingeteilt: clientseitig und serverseitig. Client-seitige Hooks werden auf dem lokalen Rechner ausgeführt und können durch Vorgänge wie das Festschreiben oder Zusammenführen von Änderungen ausgelöst werden. Serverseitige Hooks werden auf dem Server ausgeführt und können durch Ereignisse wie den Empfang von Push-Commits ausgelöst werden.
Die Rolle von Pre-Commit Hooks
Unter den verschiedenen Arten von clientseitigen Hooks sind die Pre-Commit-Hooks besonders wichtig. Diese Hooks werden ausgeführt, bevor ein Commit abgeschlossen wird. Sie suchen nach potenziellen Problemen im Code, z. B. Syntaxfehlern, Verstößen gegen den Codestil oder sogar Sicherheitsschwachstellen. Durch die Ausführung dieser Prüfungen vor der Übergabe des Codes an das Repository stellen Pre-Commit-Hooks sicher, dass nur qualitativ hochwertiger Code in das Versionskontrollsystem gelangt.
Pre-Commit Anwendungsfälle
Pre-Commit ist ein vielseitiges Tool, das an verschiedene Szenarien innerhalb des Entwicklungsworkflows angepasst werden kann und den Entwicklungsteams erhebliche Flexibilität und Kontrolle bietet. Ein wichtiger Anwendungsfall ist das lokale Hosting von Pre-Commit-Code, das es den Entwicklern ermöglicht, Hooks entsprechend den spezifischen Anforderungen ihres Projekts anzupassen und zu verwalten. Dieses lokale Hosting stellt sicher, dass alle Teammitglieder dieselben Standards einhalten, ohne auf externe Repositories angewiesen zu sein. Eine weitere leistungsstarke Funktion von pre-commit ist die Möglichkeit für Benutzer, benutzerdefinierte Hooks zu erstellen, die auf ihre individuellen Bedürfnisse zugeschnitten sind. Diese Hooks können bestimmte Codierungsstandards durchsetzen, spezielle Sicherheitsprüfungen durchführen oder sich wiederholende Aufgaben automatisieren und bieten so ein hohes Maß an Flexibilität. Teams können diese Hooks in jeder Sprache schreiben, die von ihrer Umgebung unterstützt wird, so dass sich pre-commit nahtlos in ihren Workflow integrieren lässt.
Darüber hinaus kann Pre-Commit in Continuous Integration (CI)-Pipelines integriert werden, um die Automatisierung zu verbessern und Qualitätsprüfungen in allen Entwicklungsstadien durchzusetzen. Durch die Integration von Pre-Commit-Hooks in den CI-Prozess können Teams sicherstellen, dass der Code den Qualitätsstandards entspricht, bevor er in die Hauptcodebasis eingebunden wird. Diese Integration trägt dazu bei, hohe Standards für die Codequalität und -zuverlässigkeit während des gesamten Entwicklungszyklus aufrechtzuerhalten.
Mehrsprachige Unterstützung in Pre-Commit
Eine der Hauptstärken von pre-commit ist die Unterstützung für eine Vielzahl von Programmiersprachen. Dies macht es zu einem idealen Werkzeug für Projekte, die mehrere Sprachen oder Frameworks umfassen. Im Bereich DataOps ist es beispielsweise üblich, Terraform für die Infrastrukturbereitstellung und dbt für die Datentransformation zu verwenden. Die Mehrsprachenunterstützung von Pre-commit ermöglicht die nahtlose Integration in solche unterschiedlichen Entwicklungsumgebungen und bietet konsistente Qualitätsprüfungen über verschiedene Sprachen und Tools hinweg. Diese sprachübergreifende Fähigkeit gewährleistet, dass Best Practices durchgesetzt und Probleme unabhängig von den im Projekt verwendeten Technologien erkannt werden.
Beispiel für die Verwendung von Pre-Commit
Pre-Commit arbeitet mit einer Konfigurationsdatei namens pre-commit-config.yaml. Diese YAML-Datei dient als zentrale Konfiguration, die pre-commit bei jedem Commit referenziert. Sie definiert, welche Hooks ausgeführt werden sollen und woher sie geholt werden, bevor ein Commit in Ihrem Git-Repository abgeschlossen wird. Als Beispiel für eine solche Datei mit einer Erläuterung der Schlüsselelemente wird das folgende Bild zur Verfügung gestellt:
Repos:
- Repo: https://github.com/antonbabenko/pre-commit-terraform
rev: v1.90.0
Haken:
- id: terraform_validate
- id: terraform_fmt
args:
--args=-rekursiv
- repo: Gibt die URL des Repositorys an, das die Hooks enthält. In diesem Beispiel ist https://github.com/antonbabenko/pre-commit-terraform das Repository, aus dem die Hooks abgerufen werden.
- rev: Gibt die spezifische Revision oder Version des Repository (in diesem Fall v1.90.0) an, die verwendet werden soll. Dies gewährleistet die Konsistenz des Hook-Verhaltens bei verschiedenen Ausführungen.
- hooks: Legt eine Liste von Hooks fest, die aus dem angegebenen Repository ausgeführt werden sollen. Jeder Hook wird durch seine eindeutige ID identifiziert.
- id: Stellt den Bezeichner für jeden Hook dar. Trailing-whitespace, end-of-file-fixer und check-yaml sind Beispiele für Hook-IDs, die bestimmten Aufgaben oder Prüfungen entsprechen, die die Hooks durchführen.
- args: Gibt zusätzliche Argumente oder Optionen an, die an den Hook-Befehl übergeben werden. Im Fall von terraform_fmt enthält das Feld args die Option -args=-recursive. Diese Konfiguration weist den Hook an, Terraform-Dateien rekursiv innerhalb des Projektverzeichnisses zu formatieren.
Mit dieser Konfiguration können Sie pre-commit an die Bedürfnisse Ihres Projekts anpassen, indem Sie angeben, welche Hooks ausgeführt werden sollen, woher sie abgerufen werden sollen und wie die Konsistenz durch definierte Versionen oder Revisionen sichergestellt werden soll. Jede Hook-ID entspricht einer bestimmten Qualitätsprüfung oder Aufgabe, die pre-commit durchführt, bevor es eine Übergabe zulässt, um eine höhere Codequalität und die Einhaltung der Projektstandards zu gewährleisten.
Empfohlene Pre-Commit-Repositories für eine effektive Integration
Um den Einsatz von Pre-Commit effektiv zu starten, sollten Sie die folgenden Repositories nutzen, die auf bestimmte Programmiersprachen und Tools zugeschnitten sind:
- Terraform Repository: antonbabenko/pre-commit-terraform
Bietet ein umfassendes Set von Hooks für Terraform-Projekte, einschließlich Validatoren und Formatierern, um konsistenten und qualitativ hochwertigen Code zu gewährleisten. - Dbt (Data Build Tool) Repository: dbt-checkpoint/dbt-checkpoint
Bietet Hooks, die speziell für dbt-Projekte entwickelt wurden und die Validierung und Durchsetzung von Best Practices für SQL-basierte Datentransformationen ermöglichen. - SQL-Repository: Sqlfluff/Sqlfluff
Bietet Hooks für SQL-Linting, um die Korrektheit der Syntax, die Einhaltung von Codierungsstandards und die Optimierung der Abfrageleistung zu gewährleisten.
Diese Repositories bieten wichtige Hooks, die sich nahtlos in pre-commit integrieren lassen und automatisierte Prüfungen ermöglichen, um die Codequalität und -konsistenz in Terraform-, dbt- und SQL-Projekten zu gewährleisten. Indem Sie diese Hooks in Ihren Arbeitsablauf integrieren, können Sie Entwicklungsprozesse rationalisieren und robuste Softwareimplementierungen sicherstellen. Dies sind jedoch nur Vorschläge und es steht Ihnen frei, auch andere Hooks zu verwenden, wenn dies für Ihren Anwendungsfall von Vorteil ist.
Schlussfolgerung
Pre-Commit ist ein Beispiel für den Shift-Links-Ansatz, bei dem Qualitätsprüfungen zu einem frühen Zeitpunkt im Entwicklungszyklus automatisiert werden, bevor der Code übertragen wird. Mit dieser proaktiven Strategie werden Probleme wie Syntaxfehler, Formatierungsinkonsistenzen und Sicherheitsschwachstellen frühzeitig erkannt, was die Anzahl der nachgelagerten Fehler reduziert.
Durch die Verwendung einer zentralen pre-commit-config.yaml-Datei gewährleistet Pre-Commit teamübergreifend einheitliche Codierungsstandards. So können sich die Entwickler auf die Codierung konzentrieren, anstatt manuelle Überprüfungen vorzunehmen, was die Softwarebereitstellung beschleunigt.
Pre-Commit unterstützt verschiedene Sprachen und Tools und kann an spezifische Projektanforderungen angepasst werden, um die Zuverlässigkeit des Codes durch automatische Prüfungen zu verbessern. Die Integration von Pre-Commit verbessert die Codequalität, die Effizienz und fördert die kontinuierliche Verbesserung, was zu kürzeren Markteinführungszeiten, niedrigeren Entwicklungskosten und zuverlässigerer Software führt.
Über den Autor
Moritz Gunkel
Moritz ist ein aufstrebender Berater in der Abteilung DevOps für Scalefree, spezialisiert auf Cloud-Engineering, Automatisierung und Infrastructure as Code, mit einem besonderen Händchen für Terraform. Während er mit seinen Aufgaben jongliert und als Werkstudent einen Bachelor-Abschluss in Informatik anstrebt, hat Moritz' methodische Herangehensweise die internen Abläufe erheblich beeinflusst, was ihm Anerkennung einbrachte und die Voraussetzungen für einen spannenden Übergang in eine Vollzeit-Beratertätigkeit schuf. Mit seiner Leidenschaft für Innovation und seinem Engagement für hervorragende Leistungen wird Moritz auch weiterhin einen bleibenden Eindruck in der dynamischen Welt von DevOps hinterlassen.