Im folgenden Artikel werde ich aufzeigen, wie man phpUnderControl als Continuous Integration für ein Drupal Projekt einrichtet. CruiseControl ist ein Framework für den Continuous Integration Prozess und beinhaltet Plugins für E-Mailbenachrichtigung, ANT, Phing und andere SC Tools. Über eine Weboberfläche kann man Details zu allen durchgeführten Builds einsehen. Durch die phpUnderControl Erweiterung für CruiseControl wird der Einsatz von PHPUnit, PHPDocumentor, PHP_Codesniffer, PHP_Depend und vielen anderen PHP Werkzeuge, welche für die Analyse des Quelltextes eingesetzt werden.

Ich zeige hier die Installation mit einem Ubuntu 8.04 LTS auf, welche aber leicht auf eine andere Linux Distribution übertragen werden kann.

Folgende Schritte sind dafür erforderlich:

  1. Java Umgebung einrichten
  2. CruiseControl installieren
  3. phpUnderControl installieren
  4. CruiseControl patchen
  5. Zugriffsbeschränkung (optional)

1. Java Umgebung einrichten

Um festzustellen ob Java schon installiert ist, schreibt man einfach folgenden Befehl in die Shell:

java -version

Dann sollte man etwa folgendes sehen, falls Java installiert ist:

java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

Falls noch kein Java installiert ist, kann man dies mit folgendem Befehl nachholen:

sudo apt-get install sun-java6-jdk

In die Datei /etc/environment wird durch folgenden Befehl die Umgebungsvariable JAVA_HOME angehängt:

echo 'JAVA_HOME="/usr/lib/jvm/java-6-sun"' >> /etc/environment

Nach der Installation ist es erforderlich, dass die Umgebungsvariablen neu eingelesen werden - oder man führt in der offenen Shell folgenden Befehl aus:

source /etc/environment

Hinweis: die Umgebungsvariable JAVA_HOME wird nicht mit dem nachfolgendem init.d Skript benötigt. Sie ist aber dennoch sinnvoll, wenn man auf Fehlersuche gehen muss und cruisecontrol.sh eventuell manuell ausführen muss. Aber auch viele andere Programme greifen auf diese Umgebungsvariable zu, deshalb ist es auf jeden Fall kein Fehler diese gesetzt zu haben ;)

2. CruiseControl (CC) installieren

Zuerst lädt man sich die aktuell stabile Version von CruiseControl herunter: http://sourceforge.net/projects/cruisecontrol/files/, extrahiert die Archivdatei im Verzeichnis /opt und legt einen symbolischen Link auf die aktuelle Version an:

cd /tmp && wget http://downloads.sourceforge.net/project/cruisecontrol/CruiseControl/2.8.2/cruisecontrol-bin-2.8.2.zip?use_mirror=freefr # get archive file from sf
cd /opt && unzip /tmp/cruisecontrol-bin-2.8.2.zip # extract files
ln -s cruisecontrol-bin-2.8.2 cc # create symlink

Nun noch das init.d Skript einrichten, damit Cruisecontrol auch automatisch startet:

wget -O /etc/init.d/cruisecontrol http://phpundercontrol-server.googlecode.com/files/cruisecontrol-start-1.1
chmod +x /etc/init.d/cruisecontrol
update-rc.d cruisecontrol defaults

Nun muss noch ein Benutzer angelegt werden, der den CruiseControl Prozess ausführt und die Dateiberechtigungen entsprechend gesetzt werden:

useradd developer
chown -R developer:developer /opt/cc/

Nun kann CruiseControl mit folgendem Befehl gestartet werden:

invoke-rc.d cruisecontrol start

Danach öffnet man einen Browser seiner Wahl und geht auf die Adresse: http://:8080/dashboard/admin/config Ihr solltet nun ungefähr folgendes sehen:

Cruisecontrol Status

Falls Ihr nicht diese Meldung angezeigt bekommt, ist irgendetwas schief gegangen. Es ist wichtig, dass der Fehler behoben wird, bevor man mit der Anleitung fortfährt!

3. phpUnderControl installieren

phpUnderControl und alle benötigten Tools werden mit Hilfe von PEAR installiert. Um PEAR zu installieren, verwendet man folgenden Befehl:

sudo apt-get install php-pear

Für phpUnit wird xdebug benötigt, welches mit folgenden Befehl installiert wird:

apt-get install php5_xdebug

Nun können die PEAR Pakete installiert werden:

sudo pear config-set preferred_state alpha # PHP_CodeBrowser erfordert alpha, ansonsten würde hier beta ausreichen
sudo pear channel-discover pear.phpunit.de
sudo pear channel-discover components.ez.no
sudo pear channel-discover pear.symfony-project.com
sudo pear install --alldeps phpunit/phpUnderControl

4. CruiseControl patchen

Um in CruiseControl die Erweiterungen von phpUnderControl zu nutzen, muss man folgenden Befehl ausführen:

phpuc install /opt/cc
phpuc example /opt/cc

Die zweite Zeile installiert ein Beispiel-Projekt, mit dem man die Funktionsweise nachvollziehen kann.

Da Drupal SimpleTest für die funktionalen Tests einsetzt, muss noch folgender Patch für CruiseControl eingespielt werden (die Patchdatei habe ich unten zu dieser Beschreibung angehängt):

cd /opt/cc/webapps/cruisecontrol
patch -p1 < /tmp/cruisecontrol_simpletest.patch

Nun muss CruiseControl neu gestartet werden, um die Änderungen zu aktivieren:

invoke-rc.d cruisecontrol restart

Einsatzbereit

Diese Anleitung hat aufgezeigt, wie man phpUnderControl mit allen Tools für den Einsatz eines Drupal Projektes installiert. Im nächsten Schritt kann man sich an die Integration des Projektes in den CI Prozess machen.

Als Ergebnis sollte nun unter der URL http://:8080/cruisecontrol/ folgender Screen zu sehen sein:

Cruisecontrol mit phpUnderControl

Und in der Detailansicht für das Projekt php-under-control sieht sieht es wie folgt aus:

Cruisecontrol mit phpUnderControl (Details)

5. Zugriffsbeschränkung (optional)

Falls der Build-Server innerhalb eines Intranets zum Einsatz kommt, wird man in den meisten Fällen keine zusätzliche Absicherung des Webinterfaces benötigen. Falls der Server aber über das Internet erreichbar ist, sollte man den Zugriff einschränken. Da diese Anleitung für den Einsatz von Drupal ausgerichtet ist, wird in den meisten Fällen Apache als Webserver eingesetzt werden. Deshalb werden wir nun auch Apache für die Authentifizierung benutzen. Die Idee ist, dass man Apache Proxy einsetzt und die Anfragen an Port 8080 weiterreicht. Port 8080 (unter dem normalerweise CruiseControl erreichbar ist) wird so konfiguriert, dass nur Anfragen von localhost erlaubt sind. Dadurch erreichen wir, dass wir die Authentifizierungsmethoden nutzen können, die Apache zur Verfügung stellt - natürlich kann auch SSL Verschlüsselung eingesetzt werden.

Mit der folgenden Anweisung werden die benötigten Apache Module aktiviert:

a2enmod proxy proxy_http ext_filter

Hier ist die Konfigurationsdatei /etc/apache2/sites-available/ci (natürlich kann die Datei ci auch beliebig anders heissen) für den virtuellen Host:

<VirtualHost *:80>
        ServerName ci.meinedomain.de
        ProxyRequests Off
        <Proxy *>
                Order deny,allow
                Allow from all
                AuthName        "phpUnderControl"
                AuthType        Basic
                AuthUserFile    /etc/apache2/ci.htpasswd
                require         valid-user
        </Proxy>
        ProxyPass / http://127.0.0.1:8080/
        ProxyPassReverse / http://127.0.0.1:8080/
        ExtFilterDefine fixurls mode=output intype=text/html cmd="/bin/sed s%http://127.0.0.1:8080%http://ci.meinedomain.de%g"
        SetOutputFilter fixurls
</VirtualHost>

Die .htpasswd Datei wird mit folgenden Befehl angelegt, und legt den Benutzer alex an:

htpasswd -c /etc/apache2/ci.htpasswd alex

Will man einen weiteren Benutzer hinzufügen, verwendet man folgenden Befehl:

htpasswd /etc/apache2/ci.htpasswd claudi

Jetzt müssen wir noch verhindern, dass Port 8080 direkt angesprochen werden kann, indem wir die jetty Konfiguration anpassen. Und zwar ersetzen wir dazu in der Datei /opt/cc/etc/jetty.xml die Zeile

<Set name="host"><SystemProperty name="jetty.host" /></Set>

mit

<Set name="host"><SystemProperty name="jetty.host" default="127.0.0.1" /></Set>

Nun wird noch der virtuelle Host ci aktiviert und danach CruiseControl und Apache neu gestartet, um die Änderungen zu aktivieren:

a2ensite ci
invoke-rc.d cruisecontrol restart
invoke-rc.d apache2 restart

Weitere Ressourcen

Aktualisiert: