<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>creative developer service</title>
	<atom:link href="http://www.cds-spremberg.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cds-spremberg.de/blog</link>
	<description>Tutorials</description>
	<pubDate>Tue, 08 Jun 2010 20:34:04 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java Probleme nach Update zu Lucid 10.04</title>
		<link>http://www.cds-spremberg.de/blog/update-java-probleme-lucid-1004/</link>
		<comments>http://www.cds-spremberg.de/blog/update-java-probleme-lucid-1004/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 19:44:06 +0000</pubDate>
		<dc:creator>Jens Klose</dc:creator>
		
		<category><![CDATA[Administration]]></category>

		<category><![CDATA[Continuous Integration]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.cds-spremberg.de/blog/?p=187</guid>
		<description><![CDATA[Systemupdate zu Ubuntu 10.04 Lucid Lynx
Da liefert uns die Ubuntu Community die 10.04LTS Version und wie bekommt die unserem CI Server? Die Antwort ist abh&#228;ngig von den administrativen Eingriffen und dem Alter der Projekte. Kurz gesagt: &#8220;schlecht&#8221;.
Wichtige &#196;nderungen:

 PHP wird auf den 5.3er Zweig gehoben
Suns JAVA aus den offiziellen Quellen rausgenommen

Die Sun-Java Verbannung aus den supporteten Repos [...]]]></description>
			<content:encoded><![CDATA[<h2>Systemupdate zu Ubuntu 10.04 Lucid Lynx</h2>
<p>Da liefert uns die <a title="Ubuntu Website" href="http://www.ubuntu.com/">Ubuntu Community</a> die 10.04LTS Version und wie bekommt die unserem CI Server? Die Antwort ist abh&auml;ngig von den administrativen Eingriffen und dem Alter der Projekte. Kurz gesagt: &#8220;schlecht&#8221;.</p>
<p>Wichtige &Auml;nderungen:</p>
<ol>
<li> PHP wird auf den 5.3er Zweig gehoben</li>
<li>Suns JAVA aus den offiziellen Quellen rausgenommen</li>
</ol>
<p>Die Sun-Java Verbannung aus den supporteten Repos sorgt f&uuml;r eine Deinstallation der vorhandenen Sourcen und damit f&uuml;r das Aus unseres CruiseControl Dienstes. Nach den PHP Updates und dem Erhalten der vorhandenen php.ini folgten nette Warnings auf der Konsole, die aber schnell beseitigt werden konnten. Beachtet die &Auml;nderungen, die bei einigen Projekten auch zu unerwartetem Verhalten f&uuml;hren k&ouml;nnen.</p>
<p>Das sollte uns nicht abschrecken. Die Geschwindigkeitsvorteile und auch die neuen M&ouml;glichkeiten sind ausreichende Gr&uuml;nde die Anpassungen zu meistern.</p>
<p>Wie gelangt Ihr an die Sun-Java Installation (wann wird Oracle das Wording &uuml;bernehmen)?</p>
<pre>sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo apt-get update
sudo apt-get install sun-java6-jdk</pre>
<p>Wenn Ihr die Lizenz bereits einmal best&auml;tigt habt, l&auml;uft die Installation komplett durch. Viel Erfolg! Hinweise und Erfahrungen sind immer willkommen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cds-spremberg.de/blog/update-java-probleme-lucid-1004/feed/</wfw:commentRss>
		</item>
		<item>
		<title>phpUnderControl quick install 0910</title>
		<link>http://www.cds-spremberg.de/blog/phpundercontrol_quick_install_0910/</link>
		<comments>http://www.cds-spremberg.de/blog/phpundercontrol_quick_install_0910/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 17:08:06 +0000</pubDate>
		<dc:creator>Jens Klose</dc:creator>
		
		<category><![CDATA[Projekte]]></category>

		<guid isPermaLink="false">http://www.cds-spremberg.de/blog/?p=175</guid>
		<description><![CDATA[Quick install list
system requirements:

Ubuntu (up to 8.04) minimal or Debian 5
root access
user for cruisecontrol runtime (this example: developer)

CruiseControl Install
apt-get update
apt-get install sun-java6-jdk
apt-get install unzip
apt-get install wget
apt-get install make

cd /opt
wget http://downloads.sourceforge.net/cruisecontrol/cruisecontrol-bin-2.8.2.zip
unzip cruisecontrol-bin-2.8.2.zip
mv cruisecontrol-bin-2.8.2 cc

useradd developer
chown -R developer /opt/cc

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
phpUnderControl Install
apt-get install php5
apt-get install php5-dev
apt-get install php-pear

pear upgrade PEAR
pear channel-discover pear.phpunit.de
pear [...]]]></description>
			<content:encoded><![CDATA[<h2>Quick install list</h2>
<p>system requirements:</p>
<ul>
<li>Ubuntu (up to 8.04) minimal or Debian 5</li>
<li>root access</li>
<li>user for cruisecontrol runtime (this example: developer)</li>
</ul>
<h3>CruiseControl Install</h3>
<pre>apt-get update
apt-get install sun-java6-jdk
apt-get install unzip
apt-get install wget
apt-get install make

cd /opt
wget http://downloads.sourceforge.net/cruisecontrol/cruisecontrol-bin-2.8.2.zip
unzip cruisecontrol-bin-2.8.2.zip
mv cruisecontrol-bin-2.8.2 cc

useradd developer
chown -R developer /opt/cc

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</pre>
<h3>phpUnderControl Install</h3>
<pre>apt-get install php5
apt-get install php5-dev
apt-get install php-pear

pear upgrade PEAR
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear config-set preferred_state beta
pear install --alldeps phpunit/phpUnderControl
pecl install xdebug
phpuc install /opt/cc</pre>
<h4>Versions</h4>
<pre>2009/10/01:
install ok: channel://pear.phpunit.de/PHPUnit-3.4.0
install ok: channel://pear.php.net/PHP_CodeSniffer-1.2.0
install ok: channel://pear.php.net/PhpDocumentor-1.4.3
install ok: channel://components.ez.no/Base-1.7
install ok: channel://pear.php.net/Image_GraphViz-1.3.0RC3
install ok: channel://pear.php.net/Log-1.11.5
install ok: channel://pear.php.net/DB-1.7.14RC1
install ok: channel://pear.php.net/MDB2-2.5.0b2
install ok: channel://pear.php.net/Mail-1.2.0b2
install ok: channel://pear.php.net/XML_Parser-1.3.2
install ok: channel://pear.php.net/Net_Socket-1.0.9
install ok: channel://pear.php.net/Auth_SASL-1.0.3
install ok: channel://components.ez.no/Graph-1.4.3
install ok: channel://pear.php.net/XML_Beautifier-1.2.0
install ok: channel://pear.php.net/Net_SMTP-1.3.3
install ok: channel://pear.phpunit.de/phpUnderControl-0.4.7</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.cds-spremberg.de/blog/phpundercontrol_quick_install_0910/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHPUnit unter Kontrolle</title>
		<link>http://www.cds-spremberg.de/blog/phpunit-in-phpundercontrol/</link>
		<comments>http://www.cds-spremberg.de/blog/phpunit-in-phpundercontrol/#comments</comments>
		<pubDate>Fri, 15 May 2009 00:41:45 +0000</pubDate>
		<dc:creator>Jens Klose</dc:creator>
		
		<category><![CDATA[Projekte]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[PHPUnit]]></category>

		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.cds-spremberg.de/blog/?p=141</guid>
		<description><![CDATA[Testen macht Spa&#223;

Was ist der Antrieb beim Coden? F&#252;r mich ist es der Spa&#223; am Probleml&#246;sen, Knobeln, Macht &#252;ber die Maschine zu bekommen- kurz Erfolgserlebnisse.
Woher soll man die nehmen, wenn in den tiefen Schichten einer Anwendung ohne sichtbare Erfolge entwickelt wird? Daf&#252;r wurden die Unit Tests erfunden. Sebastian Bergmann konnte es mit PHP und ohne [...]]]></description>
			<content:encoded><![CDATA[<h3>Testen macht Spa&szlig;</h3>
<p><img class="size-full wp-image-144 alignnone" title="phpunitstatus" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/05/phpunitstatus.png" alt="phpunitstatus" width="213" height="102" /></p>
<p>Was ist der Antrieb beim Coden? F&uuml;r mich ist es der Spa&szlig; am Probleml&ouml;sen, Knobeln, Macht &uuml;ber die Maschine zu bekommen- kurz Erfolgserlebnisse.</p>
<p>Woher soll man die nehmen, wenn in den tiefen Schichten einer Anwendung ohne sichtbare Erfolge entwickelt wird? Daf&uuml;r wurden die Unit Tests erfunden. Sebastian Bergmann konnte es mit PHP und ohne diese Erfolgserlebnisse nicht mehr aushalten - er schrieb das Testframework PHPUnit.</p>
<p>Es gibt auch noch andere Versionen dieser Geschichte. <img src='http://www.cds-spremberg.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Example Projekt testen</h3>
<p>Holen wir uns etwas Freude mit unserer Math Klasse und bringen die Unit Tests in den gr&uuml;nen Bereich.<span id="more-141"></span></p>
<p>Meilenstein 3</p>
<ul>
<li>Syntax berichtigen bis Unit Tests erfolgreich laufen</li>
<li>Einflu&szlig; auf den Build in phpUnderControl erkunden</li>
</ul>
<p><img class="alignnone size-full wp-image-148" title="phpunitlisting" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/05/phpunitlisting.jpg" alt="phpunitlisting" width="783" height="427" /></p>
<p>Den aktuellen Stand kann man sich auf den Testseiten von phpUnderControl anschauen. Aber als Reporting und Build Tool wird es nicht in den Workflow der Fehlerbeseitigung passen. Wir nehmen einfach wieder unsere Konsolenvariante. Genau genommen liegt hier auch der Ansto&szlig; f&uuml;r die Erstellung des Entwicklungsservers unter VirtualBox. Ich habe unter Vista64 einfach keine lauff&auml;hige CLI Version von PHP und damit auch PEAR hinbekommen.</p>
<p>Return to topic, nutzen wir doch einfach die Variante von Meilenstein 2 und aktivieren &Uuml;berwachungskonsole &#8230;</p>
<pre>cd /home/developer/example.phpuc/source
watch -n5 phpunit .</pre>
<p>und Editor. Fehleranalyse: 2 Varianten sind immer zu bedenken. Erstens unsere Tests sind fehlerhaft oder der zu testende Code ist der Schuldige.</p>
<p>/home/developer/example.phpuc/source/tests/MathTest.php:92</p>
<p>Da haben wir die 1. Quelle und starten das Refactoring. Ich schlage vor jeder f&uuml;r sich schnell mal da durch.</p>
<pre>cvs commit -m "alle Tests berichtigt"</pre>
<p>F&uuml;r Einsteiger sind sch&ouml;ne Beispiele f&uuml;r den Funktionsumfang von PHPUnit dabei. Schauen wir doch nochmal auf unsere Testseite und kaum zu glauben: GR&Uuml;N. Da ist es wieder dieses Erfolgserlebnis.</p>
<p><img class="alignnone size-full wp-image-151" title="firstbuildok" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/05/firstbuildok.jpg" alt="firstbuildok" width="480" height="46" /></p>
<h3>Ursachenforschung</h3>
<pre>  &lt;target name="phpunit"&gt;
    &lt;exec executable="phpunit" dir="${basedir}/source" failonerror="on"&gt;
      &lt;arg line=" --log-xml ${basedir}/build/logs/phpunit.xml --log-pmd ${basedir}/build/logs/phpunit.pmd.xml --coverage-xml  ${basedir}/build/logs/phpunit.coverage.xml --coverage-html ${basedir}/build/coverage PhpUnderControl_Example_MathTest tests/MathTest.php"/&gt;
    &lt;/exec&gt;
  &lt;/target&gt;</pre>
<p>Die Testfehler verhinderten also ein erfolgreiches Build. Unsere Bem&uuml;hungen tragen Fr&uuml;chte und wir haben ein Beispiel f&uuml;r Qualit&auml;tssicherung auf Unit Test Ebene.</p>
<p>Wer jetzt auch noch die letzten roten Punkte von der Karte haben will, der mu&szlig; sich mit den Software Metrics auseinandersetzen und die anzeigten Probleme beseitigen. Dabei geht es um sehr wichtige Vorgaben, die die Teamarbeit ungemein unterst&uuml;tzen. Bei konsequenter Anwendung wird die Lesbarkeit und der Codingstil in der Quellen verbessert.</p>
<p>Am besten gef&auml;llt mir dabei der CRAP Index, der die Komplexit&auml;t einer Funktion anhand der Anzahl ihrer m&ouml;glichen Durchl&auml;ufe bewertet. Vorbei die Zeiten schneller Dirty-Hacks, aber auch die der ungeliebten Pflege solcher Monster.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cds-spremberg.de/blog/phpunit-in-phpundercontrol/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Refactoring des Example Projekts</title>
		<link>http://www.cds-spremberg.de/blog/refactoring-des-example-projekts/</link>
		<comments>http://www.cds-spremberg.de/blog/refactoring-des-example-projekts/#comments</comments>
		<pubDate>Wed, 13 May 2009 22:55:09 +0000</pubDate>
		<dc:creator>Jens Klose</dc:creator>
		
		<category><![CDATA[Projekte]]></category>

		<category><![CDATA[Continuous Integration]]></category>

		<category><![CDATA[php Zend refactoring]]></category>

		<guid isPermaLink="false">http://www.cds-spremberg.de/blog/?p=99</guid>
		<description><![CDATA[Codesniffer im Projekt nutzen

Bei aller Freude &#252;ber die erfolgreiche Installation wollen wir den eigentlichen Antrieb, die monotonen Arbeiten macht phpUnderControl f&#252;r uns, nicht vergessen. Es wird Zeit mal wieder Quellcode zu bearbeiten.
2. Meilenstein

der Codingstyle f&#252;r Codesniffer wird auf &#8220;Zend&#8221; festgelegt
Refactoring: Code Style

Wir legen den Zend Style f&#252;r unser Projekt einfach fest und lernen ihn dann [...]]]></description>
			<content:encoded><![CDATA[<h3>Codesniffer im Projekt nutzen</h3>
<p><img class="size-full wp-image-122 alignnone" title="codesnifferteaser" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/05/codesnifferteaser.jpg" alt="codesnifferteaser" width="312" height="119" /></p>
<p>Bei aller Freude &uuml;ber die erfolgreiche Installation wollen wir den eigentlichen Antrieb, die monotonen Arbeiten macht phpUnderControl f&uuml;r uns, nicht vergessen. Es wird Zeit mal wieder Quellcode zu bearbeiten.</p>
<p>2. Meilenstein</p>
<ul>
<li>der Codingstyle f&uuml;r Codesniffer wird auf &#8220;<a href="http://framework.zend.com/manual/en/coding-standard.html">Zend</a>&#8221; festgelegt</li>
<li>Refactoring: Code Style</li>
</ul>
<p><span id="more-99"></span>Wir legen den Zend Style f&uuml;r unser Projekt einfach fest und lernen ihn dann on the fly.</p>
<p>Hier stellt sich gleich mal die Zwischenfrage: Sollte man den Codesniffer in die Versionverwaltung integrieren und &#8220;schlechte&#8221; Commits verhindern? Es kommt mal wieder auf die Rahmenbedingungen an. Codesniffers Speicherbedarf steigt mit dem Projektvolumen, zeitkritische BugFixes, Einsatz externer Tools alles das l&auml;&szlig;t sich geschickt administieren, aber wollen wir nicht eigentlich coden? Den Spa&szlig; am Refactoring gegen den Frust beim Commit abzuw&auml;gen ist stark projektabh&auml;ngig.</p>
<p>Festlegung f&uuml;r das Example Projekt: PhpUnderControl dient zur Kontrolle und keine Sniffer Integration in die Versionsverwaltung.</p>
<p>Welche Codingstyles kennt den CodeSniffer?</p>
<pre>developer@lamp:/opt/cc$ phpcs -i
The installed coding standards are PEAR, PHPCS, Squiz, Zend and MySource</pre>
<p>Na wenn Zend schon drin ist brauchen wir nur noch den Schalter finden.</p>
<pre>Usage: phpcs [-nwlsvi] [--report=&lt;report&gt;] [--report-file=&lt;reportfile&gt;]
    [--config-set key value] [--config-delete key] [--config-show]
    [--standard=&lt;standard&gt;] [--sniffs=&lt;sniffs&gt;]
    [--extensions=&lt;extensions&gt;] [--ignore=&lt;patterns&gt;]
    [--generator=&lt;generator&gt;] [--tab-width=&lt;width&gt;] &lt;file&gt; ...
        -n           Do not print warnings
        -w           Print both warnings and errors (on by default)
        -l           Local directory only, no recursion
        -s           Show sniff codes in all reports
        -v[v][v]     Print verbose output
        -i           Show a list of installed coding standards
        --help       Print this help message
        --version    Print version information
        &lt;file&gt;       One or more files and/or directories to check
        &lt;extensions&gt; A comma separated list of file extensions to check
                     (only valid if checking a directory)
        &lt;patterns&gt;   A comma separated list of patterns that are used
                     to ignore directories and files
        &lt;sniffs&gt;     A comma separated list of sniff codes to limit the check to
                     (all sniffs must be part of the specified standard)
        &lt;standard&gt;   The name of the coding standard to use
        &lt;width&gt;      The number of spaces each tab represents
        &lt;generator&gt;  The name of a doc generator to use
                     (forces doc generation instead of checking)
        &lt;report&gt;     Print either the "full", "xml", "checkstyle",
                     "csv", "emacs", "source" or "summary" report
                     (the "full" report is printed by default)
        &lt;reportfile&gt; Write the report to the specified file path
                     (report is also written to screen)</pre>
<p>Na dann auf zu den Quellen und die M&ouml;glichkeiten durchgespielt:</p>
<pre>cd /home/developer/example.phpuc/source/src
phpcs --standard=zend .</pre>
<pre>FILE: /home/developer/example.phpuc/source/src/Math.php
--------------------------------------------------------------------------------
FOUND 26 ERROR(S) AND 154 WARNING(S) AFFECTING 68 LINE(S)
--------------------------------------------------------------------------------
...</pre>
<h3>Refactoring beginnt</h3>
<p>Da ist noch Refactoring n&ouml;tig. Holen wir die &Uuml;bersicht der Stylefehler auf die phpUnderControl Seiten. Den Aufruf von Codesniffer finden wir in der build.xml, leicht zu erkennen als &lt;target  name=&#8221;php-codesniffer&#8221;&gt;</p>
<pre>&lt;target name="php-codesniffer"&gt;
  &lt;exec executable="phpcs" dir="${basedir}/source" output="${basedir}/build/logs/checkstyle.xml" error="/tmp/checkstyle.error.log"&gt;
    &lt;arg line="--report=checkstyle --standard=zend src"/&gt;
  &lt;/exec&gt;
&lt;/target&gt;</pre>
<p>Den Parameter &#8211;standard=zend ge&auml;ndert und nach den commit ins CVS Repo sollte der n&auml;chste build getriggert werden.</p>
<pre>cd /home/developer/example.phpuc
cvs commit -m "codesniffer auf zend umgestellt"</pre>
<p>Beim n&auml;chsten Build Check sind wir dabei und finden kurz darauf unsere 26 Error(s) im Codesniffer Abschnitt des phpUnderControl. Gz - die erste &Auml;nderung in unserem <span>Continuous Integration Prozess.</span></p>
<p><span><img class="alignnone size-full wp-image-121" title="codesnifferstart" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/05/codesnifferstart.jpg" alt="codesnifferstart" width="793" height="380" /></span></p>
<p><span>Die bem&auml;ngelten Stellen werden wir mal gleich ausbessern. Ich benutze dazu am besten schnell 2 Konsolen.</span></p>
<pre><span>watch -n5 phpcs --standard=zend .</span></pre>
<p><span>Nummer 1 zeigt mir alle 5 Sekunden den aktuellen Stand. In der 2. bessere ich den Code aus. Etwas Find&amp;Replace &uuml;ber die Variablennamen mit Ziffern, die langen Zeilen umgebrochen, die Klammerung an den Standard angepasst und pl&ouml;tzlich bleiben die Meldungen in Konsole 1 aus - geschafft.</span></p>
<h3>Publishing</h3>
<p><span>Das n&auml;chste CVS Commit sollte unseren Erfolg visualisieren.</span></p>
<p><span>cvs commit -m &#8220;CS Style erf&uuml;llt&#8221;</span></p>
<p><span>In der Datei habe ich:</span></p>
<p>
<div><a href="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/05/mathphp.txt" style="float: right; margin-right: 5px;">Download</a>
<pre lang="php"><?php
/**
 * This file is part of phpUnderControl.
 *
 * Copyright (c) 2007-2008, Manuel Pichler
<mapi@phpundercontrol.org>.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *
 *   * Neither the name of Manuel Pichler nor the names of his
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package   Example
 * @author    Manuel Pichler
<mapi@phpundercontrol.org>
 * @copyright 2007-2008 Manuel Pichler. All rights reserved.
 * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
 * @version   SVN: $Id: Math.php,v 1.4 2009-05-13 21:51:26 developer Exp $
 * @link      http://www.phpundercontrol.org/
 */

/**
 * Simple math class.
 *
 * @package   Example
 * @author    Manuel Pichler
<mapi@phpundercontrol.org>
 * @author    Jens Klose
 * @copyright 2007-2008 Manuel Pichler. All rights reserved.
 * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
 * @version   Release: 0.4.7
 * @link      http://www.phpundercontrol.org/
 */
class PhpUnderControl_Example_Math
{
    /**
     * Adds the two given values.
     *
     * @param integer $firstVar Value one.
     * @param integer $secondVar Value two.
     *
     * @return integer.
     */
    public function add($firstVar, $secondVar)
    {
        return ($firstVar + $secondVar);
    }

    /**
     * Subtract param two from param one
     *
     * @param integer $firstVar Value one.
     * @param integer $secondVar Value two.
     *
     * @return integer.
     */
    public function sub($firstVar, $secondVar)
    {
        return ($firstVar - $secondVar);
    }

    /**
     * Not tested method that should be visible with low coverage.
     */
    public function div($firstVar, $secondVar)
    {
        $thirthVar = $firstVar / ($secondVar + $firstVar);
        if ($thirthVar > 14) {
            $forthVar = 0;
            for ($i = 0; $i < $thirthVar; $i++) {
                $forthVar += ($secondVar * $i);
            }
        }
        $fifthVar = ($forthVar < $thirthVar
                      ? ($thirthVar - $forthVar)
                      : ($forthVar - $thirthVar));

        $sixthVar  = ($firstVar * $secondVar
                      * $thirthVar * $forthVar * $fifthVar);

        $d = array(
                   $firstVar,
                   $secondVar,
                   $thirthVar,
                   $forthVar,
                   $fifthVar,
                   $sixthVar);

        $seventhVar = 1;
        for ($i = 0; $i < $sixthVar; $i++) {
            shuffle($d);
            $seventhVar = $seventhVar + $i * end($d);
        }

        $eighthVar = $seventhVar;
        foreach ( $d as $x ) {
            $eighthVar *= $x;
        }

        $thirthVar = $firstVar / ($secondVar + $firstVar);
        if ($thirthVar > 14) {
            $forthVar = 0;
            for ($i = 0; $i < $thirthVar; $i++) {
                $forthVar += ($secondVar * $i);
            }
        }
        $fifthVar = ($forthVar < $thirthVar
                     ? ($thirthVar - $forthVar)
                     : ($forthVar - $thirthVar));

        $sixthVar  = ($firstVar * $secondVar * $thirthVar
                   * $forthVar * $fifthVar);

        $d = array(
            $firstVar,
            $secondVar,
            $thirthVar,
            $forthVar,
            $fifthVar,
            $sixthVar
        );

        $seventhVar = 1;
        for ($i = 0; $i < $sixthVar; $i++) {
            shuffle($d);
            $seventhVar = $seventhVar + $i * end($d);
        }

        $eighthVar = $seventhVar;
        foreach ( $d as $x ) {
            $eighthVar *= $x;
        }

        return $eighthVar;
    }

    /**
     * Simple copy for cpd detection.
     */
    public function complex($firstVar, $secondVar)
    {
        $thirthVar = $firstVar / ($secondVar + $firstVar);
        if ($thirthVar > 14) {
            $forthVar = 0;
            for ($i = 0; $i < $thirthVar; $i++) {
                $forthVar += ($secondVar * $i);
            }
        }
        $fifthVar = ($forthVar < $thirthVar
            ? ($thirthVar - $forthVar)
            : ($forthVar - $thirthVar));

        $sixthVar = ($firstVar
            * $secondVar
            * $thirthVar
            * $forthVar
            * $fifthVar);

        $d = array(
            $firstVar,
            $secondVar,
            $thirthVar,
            $forthVar,
            $fifthVar,
            $sixthVar
        );

        $seventhVar = 1;
        for ($i = 0; $i < $sixthVar; $i++) {
            shuffle($d);
            $seventhVar = $seventhVar + $i * end($d);
        }

        $eighthVar = $seventhVar;
        foreach ( $d as $x ) {
            $eighthVar *= $x;
        }

        $thirthVar = $firstVar / ($secondVar + $firstVar);
        if ($thirthVar > 14) {
            $forthVar = 0;
            for ($i = 0; $i < $thirthVar; $i++) {
                $forthVar += ($secondVar * $i);
            }
        }
        $fifthVar = ($forthVar < $thirthVar
            ? ($thirthVar - $forthVar)
            : ($forthVar - $thirthVar));

        $sixthVar = ($firstVar
            * $secondVar
            * $thirthVar
            * $forthVar
            * $fifthVar);

        $d = array(
            $firstVar,
            $secondVar,
            $thirthVar,
            $forthVar,
            $fifthVar,
            $sixthVar
        );

        $seventhVar = 1;
        for ($i = 0; $i < $sixthVar; $i++) {
            shuffle($d);
            $seventhVar = $seventhVar + $i * end($d);
        }

        $eighthVar = $seventhVar;
        foreach ( $d as $x ) {
            $eighthVar *= $x;
        }

        return $eighthVar;
    }
}
</pre>
</div>
<p>Seltsam, die Codesniffer Ausgaben zeigen weiterhin Fehler an, obwohl die Message des Commits im Listing am Ende erscheint.</p>
<p>Aber haben wir den schon die Projektdateien unseres phpUnderControls aktualisieren lassen? Nein der Bootstrapper hat lediglich die build.xml erneuert. Da war doch was mit XML PingPong - genau in welche SteuerXML soll den nun der Projektupdate?</p>
<p>Das Projekt kennt seine Dateien besser und welche Versionsverwaltungen auch immer die Entwickler in Zukunft einsetzen wollen, welche Teilprojekte &uuml;berhaupt aktualisiert werden sollen, alles das k&ouml;nnen die Entwickler am besten gleich in IHRER projektinternen build.xml verwalten. Ein neues Target muss her:</p>
<pre>  &lt;target name="build" depends="cvs-update,php-documentor,php-codesniffer,phpunit"/&gt;
  &lt;target name="cvs-update"&gt;
    &lt;exec executable="cvs" dir="${basedir}/source" logerror="on"&gt;
      &lt;arg line="update -P -d"/&gt;
    &lt;/exec&gt;
  &lt;/target&gt;</pre>
<p>Dieses Target auch noch ins build integriert als ersten Teil der depends Kette und ein neues commit des Projektes gewagt.</p>
<pre>cvs commit -m "cvs update ins build"</pre>
<p>Warten&#8230;<br />
Erfolg! Zumindest die Codesniffer Meldungen haben wir beseitigt. Das komplette Build steht zwar noch auf rot, aber jetzt kann uns nichts mehr stoppen. Der n&auml;chste Meilenstein wartet.</p>
<h4>N&uuml;tzliche Links:</h4>
<p><a title="ANT" href="http://ant.apache.org/manual/index.html">ANT Manual</a><br />
<a title="CruiseControl Config" href="http://cruisecontrol.sourceforge.net/main/configxml.html">CruiseControl Config</a><br />
<a title="Codesniffer" href="http://pear.php.net/manual/en/package.php.php-codesniffer.php">CodeSniffer</a><br />
<a title="CodeSniffer Anleitung auf PHP hates me" href="http://www.phphatesme.com/blog/tools/php-code-sniffer-installation-und-verwendung/trackback/">Deutsche ausf&uuml;hrliche Anleitung von Nils Langner (PHP hates me)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cds-spremberg.de/blog/refactoring-des-example-projekts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Administration phpUnderControl</title>
		<link>http://www.cds-spremberg.de/blog/administration-phpundercontrol/</link>
		<comments>http://www.cds-spremberg.de/blog/administration-phpundercontrol/#comments</comments>
		<pubDate>Mon, 11 May 2009 01:08:19 +0000</pubDate>
		<dc:creator>Jens Klose</dc:creator>
		
		<category><![CDATA[Administration]]></category>

		<category><![CDATA[Projekte]]></category>

		<category><![CDATA[Continuous Integration]]></category>

		<category><![CDATA[cvs]]></category>

		<category><![CDATA[phpUnderControl]]></category>

		<guid isPermaLink="false">http://www.cds-spremberg.de/blog/?p=86</guid>
		<description><![CDATA[Die Logs nicht vergessen
Allzu gerne werden sie vernachl&#228;ssigt - die Logdateien und alten Sicherungen. Unser phpUnderControl l&#228;uft nun schon einige Tage und ohne weitere Konfiguration wird das Example Projekt &#8220;php-under-control&#8221; alle 5 min neu getriggert und es erzeugt flei&#223;ig Dokumentationen und Auswertungen.
Da unser Continuous Integration Tool seinem Namen alle Ehre macht erzeugt es fortlaufend neue [...]]]></description>
			<content:encoded><![CDATA[<h3>Die Logs nicht vergessen</h3>
<p>Allzu gerne werden sie vernachl&auml;ssigt - die Logdateien und alten Sicherungen. Unser phpUnderControl l&auml;uft nun schon einige Tage und ohne weitere Konfiguration wird das Example Projekt &#8220;php-under-control&#8221; alle 5 min neu getriggert und es erzeugt flei&szlig;ig Dokumentationen und Auswertungen.</p>
<p>Da unser Continuous Integration Tool seinem Namen alle Ehre macht erzeugt es fortlaufend neue Dateien im ./artifacts Ordner. Das muss nicht auf jedem Server zum Problem f&uuml;hren. Bei richtiger Konfiguration sind diese Dateien sogar gewollt. Doch wer braucht schon die Nightly Builds der letzten 3 Jahre?</p>
<p>Also entweder das Aufr&auml;umen wird als Teil des Build Prozesses integriert und damit voll steuerbar oder die schnelle Variante die phpUnderControl mitliefert reicht f&uuml;r den Anfang.<span id="more-86"></span></p>
<pre>phpuc clean -j php-under-control -k 10 /opt/cc</pre>
<p>Der Befehl k&uuml;rzt die Sammlung auf die letzten 10 Builds. Weitere Optionen findet ihr <a href="http://phpundercontrol.org/documentation/command-line.html#id10">in der Doku</a>.</p>
<p>Achtung: Dieses Aufr&auml;umen ist relevant f&uuml;r die angezeigte Statistik im Men&uuml;punkt Metrics.</p>
<p><img class="alignnone size-full wp-image-87" title="metricsall5min" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/04/metricsall5min.jpg" alt="metricsall5min" width="826" height="384" /></p>
<p><img class="alignnone size-full wp-image-88" title="metricsafterclean" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/04/metricsafterclean.jpg" alt="metricsafterclean" width="827" height="386" /></p>
<h3>Feintuning wird n&ouml;tig</h3>
<p>Es wird also Zeit dem neuen Helfer genauere Anweisungen f&uuml;r sinnvollere Projektbegleitung zu geben.</p>
<p>Ab hier wird es jetzt so projektspezifisch, dass ich einige Vorgaben machen muss<br />
<strong>1. Meilenstein</strong>:</p>
<ul>
<li>das example project wird in ein CVS Repository importiert</li>
<li>phpUnderControl soll das CVS Repo &uuml;berwachen</li>
<li>das Projekt wird auf einem Arbeitsrechner ausgecheckt</li>
</ul>
<p>Na dann mal los. CVS hatte ich neben weiteren Versionsverwaltungen ja bereits mit auf dem <a href="http://www.cds-spremberg.de/blog/installation-phpundercontrol-from-scratch/">Entwicklungsserver installiert</a>. Bleibt noch CVS Repository anlegen, Arbeitskopie des Projektes besorgen und dann ins CVS importieren.</p>
<pre>mkdir /home/developer/cvs
cvs /home/developer/cvs init
cp -R /opt/cc/projects/php-under-control /home/developer
rm -R /home/developer/php-under-control/build
cd /home/developer/php-under-control/
cvs -d /home/developer/cvs import -m "agil begin" example.phpuc dev start</pre>
<p>Es sollten einige positive Echos in der Konsole erscheinen. Ok, jetzt dieses Projekt als Arbeitskopie auschecken.</p>
<pre>cd /home/developer/
cvs -d /home/developer/cvs/ checkout example.phpuc</pre>
<p>Da wir die build.xml in der Versionsverwaltung integriert haben, m&uuml;ssen wir eine Besonderheit beim Konfigurieren von phpUnderControl beachten. Da bei der &Uuml;berwachung nur die &Auml;nderung im CVS Repository als Ausl&ouml;ser eines neuen Builds dient, fehlt das Aktualisieren/Updaten der eventuell modifizierten build.xml bevor CruiseControl sie durch unsere flei&szlig;ige Ameise (ANT) jagt. Aber da wir nicht die ersten sind, die das bemerken gibt es nat&uuml;rlich einen Ausweg.</p>
<p>Aber der Reihe nach: CVS &Uuml;berwachung einbauen, build.xml updaten und dann ANT starten. Wo war das gleich nochmal? Ah ja, die Arbeitsanweisungen unseres Continuous Integration Tools stehen in der config.xml. Zeit diese unter die Lupe zu nehmen.</p>
<p><img class="alignnone size-full wp-image-95" title="configxmlstart" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/05/configxmlstart.jpg" alt="configxmlstart" width="650" height="491" /></p>
<p>Jedes Projekt hat also seinen Abschnitt im XML. Hier mal ein Crashkurs f&uuml;r die Tag Elemente:</p>
<p>&lt;project&gt;</p>
<p style="padding-left: 30px;">Dieses Element steht f&uuml;r ein Projekt und enth&auml;lt in den eingeschlossenen Elementen die Informationen f&uuml;r das wann und wie eines Builds<br />
Attribute:<br />
<strong>name</strong> - eindeutiger Name innerhalb der CC Umgebung<br />
<strong>buildafterfailed</strong> - [true|false] - aktiviert bei true weitere Builds auch nach Fehlern. Ist n&uuml;tzlich wenn der Fehler durch Systemprobleme (DB, Netwerk, &#8230;) entstand, aber erzwingt auch Wiederholungen wenn der Code wirklich nicht zu builden ist.</p>
<p>&lt;schedule&gt;</p>
<p style="padding-left: 30px;">Dieses Element ist Pflicht und gibt an in welchem Intervall CruiseControl dieses Projekt tiggert. Au&szlig;erdem enth&auml;lt es den Aufruf der eigentlichen Buildprozesse.<br />
Attributte:<br />
<strong>interval</strong> - defaults &#8216;300&#8242; (5 Minuten) - Sekunden bis zum n&auml;chsten Versuch</p>
<p>&lt;modificationset&gt;</p>
<p style="padding-left: 30px;">Ist ein Intervall erreicht und das n&auml;chste Build steht an werden erst mal die hier eingetragenen Bedingungen gecheckt. Damit k&ouml;nnte man dieses Element als Filter betrachten. Es verhindert unn&ouml;tige Buildprozesse oder startet bewu&szlig;t z.B. Nightly Builds auch ohne &Auml;nderungen am Quellcode.<br />
Attribute:</p>
<p style="padding-left: 60px;"><strong>requiremodification</strong> - default &#8216;true&#8217; - soll eine &Auml;nderung erst das Ereignis ausl&ouml;sen; alternativ kann dieses Attribut durch das Kindelement &lt;alwaysbuild/&gt; auch umgangen werden. Damit haben wir unseren Example Zustand gleich gekl&auml;rt.<br />
<strong>quietperiod</strong> - optional - gibt eine Zeitspanne in Sekunden an wie alt die erwartete &Auml;nderung mindestens sein soll. Das ist n&uuml;tzlich wenn gro&szlig;en Projekten oder langsamen Verbindungen die Versionsverwaltungen einen inkonsistenten Zustand haben k&ouml;nnten. Ich bin mir nicht sicher, ob das nur bei CVS passieren k&ouml;nnte, da andere ja atomar arbeiten.</p>
<p>&lt;bootstrappers&gt;</p>
<p style="padding-left: 30px;">Hier k&ouml;nnen Anweisungen rein die noch vor jedem Build durchlaufen sollen. Da hatten wir doch Bedarf - genau - unser build.xml enth&auml;lt ja die Anweisungen f&uuml;r einen neuen Buildprozess und bevor es vom ANT benutzt wird m&uuml;ssten wir die gew&uuml;nschte und aktuellste Version im Projekt liegen haben. Das erledigen wir durch einen CVS update in diesem Element.</p>
<p>Na jetzt haben wir genug Theorie. Unser Meilenstein schreit nach Taten. Folgende Anpassungen m&uuml;ssen in die /opt/cc/config.xml Datei:</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;cruisecontrol&gt;
  &lt;project name="php-under-control" buildafterfailed="false"&gt;
    &lt;listeners&gt;
      &lt;currentbuildstatuslistener file="logs/${project.name}/status.txt"/&gt;
    &lt;/listeners&gt;
    &lt;modificationset&gt;
      &lt;cvs localWorkingCopy="projects/${project.name}/"/&gt;
    &lt;/modificationset&gt;
    &lt;bootstrappers&gt;
      &lt;cvsbootstrapper
         localWorkingCopy="projects/${project.name}/"
         file            ="build.xml"
      /&gt;
    &lt;/bootstrappers&gt;
    &lt;schedule interval="60"&gt;
      &lt;ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/&gt;
    &lt;/schedule&gt;
    &lt;log dir="logs/${project.name}"&gt;
      &lt;merge dir="projects/${project.name}/build/logs/"/&gt;
    &lt;/log&gt;
    &lt;publishers&gt;
      &lt;currentbuildstatuspublisher file="logs/${project.name}/buildstatus.txt"/&gt;
      &lt;artifactspublisher dir="projects/${project.name}/build/api" dest="artifacts/${project.name}" subdirectory="api"/&gt;
      &lt;artifactspublisher dir="projects/${project.name}/build/coverage" dest="artifacts/${project.name}" subdirectory="coverage"/&gt;
      &lt;execute command="/usr/bin/phpuc graph logs/${project.name} artifacts/${project.name}"/&gt;
    &lt;/publishers&gt;
  &lt;/project&gt;
&lt;/cruisecontrol&gt;</pre>
<p>Ich habe gleich noch das Projekt &#8220;connectfour&#8221; entfernt. Testen wir die &Auml;nderungen indem wir im Browser nachsehen. Aber vorher noch eine CVS Version unseres Projektes in den CC Projektordner. Richtig w&auml;re ein ordentlicher checkout, aber schneller ist:</p>
<pre>cp -Rf /home/developer/example.phpuc/* /opt/cc/projects/php-under-control/</pre>
<p>Der Meilenstein ist erreicht. Ich erhalte unter http://lamp:8080/cruisecontrol/buildresults/php-under-control</p>
<p><img class="alignnone size-full wp-image-101" title="modifications" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/05/modifications.gif" alt="modifications" width="657" height="137" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cds-spremberg.de/blog/administration-phpundercontrol/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Erstes Projekt in phpUnderControl</title>
		<link>http://www.cds-spremberg.de/blog/erstes-projekt-in-phpundercontrol/</link>
		<comments>http://www.cds-spremberg.de/blog/erstes-projekt-in-phpundercontrol/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 22:45:28 +0000</pubDate>
		<dc:creator>Jens Klose</dc:creator>
		
		<category><![CDATA[Projekte]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[phpUnderControl]]></category>

		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.cds-spremberg.de/blog/?p=73</guid>
		<description><![CDATA[PhpUnderControl ist nach der Installation dein neuer Mitarbeiter in der Qualit&#228;ts&#252;berwachung. Da im Hintergrund mehrere Builder bereit stehen (CCWeb: &#8220;There are builders supplied for Ant, NAnt, Maven, Phing, Rake, and Xcode and the catch-all exec&#8220;), lassen sich weitere &#8220;l&#228;stige&#8221; Arbeiten verlagern, wie das Bereitstellen von Programmversionen, die Ver&#246;ffentlichung auf Staging- und/oder Produktivservern, das Anpassen von [...]]]></description>
			<content:encoded><![CDATA[<p>PhpUnderControl ist <a href="http://www.cds-spremberg.de/blog/installation-phpundercontrol-from-scratch">nach der Installation</a> dein neuer Mitarbeiter in der Qualit&auml;ts&uuml;berwachung. Da im Hintergrund mehrere Builder bereit stehen (<a href="http://cruisecontrol.sourceforge.net/index.html">CCWeb</a>: &#8220;There are builders supplied for <a href="http://cruisecontrol.sourceforge.net/main/configxml.html#ant">Ant</a>, <a href="http://cruisecontrol.sourceforge.net/main/configxml.html#nant">NAnt</a>, <a href="http://cruisecontrol.sourceforge.net/main/configxml.html#maven2">Maven</a>, <a href="http://cruisecontrol.sourceforge.net/main/configxml.html#phing">Phing</a>, <a href="http://cruisecontrol.sourceforge.net/main/configxml.html#rake">Rake</a>, and <a href="http://cruisecontrol.sourceforge.net/main/configxml.html#xcode">Xcode </a>and the catch-all <a href="http://cruisecontrol.sourceforge.net/main/configxml.html#exec">exec</a><a href="http://cruisecontrol.sourceforge.net/main/configxml.html#xcode">&#8220;</a>), lassen sich weitere &#8220;l&auml;stige&#8221; Arbeiten verlagern, wie das Bereitstellen von Programmversionen, die Ver&ouml;ffentlichung auf Staging- und/oder Produktivservern, das Anpassen von Datenbanken, die Versionierung beim Erreichen der Anforderungen&#8230;.<span id="more-73"></span></p>
<h3>Projekt anlegen und einbinden</h3>
<p>Was muss ich wo machen und bitte lange Dokumentationen vermeiden! Ok, es geht in 5 Sekunden.</p>
<pre>phpuc example /opt/cc</pre>
<p>Nach mehreren Zeilen Ausgaben meldet sich der freundliche Linux Prompt zur&uuml;ck und ein Test im Browser zeigt nach sp&auml;testens 5min ein neues Projekt in der Liste.</p>
<p><img class="alignnone size-full wp-image-74" title="exampleprojektdashboard" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/04/exampleprojektdashboard.jpg" alt="exampleprojektdashboard" width="749" height="326" /></p>
<p>Farbe und Symbolik unseres php-under-control Projektes lassen nichts Gutes ahnen. In der Tat ist das mitgelieferte Example-Projekt mit Fehlern und schlechtem Codingstil behaftet - man will ja zeigen, was alles aufgedeckt wird.</p>
<p><img class="alignnone size-full wp-image-75" title="exampleprojectoverview" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/04/exampleprojectoverview.jpg" alt="exampleprojectoverview" width="766" height="684" /></p>
<p>Die Dokumentation ist auf dem neuesten Stand und die Anwendung kann als Beta den Markt erobern. <img src='http://www.cds-spremberg.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Schauen wir uns an was da im Hintergrund alles passiert, um unsere eigenen Projekte an diesem strengen Pr&uuml;fer vorbei zu bekommen.</p>
<p>Als erstes erkunden wir die Arbeitsumgebung unseres Angestellten. Hat er &uuml;berhaupt das Projekt richtig angelegt? Blindes Vertrauen schon in der Probezeit? Nein - also nochmal in den Konsolenausgaben unseres 5 Sekunden Projektes nachgeforscht:</p>
<p><img class="alignnone size-full wp-image-77" title="exampleprojektconsolemarkierungen" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/04/exampleprojektconsolemarkierungen.gif" alt="exampleprojektconsolemarkierungen" width="662" height="580" /></p>
<p>finden wir alle relavanten Informationen. Der Workspace (project directory) wird also relativ unter projects/php-under-control angelegt. Ich habe auch gleich noch die entscheidenden Dateien markiert die offenbar miteinander korrespondieren.</p>
<ul>
<li><a href="http://cruisecontrol.sourceforge.net/main/configxml.html">config.xml</a> - (im root von CruiseControl /opt/cc) steuert die Projekt&uuml;berwachung</li>
<li>build.xml - (Ort ist nicht festgeschrieben) ist ein ANT build file</li>
</ul>
<h3>XML Ping Pong</h3>
<p>Bei diesen XML Dateien steht man schnell mal vor der Frage: Wo packe ich das Auschecken von X oder das Kopieren von Y rein?</p>
<p>Ich habe da eine einfache Formel f&uuml;r die Grobabdeckung:</p>
<ul>
<li>Ist es Teil des eigentlichen Build Prozesses? -&gt; build.xml</li>
<li>Ist es zur regelm&auml;&szlig;igen &Uuml;berwachung des Projektfortschrittes n&ouml;tig? -&gt; config.xml</li>
</ul>
<p>Beide Dateien stehen in engem Zusammenhang. Die config.xml muss die Ordnerstruktur der angelegten Builddateien und Logs kennen, um die entsprechenden Publisher zu steuern. Die Modificationsets der config.xml triggern auch erst ein Build und sind deshalb stark vom Projektzustand, wie z.B. Versionverwaltungssystemen, abh&auml;ngig. Diese Abh&auml;ngigkeit erkl&auml;rt die H&auml;ufigkeit dieser beiden Dateien im obigen Konsolenmitschnitt.</p>
<p>F&uuml;r die Arbeit mit Versionverwaltungen empfiehlt es sich, im Projektordner keine Dateien zu editieren. Das verhindert Merge Konflikte und damit fehlerhafte Builds, die die Entwickler bei sich lokal nicht nachvollziehen k&ouml;nnen. Dieser &#8220;Mitarbeiter&#8221; hat immer ein sauberes Arbeitsverzeichnis mit der aktuellen Programmversion, wenn wir uns daran halten.</p>
<h3>Erfolgreiches Projekt</h3>
<p>Bei unserem Example Projekt k&ouml;nnen wir uns eine Ausnahme g&ouml;nnen. Der Spieltrieb sollte an dieser Stelle geweckt sein. Aktuell wird alle 5 Minuten die build.xml ausgef&uuml;hrt. Die entsprechenden Einstellungen dazu sind Thema des n&auml;chsten Artikels. Jetzt erst mal viel Spa&szlig; beim Ausprobieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cds-spremberg.de/blog/erstes-projekt-in-phpundercontrol/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Installation phpUnderControl from scratch</title>
		<link>http://www.cds-spremberg.de/blog/installation-phpundercontrol-from-scratch/</link>
		<comments>http://www.cds-spremberg.de/blog/installation-phpundercontrol-from-scratch/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 20:58:13 +0000</pubDate>
		<dc:creator>Jens Klose</dc:creator>
		
		<category><![CDATA[Administration]]></category>

		<category><![CDATA[Projekte]]></category>

		<category><![CDATA[agile Methoden]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[pear]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[phpUnderControl]]></category>

		<category><![CDATA[PHPUnit]]></category>

		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.cds-spremberg.de/wordpress/?p=3</guid>
		<description><![CDATA[Projekt PHP Entwicklungsserver mit Continuous Integration

Wie behalte ich die &#220;bersicht &#252;ber meine Projekte?
Wer k&#252;mmert sich um die Dokumentation?
Laufen die Tests noch?
Soll das Entwicklungstempo hoch gehalten werden und/oder agile Methoden zum Einsatz kommen, dann wird eine technische L&#246;sung f&#252;r diese Fragen gesucht.
PHP Projekte m&#252;ssen nicht hilflos auf Ruby Tools schielen oder JAVA L&#246;sungen beneiden. Es gibt interessante [...]]]></description>
			<content:encoded><![CDATA[<h2>Projekt PHP Entwicklungsserver mit Continuous Integration</h2>
<p><img class="size-full wp-image-59 alignnone" title="phpundercontrol" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/04/phpundercontrol.gif" alt="phpundercontrol" width="534" height="165" /></p>
<p>Wie behalte ich die &Uuml;bersicht &uuml;ber meine Projekte?<br />
Wer k&uuml;mmert sich um die Dokumentation?<br />
Laufen die Tests noch?</p>
<p>Soll das Entwicklungstempo hoch gehalten werden und/oder agile Methoden zum Einsatz kommen, dann wird eine technische L&ouml;sung f&uuml;r diese Fragen gesucht.</p>
<p>PHP Projekte m&uuml;ssen nicht hilflos auf Ruby Tools schielen oder JAVA L&ouml;sungen beneiden. Es gibt interessante Anwendungen, die einen Tester, Builder und Dokumentator ersetzen. Daf&uuml;r sind nur 237 Webquellen durchzuarbeiten, 793 weiterf&uuml;hrende Links zu &uuml;berschauen und Beta Versionen anzutesten.</p>
<p>H&ouml;rt sich nicht sehr einladend an?<br />
Ich habe in den letzen Tagen 3 mal ein phpUnderControl aufgesetzt und da die Sucherei nicht weniger wurde, mich gezwungen es zu dokumentieren. F&uuml;r die von mir benutzten aktuellen Versionen ist es jetzt komplett nachvollziehbar.<span id="more-3"></span></p>
<h3>Systemumgebung f&uuml;r diese Anleitung:</h3>
<p>Ubuntu Server 8.10 (in VirtualBox installiert)</p>
<p>In den VirtualBox Einstellungen die Netzwerkkarte des Gastes als Hostinterface gesetzt f&uuml;r lokales Netzwerk zwischen Wirt und Gast.</p>
<p>Beim Ubuntu Setup ausgew&auml;hlt:</p>
<ul>
<li>LAMP Server</li>
<li>SSH Server</li>
</ul>
<p>VirtualBox Netz erreichbar vom Host z.B. http://lamp<br />
user account &#8220;developer&#8221;<br />
root account aktiviert (sudo passwd root)</p>
<p>Die n&auml;chsten Systembefehle ben&ouml;tigen root Rechte und da es ein virtueller Rechner f&uuml;r lokale Entwicklung wird spricht nichts gegen die Arbeit als root. Alternativ kann gerne sudo vor jeden Befehl gesetzt werden. F&uuml;r die Installation auf einem Arbeitsplatz empfehle ich eine Konsole mit &#8220;sudo -s&#8221; zur Root Shell zu machen.</p>
<p><span style="text-decoration: line-through;">optional</span> wichtige Entwicklungstools:</p>
<ul>
<li>Subversion (apt-get install subversion)</li>
<li>Git (apt-get install git-core)</li>
<li>CVS (agt-get install cvs)</li>
</ul>
<h3>PHP vorbereiten:</h3>
<pre>apt-get install php5-cli php-pear php5-xdebug</pre>
<h3>Java JDK installieren</h3>
<pre>apt-get install sun-java6-jdk</pre>
<p>Hier ist Interaktion angesagt, da die Nutzungsbedingungen akzeptiert werden m&uuml;ssen.</p>
<h3>CruiseControl installieren</h3>
<pre>cd /opt
wget http://downloads.sourceforge.net/cruisecontrol/cruisecontrol-bin-2.8.2.zip
apt-get install unzip
unzip cruisecontrol-bin-2.8.2.zip
mv cruisecontrol-bin-2.8.2 cc
chown -R developer /opt/cc</pre>
<h3>Startsript anlegen:</h3>
<pre>cd /etc/init.d
touch cruisecontrol</pre>
<p>Folgenden Inhalt einf&uuml;gen:</p>
<div><a href="http://www.cds-spremberg.de/blog/wp-content/files/cruisecontrol" style="float: right; margin-right: 5px;">Download</a>
<pre lang="perl">#!/bin/sh
### BEGIN INIT INFO
# Provides:          cruisecontrol
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: CruiseControl build loop.
### END INIT INFO

# CruiseControl Unix Startup Script Version
#
# based on http://confluence.public.thoughtworks.org/display/CC/UnixStartupScriptVersion1.x
# adapted for multiple projects
# also modified by Jerome Lacoste
#
# modifications for ubuntu-server installation by Jens Klose

########################################################################
# USER CONFIGURATION
#
# Fill in these values for your Cruise Control setup

# What user will Cruise Control run as?  The user will need permission to write and modify files
# in the next entries.
CC_USER=developer

# Where is the CC startup script located?
CC_INSTALL_DIR=/opt/cc

# In what directory is the config.xml file located for CC?
# default: CC_WORK_DIR=$CC_INSTALL_DIR
CC_WORK_DIR=$CC_INSTALL_DIR

# Where will the cruisecontrol.log file be located?
# default: CC_LOGFILE_DIR=$CC_INSTALL_DIR
CC_LOGFILE_DIR=$CC_INSTALL_DIR/logs

#######################
# ENVIRONMENT ADDITIONS

# Add environement variables here that are needed by your build.
# example:
export JAVA_HOME=/usr/lib/jvm/java-6-sun

# Add path to additional executables needed for project build.  See PATH entry below for base config.
# No additional action taken when blank.
PATH_ADDITIONS=

##############################
# CRUISE CONTROL PORT SETTINGS
# Port for Jetty reporting application.  You can access it by going to http://localhost:8080
# default CC_WEBPORT=8080
CC_WEBPORT=8080

# JMX port for webapp and Java Management eXtensions (JMX). http://localhost:8082
# Change only if this port is in use as the webapp will also need modification.
# default CC_JMXPORT=8082
CC_JMXPORT=8082

# RMI port for control via Java's Remote Management Interface (RMI)
# Leave blank to disable.
CC_RMIPORT=

########################################################################
# DO NOT MODIFY ENTRIES BELOW THIS LINE

NAME=cruisecontrol
DESC="CruiseControl - continuous integration build loop"

PATH=/sbin:/usr/sbin:/usr/bin:/bin

# add additions if variable has text defined
if [ -n "$PATH_ADDITIONS" ]; then
    PATH=$PATH_ADDITIONS:$PATH
fi
export PATH

CC_DAEMON=$CC_INSTALL_DIR/cruisecontrol.sh
CC_CONFIG_FILE=$CC_WORK_DIR/config.xml
CC_LOG_FILE=$CC_LOGFILE_DIR/cruisecontrol.log

CC_COMMAND="$CC_DAEMON -configfile $CC_CONFIG_FILE -webport $CC_WEBPORT -jmxport $CC_JMXPORT -rmiport $CC_RMIPORT"

# overwrite settings from default file
if [ -f /etc/default/cruisecontrol ]; then
    . /etc/default/cruisecontrol
fi

# does the executable exist?
test -f $CC_DAEMON || (echo "The executable $CC_DAEMON does not exist!" &#038;&#038; exit 0)

if [ `id -u` -ne 0 ]; then
    echo "Not starting/stopping $DESC, you are not root."
    exit 4
fi

case "$1" in

    'start')
        cd $CC_INSTALL_DIR
        #echo "CC environtment at startup" > cc.startup.env
        #env >> cc.startup.env
        su $CC_USER -c "/bin/sh -c \"$CC_COMMAND >> $CC_LOG_FILE 2>&#038;1\"" &#038; RETVAL=$?
        echo "$NAME started with jmx on port ${CC_JMXPORT}"
        ;;

    'stop')
        # Get the PID output from the startup script
        if [ -f $CC_INSTALL_DIR/cc.pid ]; then
            CC_PID=`cat $CC_INSTALL_DIR/cc.pid`
        else
            echo "No cc.pid file found.  CC process may not be controllable from this script!"
        fi

        if [ -n "$CC_PID" ] &#038;&#038; ps -p ${CC_PID} > /dev/null ; then
            kill -9 ${CC_PID}
            $0 status
            RETVAL=$?
        else
            echo "$NAME is not running"
            RETVAL=1
        fi
        ;;

    'status')
        # Get the PID output from the startup script
        if [ -f $CC_INSTALL_DIR/cc.pid ]; then
            CC_PID=`cat $CC_INSTALL_DIR/cc.pid`
        else
            echo "No cc.pid file found.  CC process may not be controllable from this script!"
        fi

        if [ -n "$CC_PID" ] &#038;&#038; ps -p ${CC_PID} > /dev/null ; then
            echo $NAME \(pids $CC_PID\) is running
            RETVAL=0
        else
            echo "$NAME is stopped"
            RETVAL=1
        fi
        ;;

    'restart')
        $0 stop &#038;&#038; $0 start
        RETVAL=$?
        ;;

    *)
        echo "Usage: $0 { start | stop | status | restart }"
        exit 1
        ;;

esac

exit 0;
</pre>
</div>
<p>Script testen:</p>
<pre>root@lamp:/etc/init.d#chmod +x ./cruisecontrol
/etc/init.d/cruisecontrol start
cruisecontrol started with jmx on port 8082
root@lamp:/etc/init.d#</pre>
<h3>Im Browser testen:</h3>
<p>http://lamp:8080/cruisecontrol/</p>
<p><img class="size-medium wp-image-50 alignnone" title="cruisecontrolfirststart" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/04/cruisecontrolfirststart-300x86.jpg" alt="cruisecontrolfirststart" width="300" height="86" /></p>
<p>Ok - dann: CruiseControl beenden:</p>
<pre>/etc/init.d/cruisecontrol stop</pre>
<h3>Runlevel Eintr&auml;ge setzen:</h3>
<pre>update-rc.d cruisecontrol defaults</pre>
<p>Output:</p>
<pre>root@lamp:/etc/init.d# update-rc.d cruisecontrol defaults
 Adding system startup for /etc/init.d/cruisecontrol ...
   /etc/rc0.d/K20cruisecontrol -&gt; ../init.d/cruisecontrol
   /etc/rc1.d/K20cruisecontrol -&gt; ../init.d/cruisecontrol
   /etc/rc6.d/K20cruisecontrol -&gt; ../init.d/cruisecontrol
   /etc/rc2.d/S20cruisecontrol -&gt; ../init.d/cruisecontrol
   /etc/rc3.d/S20cruisecontrol -&gt; ../init.d/cruisecontrol
   /etc/rc4.d/S20cruisecontrol -&gt; ../init.d/cruisecontrol
   /etc/rc5.d/S20cruisecontrol -&gt; ../init.d/cruisecontrol</pre>
<p>Beim n&auml;chsten Neustart sollte die Startmeldung mit erscheinen.</p>
<p><img class="size-full wp-image-51 alignnone" title="ccstartscriptintegriert" src="http://www.cds-spremberg.de/blog/wp-content/uploads/2009/04/ccstartscriptintegriert.jpg" alt="ccstartscriptintegriert" width="728" height="245" /></p>
<p>An dieser Stelle hat man den flei&szlig;igen neuen Mitarbeiter bereits. Auch ohne phpUnderControl k&ouml;nnen jetzt Projekte verwaltet und mit <a title="Ant Homepage" href="http://ant.apache.org/">ANT</a> bearbeitet und deployed werden. Die weiteren Installationen bringen den PHP Entwicklern angepa&szlig;te Auswertungen, die auf den Logs der pear Tools beruhen.</p>
<h3>Installation phpUnderControl, PHPUnit und weitere Tools:</h3>
<p><span style="color: #800080;">2009/06 <span style="color: #000080;">UpdateInfos</span>: PHPUnit verlangt f&uuml;r die Installation einen aktuelleren PEAR Installer.<br />
Fehlermeldung:<br />
</span><span style="color: #800080;">phpunit/PHPUnit requires PEAR Installer (version &gt;= 1.8.1)</span><br />
<span style="color: #800080;">L&ouml;sung:<br />
pear upgrade PEAR</span></p>
<p>Installation &uuml;ber pear erspart sp&auml;teren &Auml;rger mit PATH Anpassungen, installiert Codesniffer, PHPDocumentor und andere ben&ouml;tigte Tools gleich mit.</p>
<pre>pear channel-discover pear.phpunit.de
pear update-channels
pear install phpunit/PHPUnit
pear install --alldeps Log
pear config-set preferred_state beta
pear install --alldeps pear/Image_GraphViz
pear channel-discover components.ez.no
pear install --alldeps phpunit/phpUnderControl
pear config-set preferred_state stable</pre>
<p>Jetzt mal mit Ausgabe, um die Toolliste f&uuml;r manuelle Nachinstallationen festzuhalten.</p>
<pre>root@lamp:~# root@lamp:~# pear install --alldeps phpunit/phpUnderControl
downloading phpUnderControl-0.4.7.tgz ...
Starting to download phpUnderControl-0.4.7.tgz (558,873 bytes)
.........................................................................done: 558,873 bytes
downloading Graph-1.4.2.tgz ...
Starting to download Graph-1.4.2.tgz (3,388,920 bytes)
...done: 3,388,920 bytes
downloading PHP_CodeSniffer-1.2.0RC1.tgz ...
Starting to download PHP_CodeSniffer-1.2.0RC1.tgz (282,807 bytes)
...done: 282,807 bytes
downloading PhpDocumentor-1.4.2.tgz ...
Starting to download PhpDocumentor-1.4.2.tgz (2,421,028 bytes)
...done: 2,421,028 bytes
downloading Base-1.6.1.tgz ...
Starting to download Base-1.6.1.tgz (178,245 bytes)
...done: 178,245 bytes
downloading XML_Beautifier-1.2.0.tgz ...
Starting to download XML_Beautifier-1.2.0.tgz (12,948 bytes)
...done: 12,948 bytes
downloading XML_Parser-1.3.2.tgz ...
Starting to download XML_Parser-1.3.2.tgz (16,260 bytes)
...done: 16,260 bytes
downloading XML_Util-1.2.1.tgz ...
Starting to download XML_Util-1.2.1.tgz (17,729 bytes)
...done: 17,729 bytes
install ok: channel://pear.php.net/PHP_CodeSniffer-1.2.0RC1
install ok: channel://pear.php.net/PhpDocumentor-1.4.2
install ok: channel://components.ez.no/Base-1.6.1
install ok: channel://pear.php.net/XML_Parser-1.3.2
install ok: channel://pear.php.net/XML_Util-1.2.1
install ok: channel://components.ez.no/Graph-1.4.2
install ok: channel://pear.php.net/XML_Beautifier-1.2.0
install ok: channel://pear.phpunit.de/phpUnderControl-0.4.7
root@lamp:~#</pre>
<p>Erfolgserlebnis abholen:</p>
<pre>root@lamp:~# phpuc -v
phpUnderControl 0.4.7 by Manuel Pichler.</pre>
<p>So jetzt wird CruiseControl mit phpuc angereichert.</p>
<pre>root@lamp:~# phpuc install /opt/cc
Performing CruiseControl task.
   1. Creating directory "webapps/cruisecontrol/images/php-under-control
   2. Creating directory "webapps/cruisecontrol/js

Performing modify file task.
   1. Creating backup "/webapps/cruisecontrol/buildresults.jsp".
   2. Modifying file "/webapps/cruisecontrol/buildresults.jsp"
   3. Creating backup "/webapps/cruisecontrol/index.jsp".
   4. Modifying file "/webapps/cruisecontrol/index.jsp"
...
  46. Creating file "/webapps/cruisecontrol/xsl/phpunit-pmd-details.xsl"
  47. Creating file "/webapps/cruisecontrol/xsl/phpunit-pmd-summary.xsl"
  48. Creating file "/webapps/cruisecontrol/WEB-INF/lib/php-under-control.jar"
root@lamp:~#</pre>
<p>Der finale Start von phpUnderControl over CruiseControl</p>
<pre>/etc/init.d/cruisecontrol start</pre>
<h3>Wie geht es weiter?</h3>
<p>Endlich am Laufen beginnt die n&auml;chste Herausforderung - ein eigenes Projekt  verwalten zu lassen. Das wird ein Thema der bald folgenden Dokumentationen sein.</p>
<h4>Links zum Thema</h4>
<ul class="linklist">
<li> <a href="http://www.daniel-skinner.co.uk/php-under-control-svn-centos-5/12/06/2008">Die Installation unter CentOS 5</a></li>
<li> <a href="http://felix.phpbelgium.be/blog/2009/02/07/setting-up-phpundercontrol/">Auch Debian basiert aber mit SVN Version von phpUnderControl (z.Z. buggy)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.cds-spremberg.de/blog/installation-phpundercontrol-from-scratch/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->