<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Touchdown Consulting Services</title>
	<atom:link href="http://www.touchdownconsulting.nl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.touchdownconsulting.nl</link>
	<description>application, e-commerce and website development</description>
	<lastBuildDate>Sun, 01 Apr 2012 19:07:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Phing development update 01/04/2012</title>
		<link>http://www.touchdownconsulting.nl/2012/04/phing-development-update-01042012/</link>
		<comments>http://www.touchdownconsulting.nl/2012/04/phing-development-update-01042012/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 19:05:52 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=211</guid>
		<description><![CDATA[Roughly a month ago I posted the first in, what should become, a series of development updates concerning Phing. This second blog post details the most important updates during the past four weeks as Phing is moving steadily towards another release (2.4.10 is due out next week). User Guide starts move to DocBook format The [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F04%2Fphing-development-update-01042012%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F04%2Fphing-development-update-01042012%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a title="Phing development update" href="http://www.touchdownconsulting.nl/2012/03/phing-development-update/">Roughly a month ago I posted</a> the first in, what should become, a series of development updates concerning <a title="Phing" href="http://www.phing.info" target="_blank">Phing</a>. This second blog post details the most important updates during the past four weeks as Phing is moving steadily towards another release (2.4.10 is due out next week).</p>
<h3>User Guide starts move to DocBook format</h3>
<p>The biggest commit last month was without a doubt the merge of Johan Persson&#8217;s <em>docbook5</em> branch, which adds a DocBook 5 version of the entire Phing User Guide,  accompanied by its own rendering infrastructure. This feature has been on my personal wishlist for a long time, and it&#8217;s finally around the corner! The new docs will probably not make it into 2.4.10, but, at some point in the coming weeks, the &#8216;live&#8217; user guide (on the Phing website) will be switched to the new format. The 2.4.11 packages will also contain the new docs.</p>
<h3>Liquibase docs</h3>
<p>After succesfully merging the Liquibase tasks last month, Stephan Hochdörfer completed the addition by submitting a pull request containing the necessary documentation!</p>
<h3>PhpDocumentor</h3>
<p>You&#8217;ve probably heard about this, the popular documentation tools phpDocumentor and DocBlox <a href="http://www.docblox-project.org/2012/03/docblox-is-unmasked-it-is-really-phpdocumentor-2/" target="_blank">have merged!</a> Phing supports the new phpDocumentor releases by adding a <em>phpdoc2</em> task.</p>
<h3>PHP 5.4 compatibility</h3>
<p>Phing itself seems to work fine with the <a href="http://php.net/releases/5_4_0.php" target="_blank">recently released PHP 5.4</a>, however, the unit tests experienced some problems &#8211; these have been corrected to make sure the (unstable) snapshot builds are pushed out regularly.</p>
<h3>PHAR package</h3>
<p>Starting with the upcoming 2.4.10 release, each new version of Phing will also be available as a <a href="http://php.net/manual/en/book.phar.php" target="_blank">PHAR</a> package. Initially, this will just contain Phing itself (similar to the PEAR package). After that, the package will be expanded with a few popular dependencies (depending on feedback).</p>
<h3>Various (bug)fixes, the 2.4.10 release</h3>
<p>Last but not least, here&#8217;s a list of tickets that have been closed since the last update.</p>
<table>
<tbody>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/870">#870</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/870">Can&#8217;t find ParallelTask.php</a></td>
<td><a title="2012-03-26T23:34:55+02:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-03-26T23%3A34%3A55%2B02%3A00&amp;precision=second">6 days</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/828">#828</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/828">SelectorUtils::matchPath matches **/._* matches dir/file._name</a></td>
<td><a title="2012-03-20T17:15:16+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-03-20T17%3A15%3A16%2B01%3A00&amp;precision=second">12 days</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/844">#844</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/844">symlink task &#8211; overwrite not working</a></td>
<td><a title="2012-03-20T17:14:48+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-03-20T17%3A14%3A48%2B01%3A00&amp;precision=second">12 days</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/840">#840</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/840">Prevent weird bugs: raise warning when a target tag contains no ending tag</a></td>
<td><a title="2012-03-20T17:11:18+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-03-20T17%3A11%3A18%2B01%3A00&amp;precision=second">12 days</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/820">#820</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/820">Type selector should treat symlinks to directories as such</a></td>
<td><a title="2012-03-15T11:30:07+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-03-15T11%3A30%3A07%2B01%3A00&amp;precision=second">2 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/868">#868</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/868">Git Clone clones into wrong directory</a></td>
<td><a title="2012-03-15T10:09:41+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-03-15T10%3A09%3A41%2B01%3A00&amp;precision=second">2 weeks</a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2012/04/phing-development-update-01042012/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>My Ideas For March</title>
		<link>http://www.touchdownconsulting.nl/2012/03/my-ideas-for-march/</link>
		<comments>http://www.touchdownconsulting.nl/2012/03/my-ideas-for-march/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 08:08:07 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[ideasformarch]]></category>
		<category><![CDATA[pledge]]></category>
		<category><![CDATA[refresh]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=208</guid>
		<description><![CDATA[Last year, Chris Shiflett started the Ideas for March movement, an effort to revitalize the interesting conversations that happen(ed) on blogs. This year, several people are refreshing that effort. This is my pledge to write (blog) more about what I see and do, the projects that I work on, the tools that I use daily, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F03%2Fmy-ideas-for-march%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F03%2Fmy-ideas-for-march%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Last year, <a href="http://shiflett.org/blog/2011/mar/ideas-of-march" target="_blank">Chris Shiflett started the Ideas for March</a> movement, an effort to revitalize the interesting conversations that happen(ed) on blogs. This year, <a href="http://phpdeveloper.org/news/17678" target="_blank">several people</a> are refreshing that effort.</p>
<p>This is my pledge to write (blog) more about what I see and do, the projects that I work on, the tools that I use daily, the people I meet, the events I visit &#8211; the things that inspire me. I will be blogging about all things <a href="http://www.phing.info" target="_blank">Phing</a>, hopefully post a blog or two about Gearman, SOAP, ZF, security and numerous other subjects that have been stuck in my grey matter, but never managed to make it into a blog post.</p>
<p>Plus, and I&#8217;m very excited about this, my good friend <a href="http://www.brightontwerpstudio.nl/" target="_blank">Joeri</a> is busy working on a redesign of this site, which will hopefully make all that new content more appealing and easy to read!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2012/03/my-ideas-for-march/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Joind.in nominated for an Impact Award</title>
		<link>http://www.touchdownconsulting.nl/2012/03/joind-in-nominated-for-an-impact-award/</link>
		<comments>http://www.touchdownconsulting.nl/2012/03/joind-in-nominated-for-an-impact-award/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 18:42:59 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[award]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[joindin]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=204</guid>
		<description><![CDATA[The community site joind.in is the definitive community event tracker, and it&#8217;s entirely open source! Today I learned that the site has been nominated for the 2012 Impact Awards. As a conference visitor and speaker, I visit and use this site regularly (you can find my speaker profile here) and am really excited for this [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F03%2Fjoind-in-nominated-for-an-impact-award%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F03%2Fjoind-in-nominated-for-an-impact-award%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>The community site <a href="http://joind.in" target="_blank">joind.in</a> is the definitive community event tracker, and it&#8217;s entirely open source! Today I learned that the site <a href="https://joind.in/blog/view/30" target="_blank">has been nominated</a> for the <a href="http://www.phparch.com/impact-awards/" target="_blank">2012 Impact Awards</a>. As a conference visitor and speaker, I visit and use this site regularly (you can find my <a href="https://joind.in/user/view/13883" title="Michiel Rook on joind.in" target="_blank">speaker profile here</a>) and am really excited for this nomination!</p>
<p>Please vote <a href="http://www.phparch.com/impact-awards/vote" target="_blank">here</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2012/03/joind-in-nominated-for-an-impact-award/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phing development update</title>
		<link>http://www.touchdownconsulting.nl/2012/03/phing-development-update/</link>
		<comments>http://www.touchdownconsulting.nl/2012/03/phing-development-update/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 11:11:42 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=186</guid>
		<description><![CDATA[Starting today, I&#8217;ll post regular updates on the development of Phing (which is, as you might know, a PHP build tool based on / inspired by Apache Ant). For the past three years I&#8217;ve been the lead developer on this open source project, and thus responsible for deciding the direction of the project, integrating the [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F03%2Fphing-development-update%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F03%2Fphing-development-update%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Starting today, I&#8217;ll post regular updates on the development of <a title="Phing" href="http://www.phing.info" target="_blank">Phing</a> (which is, as you might know, a PHP build tool based on / inspired by Apache Ant).</p>
<p>For the past three years I&#8217;ve been the lead developer on this open source project, and thus responsible for deciding the direction of the project, integrating the various contributions, publishing releases, etc. Should you be interested, <a href="http://www.lornajane.net">Lorna Jane Mitchell</a> published an <a href="http://www.lornajane.net/posts/2012/thoughts-on-running-an-open-source-project" target="_blank">excellent post</a> detailing some of the challenges faced by open source project leads.</p>
<p>The last few months have been especially interesting, as I&#8217;ve moved the Phing source code to <a href="http://github.com/phingofficial/phing">GitHub</a>. This has greatly improved the number of contributions and in general speeded up the development of Phing.</p>
<p>Let&#8217;s discuss some of the interesting commits that were made during the past two months!</p>
<h3>Try/Catch task</h3>
<p>A feature that has been requested before (and has been on my personal wishlist) is the ability to run task(s) whenever a task fails (very similar to PHP&#8217;s<a href="http://php.net/manual/en/language.exceptions.php"> try/catch</a> statement). During <a href="www.slideshare.net/michieltcs/building-and-deploying-php-applications-with-phing">my talk at the PHPUK2012 conference</a>, one of the attendees asked when this feature could be expected. So, while waiting for my flight home I decided to get busy and add the <em>trycatch</em> task.</p>
<pre>
<pre class="brush: xml; title: ; notranslate">
&lt;trycatch property=&quot;prop.testTryCatchFinally&quot;&gt;
	&lt;try&gt;
		&lt;fail&gt;Tada!&lt;/fail&gt;
	&lt;/try&gt;

	&lt;catch&gt;
		&lt;echo&gt;In &amp;lt;catch&amp;gt;.&lt;/echo&gt;
	&lt;/catch&gt;

	&lt;finally&gt;
		&lt;echo&gt;In &amp;lt;finally&amp;gt;.&lt;/echo&gt;
	&lt;/finally&gt;
&lt;/trycatch&gt;
</pre>
</pre>
<h3>Parallel task</h3>
<p>After a very interesting <a title="PHP in the dark" href="www.slideshare.net/jkeppens/phpbenelux-2012-php-in-the-dark" target="_blank">talk </a>by Jeroen Keppens (<a href="http://twitter.com/jkeppens" target="_blank">@jkeppens</a>) during this year&#8217;s PHP Benelux conference, Mike van Riel (<a href="http://twitter.com/mvriel" target="_blank">@mvriel</a>), the author of DocBlox, and me set out to enable some form of parallel processing in both Phing and Docblox. Mike authored a generic <a href="https://github.com/docblox/Parallel" target="_blank">library</a>, which I used in the new <em>parallel</em> task. This task is still very experimental (and it only works on Linux due to some OS limitations), but it&#8217;s definitely a nice example of how the community works and inspires!</p>
<pre>
<pre class="brush: xml; title: ; notranslate">
&lt;parallel threadCount=&quot;100&quot;&gt;
	&lt;echo&gt;Job 1&lt;/echo&gt;
	&lt;echo&gt;Job 2&lt;/echo&gt;
	&lt;echo&gt;Job 3&lt;/echo&gt;
	&lt;echo&gt;Job 4&lt;/echo&gt;
	&lt;echo&gt;Job 5&lt;/echo&gt;
	&lt;echo&gt;Job 6&lt;/echo&gt;
	&lt;echo&gt;Job 7&lt;/echo&gt;
	&lt;echo&gt;Job 8&lt;/echo&gt;
	&lt;echo&gt;Job 9&lt;/echo&gt;
	&lt;echo&gt;Job 10&lt;/echo&gt;
	&lt;echo&gt;Job 11&lt;/echo&gt;
	&lt;echo&gt;Job 12&lt;/echo&gt;
	&lt;echo&gt;Job 13&lt;/echo&gt;
	&lt;echo&gt;Job 14&lt;/echo&gt;
	&lt;echo&gt;Job 15&lt;/echo&gt;
	&lt;echo&gt;Job 16&lt;/echo&gt;
&lt;/parallel&gt;
</pre>
</pre>
<h3>Liquibase</h3>
<p>Together with Stephan Hochdörfer (<a href="http://twitter.com/shochdoerfer" target="_blank">@shochdoerfer</a>) I&#8217;ve been working on integrating his <a title="Liquibase" href="http://www.liquibase.org/" target="_blank">Liquibase</a> (a Java database refactoring / change management application) tasks into the Phing core. The liquibase tasks will complement the dbdeploy task and assist the user with database changes / rollbacks.</p>
<h3>ApiGen</h3>
<p>ApiGen is a Nette framework based documentation generation tool for PHP 5.3. Phing now supports this tool through the new <em>apigen</em> task, contributed by Jaroslav Hanslík.</p>
<h3>RNG schema updates</h3>
<p>For a while now, Phing ships with a RNG schema to validate your build files. However, this schema was incomplete and did not contain some of the more recent tasks and changes. Johan Persson has done some invaluable work to get the RNG schema up to date.</p>
<h3>Various (bug)fixes, the 2.4.10 release</h3>
<p>Steady progress has been made towards the 2.4.10 version (which is scheduled to be released early April). Below is an overview of the tickets that have been closed so far:</p>
<table>
<tbody>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/519">#519</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/519">Extend mail task to include attachments</a></td>
<td><a title="2012-02-28T16:04:30+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-28T16%3A04%3A30%2B01%3A00&amp;precision=second">5 days</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/334">#334</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/334">Run a task on BuildException</a></td>
<td><a title="2012-02-27T14:37:58+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-27T14%3A37%3A58%2B01%3A00&amp;precision=second">6 days</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/849">#849</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/849">Symfony 2 Console Task</a></td>
<td><a title="2012-02-18T16:18:35+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-18T16%3A18%3A35%2B01%3A00&amp;precision=second">2 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/835">#835</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/835">JSL-Check faulty</a></td>
<td><a title="2012-02-18T16:03:46+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-18T16%3A03%3A46%2B01%3A00&amp;precision=second">2 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/850">#850</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/850">Typo in documentation &#8211; required attributes for project</a></td>
<td><a title="2012-02-09T16:39:03+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-09T16%3A39%3A03%2B01%3A00&amp;precision=second">3 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/853">#853</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/853">PHP Error with HttpGetTask</a></td>
<td><a title="2012-02-09T15:29:28+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-09T15%3A29%3A28%2B01%3A00&amp;precision=second">3 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/671">#671</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/671">fix CvsTask documentation</a></td>
<td><a title="2012-02-07T15:46:31+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-07T15%3A46%3A31%2B01%3A00&amp;precision=second">4 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/852">#852</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/852">Several minor errors in documentation of core tasks</a></td>
<td><a title="2012-02-07T15:45:31+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-07T15%3A45%3A31%2B01%3A00&amp;precision=second">4 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/851">#851</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/851">RNG grammar hasn&#8217;t been updated to current version</a></td>
<td><a title="2012-02-07T15:31:41+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-02-07T15%3A31%3A41%2B01%3A00&amp;precision=second">4 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/790">#790</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/790">Make it easy to add new inherited types to phing: Use addFileset instead of createFileset</a></td>
<td><a title="2012-01-30T23:17:48+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-01-30T23%3A17%3A48%2B01%3A00&amp;precision=second">5 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/847">#847</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/847">Add support for RNG grammar in task XmlLint</a></td>
<td><a title="2012-01-30T12:24:26+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-01-30T12%3A24%3A26%2B01%3A00&amp;precision=second">5 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/846">#846</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/846">RNG grammar is wrong for task &#8216;foreach&#8217;</a></td>
<td><a title="2012-01-30T12:24:26+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-01-30T12%3A24%3A26%2B01%3A00&amp;precision=second">5 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/833">#833</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/833">Exec task args with special characters cannot be escaped</a></td>
<td><a title="2012-01-29T16:07:25+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-01-29T16%3A07%3A25%2B01%3A00&amp;precision=second">5 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/587">#587</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/587">More detailed backtrace in debug mode (patch)</a></td>
<td><a title="2012-01-29T16:07:25+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-01-29T16%3A07%3A25%2B01%3A00&amp;precision=second">5 weeks</a></td>
</tr>
<tr>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/834">#834</a></td>
<td><a title="View ticket" href="http://www.phing.info/trac/ticket/834">ExecTask documentation has incorrect escape attribute default value</a></td>
<td><a title="2012-01-29T15:09:57+01:00 in Timeline" href="http://www.phing.info/trac/timeline?from=2012-01-29T15%3A09%3A57%2B01%3A00&amp;precision=second">5 weeks</a></td>
</tr>
</tbody>
</table>
<p><br/><br />
Besides those commits, a good amount of other (small) fixes and contributions will make it into 2.4.10. A complete list of commits can be found <a href="https://github.com/phingofficial/phing/commits/master">here</a>. Keep those pull requests coming! <img src='http://www.touchdownconsulting.nl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2012/03/phing-development-update/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Building and deploying PHP applications with Phing (PHPUK2012)</title>
		<link>http://www.touchdownconsulting.nl/2012/02/175/</link>
		<comments>http://www.touchdownconsulting.nl/2012/02/175/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 14:19:16 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[building]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpuk2012]]></category>
		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=175</guid>
		<description><![CDATA[Below are the slides of my Phing talk I gave at the PHP UK Conference 2012. Also, some of the examples discussed during the talk can be found here. Building and deploying PHP applications with Phing View more presentations from Michiel Rook]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F02%2F175%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2012%2F02%2F175%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Below are the slides of my Phing talk I gave at the <a href="http://www.phpconference.co.uk/" target="_blank">PHP UK Conference 2012</a>.</p>
<p>Also, some of the examples discussed during the talk can be found <a href="http://www.touchdownconsulting.nl/conferences/phing-phpuk2012-examples.tgz">here</a>.</p>
<div style="width:425px" id="__ss_11755071"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/michieltcs/building-and-deploying-php-applications-with-phing" title="Building and deploying PHP applications with Phing" target="_blank">Building and deploying PHP applications with Phing</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/11755071" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/michieltcs" target="_blank">Michiel Rook</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2012/02/175/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deploying PHP applications with Phing (PHPNW11)</title>
		<link>http://www.touchdownconsulting.nl/2011/10/deploying-php-applications-with-phing-phpnw11/</link>
		<comments>http://www.touchdownconsulting.nl/2011/10/deploying-php-applications-with-phing-phpnw11/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 09:49:25 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[phpnw11]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=184</guid>
		<description><![CDATA[Below are the slides of the Phing talk I gave during the PHPNW11 conference. Deploying PHP applications with Phing View more presentations from Michiel Rook]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F10%2Fdeploying-php-applications-with-phing-phpnw11%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F10%2Fdeploying-php-applications-with-phing-phpnw11%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Below are the slides of the Phing talk I gave during the <a href="http://conference.phpnw.org.uk/phpnw11/" title="PHPNW11" target="_blank">PHPNW11</a> conference.</p>
<div style="width:425px" id="__ss_9626546"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/michieltcs/deploying-php-applications-with-phing" title="Deploying PHP applications with Phing" target="_blank">Deploying PHP applications with Phing</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9626546" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/michieltcs" target="_blank">Michiel Rook</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2011/10/deploying-php-applications-with-phing-phpnw11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Certified Engineer!</title>
		<link>http://www.touchdownconsulting.nl/2011/08/zend-certified-engineer/</link>
		<comments>http://www.touchdownconsulting.nl/2011/08/zend-certified-engineer/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 08:27:43 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[exam]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zce]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=159</guid>
		<description><![CDATA[Finally got around to doing the ZCE (http://www.zend.com/services/certification/) exam yesterday, and I passed! Click the logo below to see my certification details.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F08%2Fzend-certified-engineer%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F08%2Fzend-certified-engineer%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Finally got around to doing the ZCE (http://www.zend.com/services/certification/) exam yesterday, and I passed! Click the logo below to see my certification details.</p>
<p><a href="http://www.zend.com/en/store/education/certification/yellow-pages.php#show-ClientCandidateID=ZEND017376"><img src="http://www.zend.com/topics/zce-php5-3-logo.gif" alt="Zend Certified Engineer (ZCE) - PHP 5.3"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2011/08/zend-certified-engineer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phing &#8211; a PHP Build Tool (presentation)</title>
		<link>http://www.touchdownconsulting.nl/2011/08/phing-a-php-build-tool-presentation/</link>
		<comments>http://www.touchdownconsulting.nl/2011/08/phing-a-php-build-tool-presentation/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 06:48:37 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[dpc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[slideshare]]></category>
		<category><![CDATA[uncon]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=152</guid>
		<description><![CDATA[Below are the slides of a presentation on Phing I gave at this year&#8217;s Dutch PHP Conference.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F08%2Fphing-a-php-build-tool-presentation%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F08%2Fphing-a-php-build-tool-presentation%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Below are the slides of a presentation on Phing I gave at this year&#8217;s <a href="http://www.phpconference.nl/" target="_blank">Dutch PHP Conference</a>.</p>
<div style='width:670px;text-align:left'><object style='margin:0px' width='425' height='355'><param name='movie' value='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=phingdpcunconslideshare-110522045919-phpapp01&#038;stripped_title=phing-dpc-uncon-slideshare' /><param name='allowFullScreen' value='true'/><param name='allowScriptAccess' value='always'/><embed src='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=phingdpcunconslideshare-110522045919-phpapp01&#038;stripped_title=phing-dpc-uncon-slideshare' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='670' height='355'></embed></object></div>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2011/08/phing-a-php-build-tool-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building and deploying Java WebSphere applications with Jenkins CI</title>
		<link>http://www.touchdownconsulting.nl/2011/03/building-and-deploying-websphere-applications-with-jenkins-ci/</link>
		<comments>http://www.touchdownconsulting.nl/2011/03/building-and-deploying-websphere-applications-with-jenkins-ci/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 15:00:23 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Main]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jenkins]]></category>
		<category><![CDATA[websphere]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=78</guid>
		<description><![CDATA[Jenkins CI (the new name of Hudson) is a very popular continuous integration system. It can be used to monitor the execution of various jobs, including but not limited to compilation, packaging, testing and deploying of software. Also, it is very easy to configure and comes with a great set of (3rd party) plugins. I [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F03%2Fbuilding-and-deploying-websphere-applications-with-jenkins-ci%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F03%2Fbuilding-and-deploying-websphere-applications-with-jenkins-ci%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a title="Jenkins CI" href="http://jenkins-ci.org/" target="_blank">Jenkins CI</a> (the new name of Hudson) is a very popular continuous integration system. It can be used to monitor the execution of various jobs, including but not limited to compilation, packaging, testing and deploying of software. Also, it is very easy to configure and comes with a great set of (3rd party) plugins.<br />
I use Jenkins in a number of ways: to monitor and prepare &amp; test new releases of <a title="Phing" href="http://www.phing.info/" target="_blank">Phing</a>, monitor various internal processes (such as backup logs), and build and deploy various other projects that I work on.</p>
<p>In this post I will expand on some of the techniques discussed in an earlier <a title="Enhance continuous integration using Rational Application Developer and the Hudson build server" href="http://www.ibm.com/developerworks/rational/library/10/enhancecontinuousintegrationwiththerationalapplicationdeveloperbuildutility/" target="_blank">IBM developerWorks article</a>, to (automatically) build and deploy Java J2EE applications to a WebSphere server. The code fragments listed below are contained in a downloadable archive that you&#8217;ll be able to download at the end of this post.</p>
<h3>Requirements</h3>
<p>To get started, you&#8217;ll need to have installed:</p>
<ul>
<li>Jenkins CI with the following plugins (can be installed via &#8220;Manage Jenkins&#8221; -> &#8220;Manage Plugins&#8221;):
<ul>
<li>Copy Artifact</li>
<li>Blame Subversion</li>
<li>Parameterized Trigger</li>
<li>RAD Builder</li>
</ul>
</li>
<li><a title="Ant Contrib" href="http://ant-contrib.sourceforge.net/" target="_blank">Ant Contrib</a></li>
<li>IBM Rational Application Developer</li>
<li>A test/staging installation of the WebSphere Application Server</li>
</ul>
<p>This post assumes you have some knowledge of Ant, and are able to install Jenkins and IBM RAD.</p>
<h3>Job configuration</h3>
<p>For this particular case we will configure two Jenkins CI jobs: one job will build number of artifacts (in this case, .ear files) from source code contained in a version control repository, and another job will deploy the generated artifacts to a WebSphere server. This deployment job will be triggered when the build job completes (successfully).</p>
<div id="attachment_91" class="wp-caption alignnone" style="width: 650px"><a href="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Dashboard-Jenkins_1299666081192.png" rel="lightbox[78]"><img class="size-large wp-image-91" title="Jenkins CI Dashboard" src="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Dashboard-Jenkins_1299666081192-640x380.png" alt="Jenkins CI Dashboard" width="640" height="380" /></a><p class="wp-caption-text">Jenkins CI Dashboard</p></div>
<h3>Build job</h3>
<p>Create a new &#8220;free-style&#8221; job, and configure it as you normally would. Make sure you check out the source code to the <em>src</em> directory, within the job workspace.</p>
<div id="attachment_131" class="wp-caption alignnone" style="width: 650px"><a href="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Build-part0.png" rel="lightbox[78]"><img class="size-large wp-image-131" title="Build Job - SVN config" src="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Build-part0-640x154.png" alt="Build Job - SVN config" width="640" height="154" /></a><p class="wp-caption-text">Build Job - SVN config</p></div>
<p>Then, click &#8220;Add build step&#8221;, and select the IBM RAD plugin. The field &#8220;build file&#8221; should contain the path to the build file we will use (<em>Builder\build.xml</em> in the archive). The field &#8220;RAD workspace&#8221; points to a directory (within the job&#8217;s workspace) where a RAD workspace will be created, in this case (see the build file below) we use the path &#8220;rad-workspace&#8221;. The other settings can be left at their default values.</p>
<div id="attachment_132" class="wp-caption alignnone" style="width: 650px"><a href="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Build-part1.png" rel="lightbox[78]"><img class="size-large wp-image-132" title="Build Job - RAD builder" src="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Build-part1-640x223.png" alt="Build Job - RAD builder" width="640" height="223" /></a><p class="wp-caption-text">Build Job - RAD builder</p></div>
<h3>Build file</h3>
<p>The Jenkis RAD builder plugins creates a fresh workspace, similar to the workspace that is used inside RAD (or Eclipse). To prepare this workspace with the right configuration settings, we use the task <a href="http://publib.boulder.ibm.com/infocenter/radhelp/v7r5/topic/com.ibm.etools.ant.tasks.doc/topics/tantworkspacepreferencefile.html" target="_blank">workspacePreferenceFile</a>. The input for this task is a simple preferences file, either text format (key=value pairs, see sample), or the Eclipse .epf format.</p>
<pre>
<pre class="brush: plain; title: ; notranslate">
compiler.compliance=1.5
compiler.source=1.5
classpath.SOMELIBRARY=D:\Development\somelibrary.jar
</pre>
</pre>
<p>The task <em>workspacePreferenceFile</em> is then called in the <em>setup-workspace</em> target.</p>
<pre>
<pre class="brush: xml; title: ; notranslate">
&lt;target name=&quot;setup-workspace&quot;
	description=&quot;Sets the preferences for the current workspace&quot;&gt;

	&lt;!-- Debug information --&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;rad.preferences.filename=${rad.preferences.filename}&quot;/&gt;

	&lt;!-- Set the workspace preferences --&gt;
	&lt;workspacePreferenceFile
		PreferenceFileName=&quot;${rad.preferences.filename}&quot;
		useEclipsePrefs=&quot;false&quot;
		overwrite=&quot;true&quot;/&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;workspacePreferenceFile done&quot;/&gt;
&lt;/target&gt;
</pre>
</pre>
<p>Next, the code that has previously been checked out by Jenkins will need to be copied to this new workspace. The properties <em>copy.from.path</em> and <em>copy.excludes</em> (optional, comma-separated list of excluded patterns) are set in the IBM RAD builder configuration (build job).</p>
<pre>
<pre class="brush: xml; title: ; notranslate">
&lt;target name=&quot;copy-projects&quot;
description=&quot;Copies the content of a folder to the current workspace&quot;&gt;

	&lt;!-- Debug information --&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;copy.from.path=${copy.from.path}&quot;/&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;workspace=${workspace}&quot;/&gt;

	&lt;copy
		todir=&quot;${workspace}&quot;
		includeEmptyDirs=&quot;true&quot;&gt;
		&lt;fileset dir=&quot;${copy.from.path}&quot; excludes=&quot;${copy.excludes}&quot;&gt;
			&lt;include name=&quot;**/**&quot;/&gt;
		&lt;/fileset&gt;
	&lt;/copy&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;copy done&quot;/&gt;
&lt;/target&gt;
</pre>
</pre>
<p>Now that the workspace is configured and contains the projects we&#8217;d like to build, it&#8217;s time to make RAD aware of the contents by actively importing each project &#8211; this is done by calling the <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.etools.j2eeapp.doc/topics/tantprojectimport.html" target="_blank">projectImport</a> task. The list of projects is generated by scanning the workspace for directories that contain a <em>.project</em> file.</p>
<pre>
<pre class="brush: xml; title: ; notranslate">
&lt;target name=&quot;import-projects&quot;
	description=&quot;Imports a set of projects into the current workspace&quot;&gt;

	&lt;!-- Retrieve list of projects (folders containing a .project file) --&gt;
	&lt;dirset id=&quot;projects.list&quot; dir=&quot;${workspace}&quot;&gt;
		&lt;include name=&quot;*&quot;/&gt;
		&lt;present targetdir=&quot;${workspace}&quot;&gt;
			&lt;mapper type=&quot;glob&quot; from=&quot;*&quot; to=&quot;*/.project&quot; /&gt;
		&lt;/present&gt;
	&lt;/dirset&gt;
	&lt;pathconvert property=&quot;projects.name&quot; refid=&quot;projects.list&quot; pathsep=&quot;,&quot;&gt;
		&lt;map from=&quot;${workspace}&quot; to=&quot;&quot;/&gt;
	&lt;/pathconvert&gt;

	&lt;!-- Debug information --&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;projects.name=${projects.name}&quot;/&gt;

	&lt;!-- Import the projects --&gt;
	&lt;foreach
		list=&quot;${projects.name}&quot;
		target=&quot;import-project&quot;
		param=&quot;project.name&quot;/&gt;
&lt;/target&gt;

&lt;target name=&quot;import-project&quot;&gt;
	&lt;!-- Debug information --&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;project.name=${project.name}&quot;/&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;workspace=${workspace}&quot;/&gt;

	&lt;projectImport
		projectName=&quot;${project.name}&quot;
		projectLocation=&quot;${workspace}/${project.name}&quot;/&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;projectImport ${project.name} done&quot;/&gt;
&lt;/target&gt;
</pre>
</pre>
<p>The most important part of the build file is the target <em>build-workspace</em>, which calls the task <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.etools.j2eeapp.doc/topics/tantworkspacebuild.html" target="_blank">workspaceBuild</a> to perform a full build. By default, this task will fail the build if any (compiler) errors are encountered &#8211; this is what we want.</p>
<pre>
<pre class="brush: xml; title: ; notranslate">
&lt;target name=&quot;build-workspace&quot;
	depends=&quot;setup-workspace,copy-projects,import-projects&quot;
	description=&quot;Builds the current workspace&quot;&gt;

	&lt;!-- Fully build the workspace --&gt;
	&lt;workspaceBuild
		BuildType=&quot;Full&quot;/&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;workspaceBuild done&quot;/&gt;
&lt;/target&gt;
</pre>
</pre>
<p>Hopefully, there are no errors, and we are in a situation where all the projects have been built successfully. Time to generate some artifacts!<br />
The target <em>export-ear</em> first updates the (generated) manifest file with a few Jenkins parameters, such as build number, SVN revision, job name, and the current date. This data is a useful (extra) aid to identify the version / origin of deployed code (please note that you can also use the fingerprinting functionality for this, see below).</p>
<p>We then call the <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.etools.j2eeapp.doc/topics/tanteare.html" target="_blank">earExport</a> task to create a .ear file, identical to choosing &#8220;Export&#8221; -> &#8220;EAR file&#8221; within RAD.</p>
<pre>
<pre class="brush: xml; title: ; notranslate">
&lt;target name=&quot;export-ear&quot;
	description=&quot;Exports the EAR defined by the ear.project.name/ear.filename properties&quot;&gt;

	&lt;property name=&quot;ear.filename&quot; value=&quot;${workspace}${ear.project.name}-${env.BUILD_NUMBER}-${env.BUILD_ID}.ear&quot;/&gt;

	&lt;!-- Update the manifest with Jenkins build info --&gt;
	&lt;echo&gt;Updating manifest&lt;/echo&gt;
	&lt;tstamp&gt;
		&lt;format property=&quot;TODAY&quot; pattern=&quot;yyyy-MM-dd HH:mm:ss&quot;/&gt;
	&lt;/tstamp&gt;
	&lt;manifest
		file=&quot;${workspace}${ear.project.name}/META-INF/MANIFEST.MF&quot;
		mode=&quot;update&quot;&gt;
		&lt;attribute name=&quot;Built-By&quot; value=&quot;Jenkins CI&quot;/&gt;
		&lt;attribute name=&quot;Implementation-Version&quot; value=&quot;#${env.BUILD_NUMBER} - r${env.SVN_REVISION} - ${env.BUILD_ID}&quot;/&gt;
		&lt;attribute name=&quot;Implementation-Title&quot; value=&quot;${env.JOB_NAME}&quot;/&gt;
		&lt;attribute name=&quot;Built-Date&quot; value=&quot;${TODAY}&quot;/&gt;
	&lt;/manifest&gt;

	&lt;!-- Debug information --&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;ear.filename=${ear.filename}&quot;/&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;ear.project.name=${ear.project.name}&quot;/&gt;

	&lt;!-- Export the EAR project as an EAR file --&gt;
	&lt;earExport
		EARProjectName=&quot;${ear.project.name}&quot;
		EARExportFile=&quot;${ear.filename}&quot;
		ExportSource=&quot;false&quot;
		IncludeProjectMetaFiles=&quot;false&quot;
		Overwrite=&quot;true&quot;/&gt;
	&lt;echo level=&quot;verbose&quot; message=&quot;earExport ${ear.filename} done&quot;/&gt;
&lt;/target&gt;
</pre>
</pre>
<p>When the RAD builder finishes succesfully, the build part of the job is completed and a number of artifacts (.ear files) will have been generated.</p>
<div id="attachment_125" class="wp-caption alignnone" style="width: 650px"><a href="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Build-part2.png" rel="lightbox[78]"><img class="size-large wp-image-125" title="Build job - post-build actions" src="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Build-part2-640x283.png" alt="Build job - post-build actions" width="640" height="283" /></a><p class="wp-caption-text">Build job - post-build actions</p></div>
<p>In the post-build actions we make sure the generated artifacts are scooped up and archived. This makes sure that artifacts are kept even if the original build was (re)moved. Additionally, we enable the recording of fingerprints on each artifact. In essence, this will calculate and store a hash value (MD5 or similar) based on the contents of each file. Should we need to identify a particular artifact at some point in the future, we can simply upload that file to Jenkins, let it calculate a hash value, and match that hash value against its internal fingerprint database. If there&#8217;s a match, Jenkins will tell us the job name, build number, date, and any other useful information.</p>
<p>Finally, we call the deploy job using the parameterized trigger plugin. In this case, we do not override any of the default parameters (see below). Should you want to, click &#8220;Add parameter&#8221;, then &#8220;Predefined parameters&#8221;. Enter the parameters (key=value pairs) in the text area.</p>
<p><strong>Deploy job</strong></p>
<p>As stated before, the deployment job copies generated artifacts from the build job, and installs the artifacts on a (test/staging) WebSphere server. To achieve this, the job calls the <a href="http://publib.boulder.ibm.com/infocenter/wbihelp/v6rxmx/index.jsp?topic=%2Fcom.ibm.wasee.doc%2Finfo%2Fee%2Fjavadoc%2Fee%2Fcom%2Fibm%2Fwebsphere%2Fant%2Ftasks%2FWsAdmin.html" target="_blank">wsadmin</a> tool and executes a single JACL script.</p>
<p>An important part of this job are the predefined parameters, telling the JACL script which SOAP connection to use, and which node / cell / server name / virtual host to install the application to. In this case, each of these parameters has a default value &#8211; pointing to a default (local) testing server.</p>
<div id="attachment_128" class="wp-caption alignnone" style="width: 650px"><a href="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Deploy-Config-part1.png" rel="lightbox[78]"><img class="size-large wp-image-128" title="Deploy Job - Build parameters" src="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Deploy-Config-part1-640x1203.png" alt="Deploy Job - Build parameters" width="640" height="1203" /></a><p class="wp-caption-text">Deploy Job - Build parameters</p></div>
<p>The build phase of the job consists of three separate build steps:</p>
<ul>
<li>Remove any artifacts that were left by previous builds</li>
<li>Copy the artifacts generated by the last successful run of the build job</li>
<li>Execute <a href="http://publib.boulder.ibm.com/infocenter/wsdoc400/v6r0/index.jsp?topic=/com.ibm.websphere.iseries.doc/info/ae/ae/rovr_antcmd.html" target="_blank">ws_ant</a> (Ant with WebSphere functionality/classes preloaded), which in turn uses <em>wsadmin</em> to run a <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/cxml_jacl.html" target="_blank">JACL</a> script.</li>
</ul>
<div id="attachment_127" class="wp-caption alignnone" style="width: 650px"><a href="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Deploy-Config-part2.png" rel="lightbox[78]"><img class="size-large wp-image-127" title="Deploy Job - Build steps" src="http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/Example-Websphere-Deploy-Config-part2-640x567.png" alt="Deploy Job - Build steps" width="640" height="567" /></a><p class="wp-caption-text">Deploy Job - Build steps</p></div>
<p>The JACL script has two modes of operation. First, it stops and uninstalls the previous version of the application we are trying to install. Errors that occur during this first part are ignored.</p>
<pre class="brush: plain; title: ; notranslate">
set appManager [$AdminControl queryNames cell=$cell,node=$node,type=ApplicationManager,process=$server,*]

catch { $AdminControl invoke $appManager stopApplication $appname } result

$AdminConfig save

$AdminApp uninstall $appname

$AdminConfig save
</pre>
<p>In the second part of the script, the application is installed on the specified node/cell/server/virtual host. Then, after giving the application server some time to process the installed artifact, the script starts the application. If this completes without errors the application is ready to use!</p>
<pre>
<pre class="brush: plain; title: ; notranslate">
$AdminApp install &quot;$workspace/$earfile&quot; &quot;-node $node -cell $cell -server $server -verbose -defaultbinding.virtual.host $vhost -usedefaultbindings&quot;

$AdminConfig save

set ready false
set retries 0

while {$retries &lt; 20} {
	incr retries
	set ready [$AdminApp isAppReady $appname]
	puts &quot;AdminApp isAppReady: $ready ($retries)&quot;

	if {$ready} { break }

	sleepDelay 5
}

set appManager [$AdminControl queryNames node=$node,cell=$cell,type=ApplicationManager,process=$server,*]

$AdminControl invoke $appManager startApplication $appname

$AdminConfig save
</pre>
</pre>
<h3>Conclusion / thoughts</h3>
<p>In this post you&#8217;ve seen how to use Jenkins CI to build (through IBM RAD) and deploy (through IBM wsadmin) a J2EE application to a WebSphere server. I hope these exampless can serve as a starting point for your forays into the exciting world of Jenkins CI.</p>
<p>Comments and suggestions are very welcome!</p>
<h3>Downloads</h3>
<ul>
<li><a href='http://www.touchdownconsulting.nl/wp-content/uploads/2011/03/WebSphere.zip'>WebSphere Demo Files</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2011/03/building-and-deploying-websphere-applications-with-jenkins-ci/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(Semi-)automatic MODx migrations using Phing</title>
		<link>http://www.touchdownconsulting.nl/2010/03/semi-automatic-modx-migrations-using-phing/</link>
		<comments>http://www.touchdownconsulting.nl/2010/03/semi-automatic-modx-migrations-using-phing/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 20:07:11 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[modx migration phing]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=53</guid>
		<description><![CDATA[MODx is a very popular PHP/MySQL content management system &#8211; no surprise when you look at its flexibility, light weight and ease of use. However, as any MODx developer will attest, it is not without its quirks. One of those problems is the lack of (automated) support for maintaining separate development and staging or production [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2010%2F03%2Fsemi-automatic-modx-migrations-using-phing%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2010%2F03%2Fsemi-automatic-modx-migrations-using-phing%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>MODx is a very popular PHP/MySQL content management system &#8211; no surprise when you look at its flexibility, light weight and ease of use. However, as any MODx developer will attest, it is not without its quirks.</p>
<p>One of those problems is the lack of (automated) support for maintaining separate development and staging or production environments, and migrations between those environments. MODx saves content, templates and code snippets in its database, without versioning. Even though the Revolution branch (MODx <a href="http://modxcms.com/about/blog/jgilmore/modx-revolution-rc1-out.html" target="_blank">has recently launched</a> the first release candidate) aims to solve this by introducing the <a href="http://svn.modxcms.com/docs/display/revolution/Transport+Packages" target="_blank">Transport Package concept</a>, many developers will still need to support installations that run on MODx Evolution.</p>
<p>The code featured in this blog post is a mix of a <a href="http://www.phing.info" target="_blank">Phing</a> task that is executed on the development machine, and a small script that is uploaded to the staging or production machine. The task uses the MODx manager log to detect the changes made since a particular date. It then tries to match those changes to the database on the staging/production machines, and collates the changes to a SQL file.</p>
<p>In my case, I usually can&#8217;t access a production database from my development machine &#8211; this is where the <em>updserver</em> script comes in. It returns mysqldump-style output to the Phing task, and should be uploaded to your staging / production machine and installed in the same directory MODx resides in.</p>
<p>The syntax of the task call in the build file is as follows:</p>
<blockquote>
<pre>&lt;?xml version="1.0"?&gt;
&lt;project name="MODx update" default="update"&gt;
        &lt;target name="update"&gt;
            &lt;taskdef name="modxchanged" classname="ModxChangedTask"/&gt;
            &lt;modxchanged
                hostname="localhost" username="root"
                password="test123" database="modx123"
                remoteurl="http://localhost/modx/" remotekey="test123"
                prefix="" timestamp="${timestamp}"/&gt;
        &lt;/target&gt;
&lt;/project&gt;</pre>
</blockquote>
<p>In this example, MODx is installed on localhost/modx/. The remote key is the same as the remote database password.</p>
<p>Running the task should result in an SQL file that can be executed on the staging/production machine, and output similar to the following:</p>
<blockquote>
<pre>MODx update &gt; update:</pre>
<pre>Searching changes from 1970-01-01:</pre>
<pre>===== Templates =======================================</pre>
<pre>NONE</pre>
<pre>===== Documents =======================================</pre>
<pre>[ 10] Test                          2010-03-24 19:58:41 [NEW]</pre>
<pre>===== Chunks ==========================================</pre>
<pre>NONE</pre>
<pre>===== Snippets ========================================</pre>
<pre>NONE</pre>
<pre>BUILD FINISHED</pre>
</blockquote>
<p>The code in this post is very much a work-in-progress, so there are a few caveats / unimplemented features:</p>
<ul>
<li>Does not correctly handle conflicting/shared id&#8217;s</li>
<li>Does not process deleted items</li>
<li>Checking (and manually adjusting) the generated SQL file is always a good idea</li>
</ul>
<p>Any comments or questions are highly appreciated! You can also e-mail me directly at info AT touchdownconsulting.nl!</p>
<p><a href="/files/modx-migration-286.tgz">DOWNLOAD</a> (modx-migration-286.tgz)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2010/03/semi-automatic-modx-migrations-using-phing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

