<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Chris Read &#187; Build</title>
	<atom:link href="http://blog.chris-read.net/category/software/build/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chris-read.net</link>
	<description>He's just this guy, you know...</description>
	<lastBuildDate>Tue, 13 Sep 2011 11:41:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.chris-read.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Chris Read &#187; Build</title>
		<link>http://blog.chris-read.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.chris-read.net/osd.xml" title="Chris Read" />
	<atom:link rel='hub' href='http://blog.chris-read.net/?pushpress=hub'/>
		<item>
		<title>Vote for XFD in the Ultimate Wallboard Challenge</title>
		<link>http://blog.chris-read.net/2010/11/23/vote-for-xfd-in-the-ultimate-wallboard-challenge/</link>
		<comments>http://blog.chris-read.net/2010/11/23/vote-for-xfd-in-the-ultimate-wallboard-challenge/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 10:30:08 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[ci]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=161</guid>
		<description><![CDATA[Julian Simpson, aka The Build Doctor, has been working away at a nice web based Build Status Monitor called XFD for a while now. One of my complaints for years has been that there&#8217;s no nice build status tool that&#8217;s easy to use, but I think he&#8217;s on to something. It&#8217;s entered in the Ultimate [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=161&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Julian Simpson, aka <a href="http://www.build-doctor.com" target="_blank">The Build Doctor</a>, has been working away at a nice web based Build Status Monitor called <a href="http://xfd.build-doctor.com" target="_blank">XFD</a> for a while now. One of my complaints for years has been that there&#8217;s no nice build status tool that&#8217;s easy to use, but I think he&#8217;s on to something.</p>
<p>It&#8217;s entered in the Ultimate Wallboard Challenge, and you can vote for it <a href="http://ultimatewallboard.com/entries#91343" target="_blank">here</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/161/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=161&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2010/11/23/vote-for-xfd-in-the-ultimate-wallboard-challenge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>The End of Buildix</title>
		<link>http://blog.chris-read.net/2009/12/16/the-end-of-buildix/</link>
		<comments>http://blog.chris-read.net/2009/12/16/the-end-of-buildix/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 15:23:24 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[ci]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=107</guid>
		<description><![CDATA[I&#8217;ve been putting off this post for a few months now, but I think the time has finally come to admit what I&#8217;m sure people who care have guessed for a while &#8211; active development on Buildix has stopped, and will probably not resume. The site will stay up for the foreseeable future, nothing will [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=107&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been putting off this post for a few months now, but I think the time has finally come to admit what I&#8217;m sure people who care have guessed for a while &#8211; active development on <a href="http://buildix.thoughtworks.com" target="_blank">Buildix</a> has stopped, and will probably not resume. The site will stay up for the foreseeable future, nothing will vanish, but nothing new will be added either.</p>
<p>We started the project because at the time, setting up a new Continuous Integration server was quite an arduous task. The only real option out there for a Java project was <a href="http://cruisecontrol.sf.net" target="_blank">CruiseControl</a>, and it could take a new developer days to get their first build through the system. Thankfully though this is no longer the case.</p>
<p>Since then the whole CI landscape has changed. Just having a single &#8220;build server&#8221; is now more the exception than the rule. It&#8217;s all about build farms these days using tools like <a href="http://www.thoughtworks-studios.com/cruise-release-management" target="_blank">Cruise</a>, <a href="http://hudson-ci.org/" target="_blank">Hudson</a> and <a href="http://www.jetbrains.com/teamcity/" target="_blank">TeamCity</a>. They integrate nicely with a variety of SCM&#8217;s and story tracking tools. Setting up a build environment with these tools is really easy now. I&#8217;d like to think that Buildix at least had something to do with helping people to see how easy it could be to get a CI environment up and running, and I know that at least in the case of Cruise this is true because I&#8217;ve been part of that team.</p>
<p>So &#8211; thank you to all of you who used Buildix and liked it and provided feedback. Thank you also to the current big players in the CI field who put effort into making sure that looking after your CI environment no longer needs to be a full time job for someone.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=107&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/12/16/the-end-of-buildix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Self Identifying Software</title>
		<link>http://blog.chris-read.net/2009/09/22/self-identifying-software/</link>
		<comments>http://blog.chris-read.net/2009/09/22/self-identifying-software/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 17:09:41 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Config Management]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Continuous Integration]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=91</guid>
		<description><![CDATA[How often has someone come up to you and asked you what build of your software is currently deployed in a specific environment? How many times have you come across a .jar or .dll file and wondered what version it is? Especially when using Open Source Software? The most frightening one for me is when [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=91&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>How often has someone come up to you and asked you what build of your software is currently deployed in a specific environment?</p>
<p>How many times have you come across a <em>.jar</em> or <em>.dll</em> file and wondered what version it is? Especially when using Open Source Software?</p>
<p>The most frightening one for me is when I&#8217;ve looked at a cluster of production servers and noticed that the <em>.war</em> file for the application deployed on it is a different size on one of the nodes. Which one was the correct one to deploy? Luckily this happened to me a long time ago, but I know that people out there are still having this problem today.</p>
<p>The solution is what I call <em>&#8220;Self Identifying Software&#8221;</em>. Every build of your software needs to have something that tells you what version it is and how to get back to the source code that created it. Having a build label or release number visible in your application is a good start, but it does not make your software <em>Self Identifying</em>. Product companies have been doing this for ever. The problem is that for that number to be useful (particularly when you&#8217;re trying to access the source code to reproduce and fix a bug) you then need to refer to a build system or release notes to find out where the source code came from (if you&#8217;re lucky). It often also does not apply to development builds. To be truly <em>Self Identifying</em> you need to make sure that <em><span style="text-decoration:underline;"><strong>every</strong></span></em> build (including builds developers create on their workstations) also includes enough information from the SCM system so that anyone who has access to the source code can go right back to the exact source code that produced that binary. For example, if you use Subversion as your SCM then this will be a URL and a revision number.</p>
<p>This is not exactly a new concept, it&#8217;s something I (and others) have been doing for a number of years now. The reason I&#8217;ve decided to write about it now though is that recently I was showing a new guy around one of the projects I&#8217;m working on at the moment, and when I showed him how to determine which version of the app was deployed he was delighted.<br />
<span id="more-91"></span></p>
<h2>How do I get my software to identify itself?</h2>
<p>There are generally two scenarios where I would want to get the identity of some software. The first is where I have a service or system running somewhere that I would like to know the version of, and the second is where I have a binary artefact and I&#8217;m trying to determine it&#8217;s provenance.</p>
<p>When querying a service, the easiest is to be able to hit a well known URL (or make a well known service call) that tells me what I need to know. What the exact URL or service call is is not important, as long as those who need it know how to invoke it. This is most useful then you don&#8217;t actually have access to the binaries that power the service.</p>
<p>However, if you do have access to the binaries then it&#8217;s usually easiest just to examine the meta data of the file to see where it came from. Most modern binary formats allow for this in some way. If you&#8217;re working with Java then all <em>.jar</em>, <em>.war</em> and <em>.ear</em> files allow you to put this into the <em>META-INF/MANIFEST.MF</em> file. Creative use of <em>versioninfo</em> resources will allow you to achieve similar results if you&#8217;re dealing with Windows. Note that we&#8217;re not talking about putting this information into the file name itself &#8211; file names change.</p>
<h2>How do I use it?</h2>
<p>Having <em>Self Identifying Software</em> goes beyond just being able to quickly track down the source code that built the binaries you&#8217;re dealing with. Here are a few other uses I&#8217;ve found:</p>
<ul>
<li>When used as part of a Continuous Deployment system you can verify that you&#8217;ve got the correct version of the binaries before you start deploying things, and you can then use the service call to verify that the correct version of the app is up and running at the end of the deployment processes.</li>
<li>When used as part of a dynamic system dashboard you can quickly and easily see what&#8217;s installed where instead of relying on spreadsheets or documents that often get forgotten.</li>
</ul>
<p>If you find any more, please let me know&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/91/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=91&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/09/22/self-identifying-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Podcast on Continuous Integration available</title>
		<link>http://blog.chris-read.net/2009/04/27/podcast-on-continuous-integration-available/</link>
		<comments>http://blog.chris-read.net/2009/04/27/podcast-on-continuous-integration-available/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 08:57:04 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[ci]]></category>
		<category><![CDATA[jaoo]]></category>
		<category><![CDATA[podcast]]></category>
		<category><![CDATA[talks]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=77</guid>
		<description><![CDATA[Last year at JAOO I had the chance to speak to Markus from Software Engineering Radio about the talk I gave there on Continuous Integration. It&#8217;s finally available now over here. The slides that go along with the talk are available from the JAOO site.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=77&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Last year at JAOO I had the chance to speak to Markus from <a href="http://se-radio.net" target="_blank">Software Engineering Radio</a> about the <a href="http://jaoo.dk/aarhus-2008/presentation/Continuous+Integration" target="_blank">talk</a> I gave there on Continuous Integration. It&#8217;s finally available now over <a href="http://se-radio.net/podcast/2009-04/episode-133-continuous-integration-chris-read" target="_blank">here</a>. The slides that go along with the talk are available from the <a href="http://jaoo.dk/aarhus-2008/file?path=/jaoo-aarhus-2008/slides/ChrisRead_ContinuousIntegration.pdf" target="_blank">JAOO</a> site.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=77&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/04/27/podcast-on-continuous-integration-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducing ESCAPE</title>
		<link>http://blog.chris-read.net/2009/02/13/introducing-escape/</link>
		<comments>http://blog.chris-read.net/2009/02/13/introducing-escape/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 12:31:12 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Build Pipelines]]></category>
		<category><![CDATA[Config Management]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=50</guid>
		<description><![CDATA[Whenever I talk to new clients about Continuous Integration, and especially about using Build Pipelines to extend their CI process to cover testing things like the deployment of their application, there is always one question that is guaranteed to pop up &#8211; how do I manage the configuration of my application in all these environments? [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=50&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Whenever I talk to new clients about Continuous Integration, and especially about using Build Pipelines to extend their CI process to cover testing things like the deployment of their application, there is always one question that is guaranteed to pop up &#8211; how do I manage the configuration of my application in all these environments?</p>
<p>This is always a hard one to answer. In the last place I worked as a System Administrator we used <a title="Split-Horizon DNS" href="http://en.wikipedia.org/wiki/Split-horizon_DNS" target="_blank">Split-Horizon DNS</a> as one of the ways to solve connecting to the correct host for a service. Our applications had hard coded hostnames for key services such as <em>db.internal.domain</em>, <em>loghost.internal.domain</em> and <em>mailhost.internal.domain</em>. Depending on which environment they ran in, when the did a DNS lookup they would get an answer that pointed them to the correct server providing that service for the environment they were physically running in. Combine this with tools like an LDAP Server in each of these environments containing the rest of the system configuration and life is easy. Or is it?</p>
<p>DNS and LDAP servers are relatively straight forward for experienced Sys Admins to understand and maintain, but they still can&#8217;t be described as easy to use, which is probably why so few people do it. This limits our options for fixing things down to two general categories &#8211; fix DNS and LDAP admin tools so they are easy to use, or find another way to solve the problem.</p>
<p>We chose the path of least resistance and went for the second option &#8211; creating <a href="http://code.google.com/p/escservesconfig/" target="_blank">ESCAPE</a>. In the Unix tradition, it&#8217;s an app that takes one problem and solves it simply and well (at least in our opinion). It provides a RESTful interface for both the setting and getting of environment configuration. <tt>GET</tt> requests will retrieve configuration, whereas <tt>POST/PUT</tt> requests will create new entries or update them.</p>
<p>The URL scheme we&#8217;ve decided on is most easily demonstrated by constructing an example URL:</p>
<table border="0">
<tbody>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><strong>URL</strong></td>
<td style="border:1px solid #aaaaaa;padding:5px;"><strong>Value returned in the body</strong></td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">User interface. No API available here.</td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/environments/</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">A JSON list of all the available environment.</td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/environments/production/</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">A JSON list of all the applications in the &#8220;production&#8221; environment.</td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/environments/production/mywebapp</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">All keys and values for the &#8220;mywebapp&#8221; application in the &#8220;production&#8221; environment.e.g:<br />
key1=value1<br />
key2=value2</td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/environments/production/mywebapp/thiskey</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">The value of &#8220;thiskey&#8221; for the &#8220;mywebapp&#8221; application in the &#8220;production&#8221; environment.</td>
</tr>
</tbody>
</table>
<p>As the tool is now usable we&#8217;ve happily released version 0.1. Currently we&#8217;re busy putting a lot of work into making the management interface understandable and intuitive to use. The closest thing we currently have to a roadmap is our <a href="http://code.google.com/p/escservesconfig/wiki/ToDo" target="_blank">ToDo</a> list.</p>
<p>Please join us on the <a href="http://groups.google.com/group/escservesconfig-discuss" target="_blank">discussion group</a> with your feedback.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=50&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/02/13/introducing-escape/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Retrospectively Breaching the Wall between Developers and Operations</title>
		<link>http://blog.chris-read.net/2008/11/26/retrospectively-breaching-the-wall-between-developers-and-operations/</link>
		<comments>http://blog.chris-read.net/2008/11/26/retrospectively-breaching-the-wall-between-developers-and-operations/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 09:18:00 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://chrisread.wordpress.com/?p=44</guid>
		<description><![CDATA[I like to describe my job at ThoughtWorks as helping Developers and Operations realize that they&#8217;re playing on the same team. No matter how awesome your code is, how elegantly you&#8217;ve solved the problem at hand, how nice and readable the code is &#8211; if you can&#8217;t get it into production your software is just [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=44&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I like to describe my job at ThoughtWorks as helping Developers and Operations realize that they&#8217;re playing on the same team. No matter how awesome your code is, how elegantly you&#8217;ve solved the problem at hand, how nice and readable the code is &#8211; if you can&#8217;t get it into production your software is just a collection of bits. Likewise, you can have the best network, the most scalable hardware, the neatest cable patching scheme &#8211; but it&#8217;s just a big fancy heater if it&#8217;s not running the code your business needs.</p>
<p>As I&#8217;m normally brought in with the developers, I&#8217;ve been trying to find efficient ways to engage with the client Operations teams. Normally I end up having one on one conversations with various members of the team, try to find out what their current processes are, what their major challenges are and what their concerns are regarding the project I&#8217;m involved in. I usually do this to keep the safety levels high. The problem though is that it takes quite a lot of time and effort to get things going and get some momentum going.</p>
<p>At my current client though I didn&#8217;t have the time or access to the people to do things the normal way. A meeting was arranged with the key Operations stake holders and I effectively had just 2 hours to explain our development process in general, and Continuous Integration and Build Pipelines in detail. While talking with Graham Brooks about what we wanted to cover, he came up with the idea of running it as a mini retrospective.</p>
<p>After the usual introductions, we gave them 15 minutes to list the Good, the Bad and the Puzzles of their current development and release process. We had good participation from the group and as expected had a high number Bad entries. After talking through the cards and grouping them into related sections, we then allowed them to vote on the ones they most wanted to talk about. Most votes went to the core pain points, and we spent the rest of the time talking about how our process would address those issues. It also helped a lot that most of the Good entries related to the automation they already have in place&#8230;</p>
<p>By the end of the meeting no was talking about the bad old days (lobbing releases over the wall). Everyone was engaged starting to get some spirit of collective ownership going in the whole delivery process and that breaking down the walls that exist between the various silos was high on the list of things to do. Rather than talk to them about our process and how we would like to interact with them, we had allowed them to lead the discussion on which elements from our toolbox would have the greatest value for them.</p>
<p>All I need to do now is learn how to be as good a facilitator as Graham was&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/44/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=44&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2008/11/26/retrospectively-breaching-the-wall-between-developers-and-operations/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Continuous Integration Server Comparison 2008</title>
		<link>http://blog.chris-read.net/2008/09/22/continuous-integration-server-comparison-2008/</link>
		<comments>http://blog.chris-read.net/2008/09/22/continuous-integration-server-comparison-2008/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 12:22:10 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://chrisread.wordpress.com/?p=23</guid>
		<description><![CDATA[Early last year I did a Quick Comparison of some of the popular CI servers of the time. Things have moved on since then, and I&#8217;ve actually been involved with the Cruise development team since then. Now that Cruise has been released, a number of people both inside and outside ThoughtWorks have asked me to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=23&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Early last year I did a <a href="http://blog.chris-read.net/2007/02/21/quick-comparison-of-teamcity-12-bamboo-10-and-cruisecontrol-26/" target="_blank">Quick Comparison</a> of some of the popular CI servers of the time. Things have moved on since then, and I&#8217;ve actually been involved with the <a href="http://studios.thoughtworks.com/cruise-continuous-integration" target="_blank">Cruise</a> development team since then. Now that Cruise has been released, a number of people both inside and outside <a href="http://www.thoughtworks.com" target="_blank">ThoughtWorks</a> have asked me to put together a follow up article – here it is.</p>
<p>The list of available products out there has grown a lot in the past 18 months, and the features that they support are really great. Since I did the last review I&#8217;ve actively avoided having a look at the other tools out there to keep a clear focus on what I wanted to see in Cruise. Doing this review has been a great way for me to see what everyone else has been up to.</p>
<p>Just having loads of features does not automatically make for a good tool though. Instead of having a shooting match between who does what, I&#8217;ve taken a little sample Java servlet that I use for demos and tried to get it working with all the tools. This project is hosted on a local subversion repository. I&#8217;m going to try set it up to simply run unit tests and create my distributable .war file. Areas that I&#8217;m going to look at are:</p>
<ul>
<li>Installation (on Linux, OSX and Windows)</li>
<li>Setting up my existing project</li>
<li>What did the tool inspire me to try next</li>
</ul>
<p>Tools that I&#8217;ll be trying out are (in alphabetical order):</p>
<ul>
<li><a href="http://www.anthillpro.com/html/default.html" target="_blank">AntHillPro</a> 3.5.3</li>
<li><a href="http://www.atlassian.com/software/bamboo/" target="_blank">Bamboo</a> 2.1.1</li>
<li><a href="http://studios.thoughtworks.com/cruise-continuous-integration" target="_blank">Cruise</a> 1.0</li>
<li><a href="http://cruisecontrol.sf.net" target="_blank">CruiseControl</a> 2.7.3</li>
<li><a href="https://hudson.dev.java.net/" target="_blank">Hudson</a> 1.252</li>
<li><a href="http://zutubi.com/products/pulse/" target="_blank">Pulse</a> 1.2.56</li>
<li><a href="http://www.jetbrains.com/teamcity/">TeamCity</a> 3.1.2</li>
</ul>
<h2><span id="more-23"></span>AntHillPro</h2>
<h3>Installers</h3>
<p>There are no native platform installers, but you can choose from 3 packages. Each package contains both the server and the agent components.</p>
<ul>
<li>Graphical Java Installer</li>
<li>Windows Command Line Installer</li>
<li>Unix Command Line Installer</li>
</ul>
<h3>Installation</h3>
<p>I chose the Unix Command Line. Unpacked the tarball and ran the script. It&#8217;s unique in that all the script does is kick off an ant build that asks you questions and does the installation. The defaults all seemed pretty reasonable. Installing an agent is done separately and follows the same process. Once you start the processes, hit the web frontend and finish the setup.</p>
<h3>Setting up my project</h3>
<p>This is where things go interesting. There was no obvious “add your project here” button. A bit of clicking around, and I found something under the Admin tab that looked like a good place to start. Then it asked me if I want a Life-Cycle based project or a Non Life-Cycle based one? What&#8217;s a Life-Cycle in this context? I fuddled around and took random guesses, and then figured out that I needed to add a workflow to my project to actually do anything. Fair enough, only I was half way through configuring my new workflow when it asked for my repository, but only gave me a dropdown list to choose from. Back out, into the admin page, find out where to add new repositories, add a Subversion one. Once again try to finish configuring my new project (at least it remembered where I was), but then it all fell apart when trying to add the repository to the workflow. Kept on throwing up “AttributeMissingException: project is missing”. Decided that this had already taken up far too much of my time just to get to this point, and so I gave up.</p>
<h2>Bamboo</h2>
<h3>Installers</h3>
<p>A single installer that contains both the server and the agent.</p>
<ul>
<li>Windows .exe installer</li>
<li>OSX .dmg file</li>
<li>tarball</li>
</ul>
<h3>Installation</h3>
<p>I picked the “Linux” tarball, even though I&#8217;m testing on OSX. I prefer doing this when evaluating products as I think it gives me a better feel for what&#8217;s actually going to be installed, and I&#8217;m guaranteed I can get rid of it efficiently and easily when I&#8217;m done playing with it. Unpackd the tarball, ran the start script. All looks good, but when you try use it it asks you to edit a file in the webapp path pointing to the installation directory. Nasty. Once that&#8217;s fixed and started again, you&#8217;re asked for your license key. There&#8217;s a handy link at the bottom to go get your key, copy paste and you&#8217;re away through the rest of the wizard.</p>
<h3>Setting up my project</h3>
<p>Clicked the Create Plan link. Still has my pet hate of wanting you to specify UPPER CASE KEYS for everything. Are we still using ancient Big Blue iron here that has such limitations? Wants me to specify an ant target which is also a little weird &#8211; I just want the default target! Other than that all very nice. I like how it goes right into the activity page once you&#8217;ve set up your project and you can see what&#8217;s going on, including SVN checkout.</p>
<h3>I then wanted to play with</h3>
<p>Agents. Installed agents on Ubuntu and WinXP (server running on OSX). It&#8217;s pretty easy really. Agent matrix shows you which projects will build on which agents. Also went to look at all the pretty graphs, but I don&#8217;t have much build history right now. Bamboo has built in Clover integration, but I use cobertura in my project for coverage. It looks like they have some interesting reports around code coverage, but I can&#8217;t run them&#8230;</p>
<h2>Cruise</h2>
<p>Disclosure – I wrote the installers for Cruise, so obviously I like them.</p>
<h3>Installers</h3>
<p>Separate installers for the server and the agent components.</p>
<ul>
<li>Windows .exe installer</li>
<li>OSX .app packaged in a zip</li>
<li>Linux RPM and Debian packages</li>
</ul>
<h3>Installation</h3>
<p>This is one of the few products that does not ship a generic tarball or zip file. As I&#8217;m doing all this on a Mac, I pulled down the server and agent zip files, unpacked them, and dragged the .app&#8217;s over to my Applications folder. Double click on each and we&#8217;re up. Once the server is up it opens up the admin interface in your browser. The first thing you&#8217;re asked for is your license key.</p>
<h3>Setting up my project</h3>
<p>The very first thing you&#8217;re hit with (after you&#8217;ve put in your license key) is a wizard to set up your project. Follow the prompts, and fill in where your test results and artefacts are stored. It won&#8217;t let you create the project until it verifies that it can connect to your source repository, so make sure it&#8217;s up before you start.</p>
<h3>I then wanted to play with</h3>
<p>Pipelines. I presented one of the very first papers on Build Pipelines with Jez Humble (now product manager for Cruise) and Dan North at Agile 2006. When I first started implementing them I had to do all kinds of unholy hacks with CruiseControl, but the benefit of using CI like this was well worth the pain at the time. At the moment you have to jump into nasty XML to configure pipelines in Cruise, but the whole process should be wizarded up in the next release. Having lots of agents allows you to split up jobs in your pipeline stages quite nicely so they run in parallel and speed up your feedback loop.</p>
<p>The other great feature I like that product companies are always asking me about is the ability to run parallel builds for a stage on multiple platforms. Whether you&#8217;ve got a .Net app that you need to test across multiple versions of Windows, or a web app that needs to be tested from a whole matrix of different web browsers, Cruise makes it easy to run the same tests in all these different environments using the same build of your application. If the tests pass on all of them, your stage will pass, and you know that your product is playing nicely with all of them.</p>
<h2>CruiseControl</h2>
<h3>Installers</h3>
<ul>
<li>Windows .exe installer</li>
<li>Generic zip file</li>
</ul>
<h3>Installation</h3>
<p>More unzip and run script. It just comes up with the sample project.</p>
<h3>Setting up my project</h3>
<p>This is where the venerable Granddaddy of CI servers really started showing it&#8217;s age. I had to manually check out my project, then edit the xml config file to get it going. If I&#8217;d not been using it for almost 4 years I&#8217;d get pissed off and move along.</p>
<h3>I then wanted to play with</h3>
<p>Something else. If you&#8217;re using it already and it&#8217;s doing the job you want it to, then there is no real reason to change. If you&#8217;re new to CI and are looking for something easy to get you started, then I&#8217;m sad to say I suggest you look elsewhere&#8230;</p>
<h2>Hudson</h2>
<h3>Installers</h3>
<ul>
<li>A single war file for everyone.</li>
</ul>
<h3>Installation</h3>
<p>The most basic of all, just run java -jar hudson.war or drop the war file into your favourite servlet container. Makes it kinda hard to know what version you have though, and by the look if it they release new versions quite regularly.</p>
<h3>Setting up my project</h3>
<p>Not too bad. Pointing at unit test and artefacts was a bit weird as it starts one level higher than I expected. I liked the weather reports. Because the build was failing (because it could not publish any artefacts or find test results), it had little storm clouds. Nice.</p>
<h3>I then wanted to play with</h3>
<p>The plugins. There&#8217;s quite a few, and I like how you can just download them and go.</p>
<h2>Pulse</h2>
<h3>Installers</h3>
<ul>
<li>Windows .exe installer</li>
<li>tarball</li>
<li>zip</li>
</ul>
<h3>Installation</h3>
<p>Another unpack the tarball and run the start script. I see a trend here. Hit the web interface and it asks you for a data directory. Also needs a license key to get going, but has a nice link there to go get one.</p>
<h3>Setting up my project</h3>
<p>Nice start screen with list of things to do. Hit add project, then got confused about what the URL was it was asking for. Got a test button for your SCM &#8211; yay! Setting up the artefacts you want is easy, it all just works. Only thing I can moan about is that I can&#8217;t see what&#8217;s going on in the builds, and it feels slower than the rest for some reason.</p>
<h3>I then wanted to play with</h3>
<p>Personal builds! It&#8217;s not something I&#8217;ve ever played around with, but it looked kinda straight forward with pulse, and it is! Just install a little tool on your development workstation and use it to invoke a personal build. Does require a bit of extra data in the project, but it&#8217;s great.</p>
<p>It also has agents. I love agents. They have an interesting way of doing them though. You point the agent at the server. I suppose that&#8217;s one way of getting around the security implications of other people getting their hands on your code. Agents auto-discover what their hosts provide, and when configuring a project you get a drop down list of what&#8217;s provided already. You&#8217;ve still got the freedom to add your own stuff too.</p>
<p>It has stages, kinda like our build pipelines. To use them nicely though you need to start editing their XML, but they&#8217;ve got great help along the right for you to see what your options are. Their stages run in parallel, so it&#8217;s not really like our Cruise pipelines, but at least they got the parallel stuff going.</p>
<h2>Team City</h2>
<h3>Installers</h3>
<ul>
<li>Windows .exe installer</li>
<li>tarball</li>
</ul>
<h3>Installation</h3>
<p>Unpack the tarball, find and run the start script.</p>
<h3>Setting up my project</h3>
<p>Hit the Create Project button. Interesting that you create the project first, then add the config after. Test SCM button. Auto tagging and code coverage built in. Nice. Also agent based. Option to automagically run emma for you. Tried it, but because I already use cobertura it barfed. It lost my artefacts config somehow. Lots of options. Also by default does not trigger a build on check in &#8211; what&#8217;s with that?</p>
<h3>I then wanted to play with</h3>
<p>Integration with IntelliJ. I&#8217;m a big fan of IntelliJ and use it a lot. It makes sense in a developer centric world, because the IDE is the developers portal into the world of code. I like the way you can click on a failed test and it takes you to the test code, as well as the ability to take responsibility for fixing a broken build.</p>
<h2>Summary</h2>
<p>The world of CI servers has come a long way in the past 18 months. It&#8217;s certainly reinforced my belief that competition is a great driver for innovation. When I started at ThoughtWorks clients would often complain that they&#8217;d like to do Continuous Integration, but setting up a CI server was way too hard. Complexity of tool configuration is now no longer an acceptable excuse for not doing CI.</p>
<p>It&#8217;s also great to see the trend of agents being so popular. The days of having a big mother of a build server for a project or small group of teams is over. After one of the Cruise demos I did here in the UK our client commented that it was great that he could finally find a use for all the overpowered desktop machines their managers have – use them as build agents!</p>
<p>As a final note for those of you who are trying to decide on what CI server to use &#8211; remember to pick one that supports your process and what you want CI to do for you.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=23&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2008/09/22/continuous-integration-server-comparison-2008/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Speaking at JAOO 2008</title>
		<link>http://blog.chris-read.net/2008/09/12/speaking-at-jaoo-2008/</link>
		<comments>http://blog.chris-read.net/2008/09/12/speaking-at-jaoo-2008/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 15:54:01 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://chrisread.wordpress.com/?p=30</guid>
		<description><![CDATA[I&#8217;m busy adding the finishing touches to my talk for JAOO this year and I&#8217;ve just realised that I&#8217;ve not let you guys know that I&#8217;m going to be there. Consider yourself warned. Last year at the conference I got a chance to show off the new UI we did for CruiseControl with Erik Dörnenburg. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=30&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m busy adding the finishing touches to my talk for <a href="http://jaoo.dk/conference/" target="_blank">JAOO</a> this year and I&#8217;ve just realised that I&#8217;ve not let you guys know that I&#8217;m going to be there. Consider yourself warned.</p>
<p>Last year at the conference I got a chance to show off the new UI we did for <a href="http://cruisecontrol.sourceforge.net/" target="_blank">CruiseControl</a> with <a href="http://erik.doernenburg.com/" target="_blank">Erik  Dörnenburg</a>. Afterwards I was having a chat with <a href="http://martinfowler.com/" target="_blank">Martin Fowler</a>, and I commented on how I&#8217;d like to see a whole track at JAOO dedicated to Building and Deploying software. While I&#8217;m sure I can&#8217;t take all the credit for it, this year there is going to be a short <a href="http://jaoo.dk/tracks/show_track.jsp?trackOID=175" target="_blank">Build track</a> with me talking about Continous Integration. Hope to see you there&#8230;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chrisread.wordpress.com/30/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chrisread.wordpress.com/30/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=30&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2008/09/12/speaking-at-jaoo-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Ant can be less verbose than Java</title>
		<link>http://blog.chris-read.net/2008/08/05/ant-can-be-less-verbose-than-java/</link>
		<comments>http://blog.chris-read.net/2008/08/05/ant-can-be-less-verbose-than-java/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 17:14:08 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://chrisread.wordpress.com/?p=19</guid>
		<description><![CDATA[I had one of those rare opportunities today when I got to pair with one of the developers on our project. The story he&#8217;s working on has to do with generating usage documentation for a webservice at runtime. What he wanted was a list of source files to be available at runtime. The solution he [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=19&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I had one of those rare opportunities today when I got to pair with one of the developers on our project. The story he&#8217;s working on has to do with generating usage documentation for a webservice at runtime. What he wanted was a list of source files to be available at runtime. The solution he came up with (which does work) was the following Java program:</p>
<pre>package com.example.service.utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

public class ListControllers {
    public static void main(String[] args) throws IOException {
        String outputFile = args[0];
        String srcDir = args[1];
        File f = new File(srcDir);
        File serverDir = new File(f, "com/example/service/server");
        String[] entries = serverDir.list();
        Arrays.sort(entries);
        BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile, false));
        for(String entry : entries) {
            if(entry.endsWith("Controller.java")) {
                writer.write(name + "\n");
            }
        }
        writer.flush();
        writer.close();
    }
}</pre>
<p>This was then called by the following Ant snippet:</p>
<pre>&lt;mkdir dir="${target.dir}/war/WEB-INF/classes"/&gt;
&lt;java classname="com.example.service.utils.ListControllers"
      classpath="${main.jar}" failonerror="true"&gt;
    &lt;arg value="${target.dir}/war/WEB-INF/classes/controller.list"/&gt;
    &lt;arg value="${src.dir}"/&gt;
&lt;/java&gt;</pre>
<p>This was then bundled up in the war file so that he could get his mits on it at runtime. It works, but is not without problems. My primary complaint is that it makes the build harder to understand. To figure out what&#8217;s going you need to find and open up the .java file, and be able to understand Java in the first place.</p>
<p>After a few minutes of pairing we managed to fix it with the following Ant snippet:</p>
<pre>&lt;mkdir dir="${target.dir}/war/WEB-INF/classes"/&gt;
&lt;pathconvert property="controller.list.propery"
             pathsep="${line.separator}"&gt;
    &lt;sort&gt;
        &lt;path&gt;
            &lt;fileset dir="${src.dir}/com/example/service/server"
                     includes="*Controller.java"/&gt;
        &lt;/path&gt;
    &lt;/sort&gt;
    &lt;map from="${src.dir}/com/example/service/server/" to=""/&gt;
&lt;/pathconvert&gt;
&lt;echo message="${controller.list.propery}"
    file="${target.dir}/war/WEB-INF/classes/controller.list"/&gt;</pre>
<p>Not only is it now easy to see what we&#8217;re trying to do in the build file, but we managed to replace 29 lines of Java + Ant with 10 lines of Ant. Sweet!</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chrisread.wordpress.com/19/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chrisread.wordpress.com/19/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=19&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2008/08/05/ant-can-be-less-verbose-than-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
	</channel>
</rss>
