n98-magerun – Magento Rewrite Konflikte mit Jenkins testen

[Seit kurzem gibt es in n98-magerun die Möglichkeit einen Shop auf Rewrite Konflikte zu prüfen. Das Tool schaut nach ob mehrere Module versuchen eine Klasse zu rewriten. Sollte dies der Falls sein, wird über die PHP Reflection API zuätzlich geprüft ob die letzte Klasse der Rewrite-Kette von der vorherige erbt. Sollten zum Beispiel mehr als zwei Klassen den gleichen Rewrite definieren, wird über die gesamte Kette geprüft. Durch diese Prüfung möchte ich verhindern, dass es „False-Positives“ gibt da der eine oder andere Entwickler vielleicht durchaus den Konflikt durch eine Vererbung behoben hat.

Damit man dies nicht immer wieder von Hand machen muss und vielleicht einfach vergisst gibt es seit der Version 1.30.1 die Möglichkeit die Ergebnisse anstatt in die Konsole in eine JUnit XML Datei zu loggen.

Die Klassen zum generieren der XML Dateien habe ich kurzerhand in ein eigenes Projekt gepackt, welches ebenfalls auf github zu finden ist.

https://github.com/cmuench/junit-xml

(Danke an PHPUG Rheinhessen Treffen meinte die Entwickler sollten mehr kleinere Pakete erstellen und keine großen „Monolithklassensammlungen“). Das Paket ist über Packagist / Composer integrierbar.

Die neuste Version von n98-magerun (1.30.1) unterstützt nun im Kommando dev:module:rewrite:conflicts die Option –log-junit. Über die Option kann einfach eine XML Datei definiert werden in die dann das Ergebnis der Prüfung geloggt wird. Das Ergebnis kann dann zusammen mit z.B. PHPUnit Tests veröffentlich werden.

Sprich: Sind Rewrite Konflikte vorhanden ist der Build instabil!

Und so gehts …

Jenkins Server installieren

Stellvertretend für Jenkins kann natürlich auch ein anderer CI Server genutzt werden.

Der Jenkins kann unter Linux über ein Repository installiert werden.

Unter Debian Systemen:

apt-get install jenkins

Wer einfach nur einmal ausprobieren möchte kann auch die WAR Datei herunterladen. Dabei handelt es sich um eine JAR Datei, welche ein Stub für die Ausführung als Webserver enthält. Das gleich geht im übrigen auch mit Phar Dateien unter PHP. Aber das führt hier zu weit.

wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
java -jar jenkins.war --httpPort=8080

Der Port 8080 ist hier nur stellvertretend und kann auch durch einen anderen nicht vergebenen Port ersetzt werden.

Der Jenkins Server sollte nun unter http://localhost:8080 erreichbar sein. Wird die WAR Datei direkt von einem lokalen Benutzer ausgeführt rstellt Jenkins im Homedir ein Verzeichnis .jenkins. Dort wird dann die komplette Konfiguration abgelegt. Die angelegten Jobs und deren Verzeichnisse befindet sich dann auch hier.

Jenkins Phing Plugin

Nach der Ausführung des Jenkins Servers muss bei der Nutzung von Phing noch das passende Plugin nachinstalliert werden. Sollte jemand ANT nutzen kann er diesen Schritt überspringen.

Das installieren eines Plugins ist erstaunlich einfach:

  • „Jenkins verwalten“ klicken
  • „Plugins verwalten“ klicken
  • Auf das Tab „Verfügbar“ wechseln.
  • „Jenkins Phing plugin“ suchen und die Checkbox anhaken.
  • „Download now and install after restart“ Button am Ende der Seite klicken

Build Script erstellen

Mit einem Build Script (Ant oder wie hier Phing) kann schnell n98-magerun in den CI Server integiert werden.

<?xml version="1.0" encoding="utf-8"?>
<project name="test" default="dist">

    <target name="dist">
        <exec command="n98-magerun.phar dev:module:rewrite:conflicts --log-junit=reports/junit/conflicts.xml" />
    </target>

</project>

(n98-magerun.phar sollte global ausfühbar sein. Idealerweise unter /usr/bin oder /usr/local/bin liegen)

Idealerweise wird das Buildscript direkt mit einer Versionierung wie GIT oder SVN eingechecked und via Jenkins ausgechecked.

Dafür hat Jenkins eine Unterstützung der bekanntesten Versionsierungssysteme inklusive.

Build Script in Jenkins einbinden

Jetzt eine Job erstellen. In der Job-Konfiguration findet ihr bei „Build-Schritt hinzufügen“ nun den installieren Phing Build-Schritt „Invoke Phing Targets“. Dort dann das build.xml File angeben, welches die JUnit XML erzeugt.

Als Post-Build-Schritt muss noch „Veröffentliche JUnit-Testergebnisse“ gewählt werden. Dort den Pfad zum Verzeichnis der XML Dateie(n) angeben.

Wenn z.B. noch von PHPUnit XML Dateien erzeugt werden sollte mittels *.xml gearbeitet werden.

Alle Dateien müssen im gleichen Verzeichnis liegen. Das sollte es gewesen sein.

Bei mir sieht das dann folgendermaßen aus:

Jenkins Rewrite Test

Viel Spass beim „herumspielen“. Und nicht vergessen: Ein regelmäßiges n98-magerun.phar self-update lohnt sich.

See it in Action

Youtube: n98-magerun – Detect Magento Rewrite Conflicts