Manni
03.04.2008, 19:31
Ich wollte mal ein Projekt vorstellen, auf das ich dem letzt gestoßen bin: phpUnderControl (http://www.phpundercontrol.org/). Das Ganze ist eine Erweiterung für CruiseControl (http://cruisecontrol.sourceforge.net/). CruiseControl ist ein Programm, das als Serverdienst läuft und anhand irgendwelcher Kriterien ein "Build" aus den Sourcen eines Projektes (bei PHP ist das recht überflüssig) erzeugt und außerdem ermöglicht, dass man einen Haufen Zeug zur Qualitätssicherung durchführt (Buzzword!). So können zum Beispiel UnitTests durchgeführt werden, Dokumentationen werden automatisch generiert oder der Code auf Unsauberkeiten oder mögliche Probleme untersucht. phpUnderControl stellt einige Möglichkeiten zur Verfügung, solche Dinge automatisiert zu tun.
Über CruiseControl lassen sich dank Unterstützung für beliebige Shell Kommandos und vielseitige Erweiterungen nahezu alle erdenklichen Prozeduren nach und während einem Build durchführen, aber phpUnderControl unterstützt hier einige Programme speziell und fasst die Ergebnisse in einer Webapplikation zusammen.
Unit tests
Für Unittests (Modultests) steht PHPUnit (http://www.phpunit.de/) zur Verfügung, die Standardsoftware aus dem PEAR Projekt wenn es darum geht, PHP Projekte automatisiert zu testen. Zusätzlich zu den Tests wird noch überprüft, wieviel Code durch die Tests abgedeckt wird und daraus wird ein CRAP Index errechnet, der beschreibt, wie hoch die Wahrscheinlichkeit ist, durch Änderungen den Code zu schrotten, weil er zu unübersichtlich und/oder zu wenig getestet ist.
Dokumentation
Mithilfe dem ebenfalls in PEAR enthaltenen PHPDocumentor (http://www.phpdoc.org/) lässt sich automatisch eine Dokumentation aus dem Code generieren. Diese wird dann in die Webseite integriert und Probleme werden aufgelistet.
Coding Standards
Um sicherzustellen, dass der Code lesbar ist und alles halbwegs gleich aussieht, kann mit dem PHP CodeSniffer (http://pear.php.net/package/PHP_CodeSniffer/) der Code überprüft werden. Die Verstöße werden aufgelistet.
Graphen
Für diejenigen, die wie ich klickbunti Grafiken lieben, werden mehr oder weniger nützliche Graphen generiert, die einen Überblick über den Qualitätsverlauf des Codes geben. [Screenshot] (http://www.phpundercontrol.org/images/0.3.5-metrics.png)
Für wen ist das überhaupt nützlich?
Für alle die, die an der Qualität des Codes interessiert sind, die ein größeres Projekt mit mehreren Leuten und Versionsverwaltung haben. Für kleinere Projekte lohnt sich der ganze Aufwand nicht. Und auch bei laufenden Projekten, die bis jetzt ohne Tests und Dokumentation ausgekommen sind, ist der Aufwand, beides zu schreiben viel zu hoch, das verdirbt nur den Spaß.
Ansonsten ist es vielleicht einfach interessant, bei einem neuen Projekt mal sowas auszuprobieren und sich mal Gedanken über den Stil des Codes, Dokumentation und all die anderen Dinge zu machen, die einen "guten" Stil ausmachen. Ich habe mich jedenfalls in den letzten Jahren immer mehr um einen "guten Stil" bemüht, das ist bei großen Sachen imo unumgänglich, sonst geht die Übersicht flöten.
Für diejenigen, die sich dafür interessieren, hier mal Beispielkonfigurationsdateien. Die config.xml:
<?xml version="1.0"?>
<cruisecontrol>
<project buildafterfailed="false" name="Fubar">
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
</listeners>
<modificationset>
<svn LocalWorkingCopy="projects/${project.name}/source/" />
</modificationset>
<schedule interval="1800">
<ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
</schedule>
<log dir="logs/${project.name}">
<merge dir="projects/${project.name}/build/logs/"/>
</log>
<publishers>
<currentbuildstatuspublisher file="logs/${project.name}/buildstatus.txt"/>
<artifactspublisher dir="projects/${project.name}/build/api" dest="artifacts/${project.name}" subdirectory="api"/>
<artifactspublisher dir="projects/${project.name}/build/coverage" dest="artifacts/${project.name}" subdirectory="coverage"/>
<execute command="G:/xampp/php525/phpuc.bat graph logs/${project.name}"/>
<execute command="G:/Programme/CruiseControl/copy_graph.bat"/>
</publishers>
</project>
</cruisecontrol>
copy_graph.bat ist hier eine kleine Batch Datei, die die Graphen an die richtige Stelle im Dateisystem verfrachtet, sonst funktionierte das bei mir nicht.
In diesem Fall wird alle 30 Sekunden der SVN Checkout auf Änderungen gecheckt, und fallls diese vorliegen, wird ein neuer Build erzeugt. Danach werden die Ergebnisse als Webapplikation veröffentlicht.
Und dann noch die Ant Build Datei (build.xml):
<?xml version="1.0" encoding="UTF-8"?>
<project name="Fubar" default="build" basedir=".">
<target name="build" depends="checkout,php-documentor,php-codesniffer,phpunit"/>
<target name="co" depends="checkout"/>
<target name="checkout">
<exec executable="svn" dir="${basedir}/source">
<arg line="up" />
</exec>
</target>
<target name="docs" depends="php-documentor"/>
<target name="documentation" depends="php-documentor"/>
<target name="phpdoc" depends="php-documentor"/>
<target name="php-documentor">
<exec executable="phpdoc.bat" dir="${basedir}/source" logerror="on">
<arg line="on --title '${ant.project.name}' -ue on -t ${basedir}/build/api -d . -i old/* -tb path/to/phpdoc -o HTML:Phpuc:phpuc"/>
</exec>
</target>
<target name="checkstyle" depends="php-codesniffer"/>
<target name="phpcs" depends="php-codesniffer"/>
<target name="php-codesniffer">
<exec executable="phpcs.bat" dir="${basedir}/source" output="${basedir}/build/logs/checkstyle.xml">
<arg line="--report=checkstyle --ignore=old/ ."/>
</exec>
</target>
<target name="test" depends="phpunit"/>
<target name="phpunit">
<exec executable="phpunit.bat" dir="${basedir}/source/tests" failonerror="on">
<arg line=" --log-xml ${basedir}/build/logs/phpunit.xml --log-pmd ${basedir}/build/logs/phpunit.pmd.xml --log-metrics ${basedir}/build/logs/phpunit.metrics.xml --coverage-html ${basedir}/build/coverage/ AllTests"/>
</exec>
</target>
</project>
Diese Datei erzeugt den Build, bestehend aus Tests, der Dokumentation, den Coding Style und Coverage Informationen. Zuvor wird die neuste Code Version heruntergeladen.
Ich hoffe mal, dieser kurze Artikel war interessant für euch und ihr guckt euch das vielleicht mal an :) Kritik, Lob oder sonstwelche Kommentare sind erwünscht ;)
Über CruiseControl lassen sich dank Unterstützung für beliebige Shell Kommandos und vielseitige Erweiterungen nahezu alle erdenklichen Prozeduren nach und während einem Build durchführen, aber phpUnderControl unterstützt hier einige Programme speziell und fasst die Ergebnisse in einer Webapplikation zusammen.
Unit tests
Für Unittests (Modultests) steht PHPUnit (http://www.phpunit.de/) zur Verfügung, die Standardsoftware aus dem PEAR Projekt wenn es darum geht, PHP Projekte automatisiert zu testen. Zusätzlich zu den Tests wird noch überprüft, wieviel Code durch die Tests abgedeckt wird und daraus wird ein CRAP Index errechnet, der beschreibt, wie hoch die Wahrscheinlichkeit ist, durch Änderungen den Code zu schrotten, weil er zu unübersichtlich und/oder zu wenig getestet ist.
Dokumentation
Mithilfe dem ebenfalls in PEAR enthaltenen PHPDocumentor (http://www.phpdoc.org/) lässt sich automatisch eine Dokumentation aus dem Code generieren. Diese wird dann in die Webseite integriert und Probleme werden aufgelistet.
Coding Standards
Um sicherzustellen, dass der Code lesbar ist und alles halbwegs gleich aussieht, kann mit dem PHP CodeSniffer (http://pear.php.net/package/PHP_CodeSniffer/) der Code überprüft werden. Die Verstöße werden aufgelistet.
Graphen
Für diejenigen, die wie ich klickbunti Grafiken lieben, werden mehr oder weniger nützliche Graphen generiert, die einen Überblick über den Qualitätsverlauf des Codes geben. [Screenshot] (http://www.phpundercontrol.org/images/0.3.5-metrics.png)
Für wen ist das überhaupt nützlich?
Für alle die, die an der Qualität des Codes interessiert sind, die ein größeres Projekt mit mehreren Leuten und Versionsverwaltung haben. Für kleinere Projekte lohnt sich der ganze Aufwand nicht. Und auch bei laufenden Projekten, die bis jetzt ohne Tests und Dokumentation ausgekommen sind, ist der Aufwand, beides zu schreiben viel zu hoch, das verdirbt nur den Spaß.
Ansonsten ist es vielleicht einfach interessant, bei einem neuen Projekt mal sowas auszuprobieren und sich mal Gedanken über den Stil des Codes, Dokumentation und all die anderen Dinge zu machen, die einen "guten" Stil ausmachen. Ich habe mich jedenfalls in den letzten Jahren immer mehr um einen "guten Stil" bemüht, das ist bei großen Sachen imo unumgänglich, sonst geht die Übersicht flöten.
Für diejenigen, die sich dafür interessieren, hier mal Beispielkonfigurationsdateien. Die config.xml:
<?xml version="1.0"?>
<cruisecontrol>
<project buildafterfailed="false" name="Fubar">
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
</listeners>
<modificationset>
<svn LocalWorkingCopy="projects/${project.name}/source/" />
</modificationset>
<schedule interval="1800">
<ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
</schedule>
<log dir="logs/${project.name}">
<merge dir="projects/${project.name}/build/logs/"/>
</log>
<publishers>
<currentbuildstatuspublisher file="logs/${project.name}/buildstatus.txt"/>
<artifactspublisher dir="projects/${project.name}/build/api" dest="artifacts/${project.name}" subdirectory="api"/>
<artifactspublisher dir="projects/${project.name}/build/coverage" dest="artifacts/${project.name}" subdirectory="coverage"/>
<execute command="G:/xampp/php525/phpuc.bat graph logs/${project.name}"/>
<execute command="G:/Programme/CruiseControl/copy_graph.bat"/>
</publishers>
</project>
</cruisecontrol>
copy_graph.bat ist hier eine kleine Batch Datei, die die Graphen an die richtige Stelle im Dateisystem verfrachtet, sonst funktionierte das bei mir nicht.
In diesem Fall wird alle 30 Sekunden der SVN Checkout auf Änderungen gecheckt, und fallls diese vorliegen, wird ein neuer Build erzeugt. Danach werden die Ergebnisse als Webapplikation veröffentlicht.
Und dann noch die Ant Build Datei (build.xml):
<?xml version="1.0" encoding="UTF-8"?>
<project name="Fubar" default="build" basedir=".">
<target name="build" depends="checkout,php-documentor,php-codesniffer,phpunit"/>
<target name="co" depends="checkout"/>
<target name="checkout">
<exec executable="svn" dir="${basedir}/source">
<arg line="up" />
</exec>
</target>
<target name="docs" depends="php-documentor"/>
<target name="documentation" depends="php-documentor"/>
<target name="phpdoc" depends="php-documentor"/>
<target name="php-documentor">
<exec executable="phpdoc.bat" dir="${basedir}/source" logerror="on">
<arg line="on --title '${ant.project.name}' -ue on -t ${basedir}/build/api -d . -i old/* -tb path/to/phpdoc -o HTML:Phpuc:phpuc"/>
</exec>
</target>
<target name="checkstyle" depends="php-codesniffer"/>
<target name="phpcs" depends="php-codesniffer"/>
<target name="php-codesniffer">
<exec executable="phpcs.bat" dir="${basedir}/source" output="${basedir}/build/logs/checkstyle.xml">
<arg line="--report=checkstyle --ignore=old/ ."/>
</exec>
</target>
<target name="test" depends="phpunit"/>
<target name="phpunit">
<exec executable="phpunit.bat" dir="${basedir}/source/tests" failonerror="on">
<arg line=" --log-xml ${basedir}/build/logs/phpunit.xml --log-pmd ${basedir}/build/logs/phpunit.pmd.xml --log-metrics ${basedir}/build/logs/phpunit.metrics.xml --coverage-html ${basedir}/build/coverage/ AllTests"/>
</exec>
</target>
</project>
Diese Datei erzeugt den Build, bestehend aus Tests, der Dokumentation, den Coding Style und Coverage Informationen. Zuvor wird die neuste Code Version heruntergeladen.
Ich hoffe mal, dieser kurze Artikel war interessant für euch und ihr guckt euch das vielleicht mal an :) Kritik, Lob oder sonstwelche Kommentare sind erwünscht ;)