<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Chris Read</title>
	<atom:link href="http://blog.chris-read.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chris-read.net</link>
	<description>He's just this guy you know...</description>
	<pubDate>Wed, 26 Nov 2008 09:18:00 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
		<url>http://www.gravatar.com/blavatar/e5f05fcdc8a7a74e94f7e2fbe1d71fbe?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Chris Read</title>
		<link>http://blog.chris-read.net</link>
	</image>
			<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 - if you can&#8217;t get it into production your software is just [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><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 - 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 - 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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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/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&blog=4083712&post=44&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2008/11/26/retrospectively-breaching-the-wall-between-developers-and-operations/feed/</wfw:commentRss>
	
		<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 [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><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 - 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 - 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 - 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 - remember to pick one that supports your process and what you want CI to do for you.</p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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/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&blog=4083712&post=23&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2008/09/22/continuous-integration-server-comparison-2008/feed/</wfw:commentRss>
	
		<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. [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><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>
<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/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&blog=4083712&post=30&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2008/09/12/speaking-at-jaoo-2008/feed/</wfw:commentRss>
	
		<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 [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><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>
<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/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&blog=4083712&post=19&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2008/08/05/ant-can-be-less-verbose-than-java/feed/</wfw:commentRss>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>EC2 AMI Creation Tips</title>
		<link>http://blog.chris-read.net/2007/11/19/ec2-ami-creation-tips/</link>
		<comments>http://blog.chris-read.net/2007/11/19/ec2-ami-creation-tips/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 15:00:15 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
		
		<category><![CDATA[Linux]]></category>

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

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

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

		<guid isPermaLink="false">http://www.chris-read.net/index.php/2007/11/19/ec2-ami-creation-tips/</guid>
		<description><![CDATA[While we were still working on Buildix 2, people started asking about an AMI for Buildix on Amazons EC2. This didn&#8217;t seem to be such a big ask, but now that I&#8217;ve finally gotten around to working on this I&#8217;ve found it can be a bit fiddly! While there is a lot of good documentation [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>While we were still working on Buildix 2, people started asking about an AMI for Buildix on Amazons EC2. This didn&#8217;t seem to be such a big ask, but now that I&#8217;ve finally gotten around to working on this I&#8217;ve found it can be a bit fiddly! While there is a lot of good documentation in the various sections of the EC2 site, I still had a quite a few head scratching moments trying to create my own Ubuntu 7.04 Server image to load Buildix into.</p>
<p>The Buildix image is now available for public use as <strong>ami-e4ca2f8d</strong>.<br />
<span id="more-16"></span><br />
Here&#8217;s a couple of tips to keep in mind when rolling your own:</p>
<h2>Remeber it&#8217;s Xen</h2>
<p>I had problems getting my first batch of uploads working on the network. They would boot without a problem, but the networking would not initialize (as I could see from the console output). Things got a lot easier when I started manipulating the image locally using my own Xen installation. By booting it up on my local Xen server I could see where the problems were and fix them with a lot less pain and suffering.</p>
<p>The other benefit you get from testing your image in Xen is that you can bundle the image directly (ec2-bundle-image) instead of having to scrape a running machine (ec2-bundle-vol).</p>
<h2>There can&#8217;t be only one</h2>
<p>As the name implies, EC2 is all about having a big cloud of images. Chances are there will be a lot of instances of each image running out there. This means that the image itself needs to pick up its identity on boot up. Amazon provide a nice RESTful API that can provide each instance with information about itself. The documentation for the meta-data that&#8217;s available is available at <a href="http://docs.amazonwebservices.com/AWSEC2/2007-08-29/DeveloperGuide/AESDG-chapter-instancedata.html" target="_blank">http://docs.amazonwebservices.com/AWSEC2/2007-08-29/DeveloperGuide/AESDG-chapter-instancedata.html</a>. The stuff I needed the most was the public SSH key to allow to log in as root, and the hostname of the machine. Here&#8217;s what I added to <em>/etc/rc.local</em> to allow me to do this:</p>
<pre>if [ ! -d /root/.ssh ] ; then
    mkdir -p /root/.ssh
    chmod 700 /root/.ssh
fi
# Fetch public key using HTTP
curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key &gt; /tmp/my-key
if [ $? -eq 0 ] ; then
    cat /tmp/my-key &gt;&gt; /root/.ssh/authorized_keys
    chmod 600 /root/.ssh/authorized_keys
    rm /tmp/my-key
fi

hostname `curl http://169.254.169.254/latest/meta-data/hostname`</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chrisread.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chrisread.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=16&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2007/11/19/ec2-ami-creation-tips/feed/</wfw:commentRss>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>CruiseControl and Buildix 2 at JAOO 2007</title>
		<link>http://blog.chris-read.net/2007/09/26/cruisecontrol-and-buildix-2-at-jaoo-2007/</link>
		<comments>http://blog.chris-read.net/2007/09/26/cruisecontrol-and-buildix-2-at-jaoo-2007/#comments</comments>
		<pubDate>Wed, 26 Sep 2007 14:49:10 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
		
		<category><![CDATA[Development]]></category>

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

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

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

		<guid isPermaLink="false">http://www.chris-read.net/index.php/2007/09/26/cruisecontrol-and-buildix-2-at-jaoo-2007/</guid>
		<description><![CDATA[I&#8217;ve been at JAOO for the past few days, and while here I had a chance to do a presentation with Erik Doernenburg on Continuous Integration and CruiseControl. We used the new Beta version of Buildix 2 to show people the new CruiseControl Dashboard, and quite a few people were impressed with it. Favourite features [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;ve been at <a href="http://jaoo.dk" title="JAOO" target="_blank">JAOO</a> for the past few days, and while here I had a chance to do a presentation with <a href="http://erik.doernenburg.com/" target="_blank">Erik Doernenburg</a> on Continuous Integration and <a href="http://cruisecontrol.sf.net" target="_blank">CruiseControl</a>. We used the new <a href="http://buildix.thoughtworks.com/beta.html" target="_blank">Beta</a> version of Buildix 2 to show people the new CruiseControl <a href="http://cruisecontrol.sourceforge.net/dashboard.html" target="_blank">Dashboard,</a> and quite a few people were impressed with it. Favourite features were the <a href="http://confluence.public.thoughtworks.org/display/CCNET/CCTray" target="_blank">CCTray</a> integration, and the ability to see the status of a large number of projects at a glance.</p>
<p>As always, there were also people who were interested in hearing about how it can be used for non Java projects. I had a good chat to one person who is interested in using it on a mixed Common LISP and <a href="http://www.erlang.org/" target="_blank">Erlang</a> project he&#8217;s working on. I&#8217;m looking forward to hearing how it goes for him. Due to lack of experience on my part I could unfortunately not help him much with the <a href="http://darcs.net/" target="_blank">darcs</a> problems he&#8217;s having though. Some people have all the fun&#8230;</p>
<p>It was also quite useful to speak to people about the problems they&#8217;re currently facing when trying to use CruiseControl. A common theme is people trying to manage large numbers of builds, or trying to build products across large numbers of different platforms. These are problems the dedicated ThoughtWorks development team are currently working on, so it&#8217;s great to get the validation that we&#8217;re putting effort into the things people care about now.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chrisread.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chrisread.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=15&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2007/09/26/cruisecontrol-and-buildix-2-at-jaoo-2007/feed/</wfw:commentRss>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>The Microsoft School of Error Messages</title>
		<link>http://blog.chris-read.net/2007/05/23/the-microsoft-school-of-error-messages/</link>
		<comments>http://blog.chris-read.net/2007/05/23/the-microsoft-school-of-error-messages/#comments</comments>
		<pubDate>Wed, 23 May 2007 21:32:35 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
		
		<category><![CDATA[Software]]></category>

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

		<guid isPermaLink="false">http://www.chris-read.net/index.php/2007/05/23/the-microsoft-school-of-error-messages/</guid>
		<description><![CDATA[Up until now I&#8217;ve managed to avoid ranting here, but I can no longer resist! After all these years of experience, why are the error messages in windows still generally meaningless? Is it because there are so many of them?
The problem I faced was trying to patch a game. Downloaded the patch, tried to apply [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Up until now I&#8217;ve managed to avoid ranting here, but I can no longer resist! After all these years of experience, why are the error messages in windows still generally meaningless? Is it because there are so many of them?</p>
<p>The problem I faced was trying to patch a game. Downloaded the patch, tried to apply it, but got the message &#8220;<strong>The application failed to initialize properly</strong> (<strong>0xc0000135</strong>)&#8221;. Much confusion. Downloaded from another source, tried again, same error. Tried on my laptop, and this time it worked perfectly. What&#8217;s the problem?</p>
<p>Turns out the patch is written in .Net, and I don&#8217;t have the correct version of the runtime installed on my desktop, but I do have it on my laptop. I only had .Net 1.0, and it needs a newer version. Good thing the error message told me that in the first place then, isn&#8217;t it&#8230;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chrisread.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chrisread.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=14&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2007/05/23/the-microsoft-school-of-error-messages/feed/</wfw:commentRss>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Using CruiseControl for non-Java Projects</title>
		<link>http://blog.chris-read.net/2007/03/05/using-cruisecontrol-for-non-java-projects/</link>
		<comments>http://blog.chris-read.net/2007/03/05/using-cruisecontrol-for-non-java-projects/#comments</comments>
		<pubDate>Mon, 05 Mar 2007 09:57:04 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
		
		<category><![CDATA[Development]]></category>

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

		<guid isPermaLink="false">http://www.chris-read.net/?p=14</guid>
		<description><![CDATA[A lot of people are under the impression that CruiseControl is solely intended for Java projects. This is a common misconception. At my current client we&#8217;re  using CruiseControl to build a 15 year old, 2.5 million line mixed C/C++ app  using GNU make. We&#8217;re also using it to build and functionally test a [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A lot of people are under the impression that CruiseControl is solely intended for Java projects. This is a common misconception. At my current client we&#8217;re  using CruiseControl to build a 15 year old, 2.5 million line mixed C/C++ app  using GNU make. We&#8217;re also using it to build and functionally test a new C app  we&#8217;re writing as part of the project. I&#8217;ve also used it in the past on Python  apps.</p>
<p>There are a number of ways to do this,  and they all really depend on what you&#8217;re using Cruise for. If you&#8217;re simply  using it for compilation, then you can simply use &lt;exec&gt; to  call make (or whatever you&#8217;re building with). By default it will break the build if the command returns a non-zero  return code, so it should be smart enough to do this out of the box. I know that  some of our Ruby projects that use this method too.</p>
<p>My personal preference is to get CruiseControl to do an Ant build, which  has some additional logic, including taging the source repository with the build  label if the build passes. The approach is very similar in this case, and has the  following steps:</p>
<ul>
<li>Have ant do any  additional work/checks you want to ensure the environment is how you want  it.</li>
<li>Update my working copy to an exact known  version that can be tagged at a later stage if the build is good (primarily a  CVS problem, not really needed if you&#8217;re using  Subversion).</li>
<li>Use the  &lt;exec&gt; task from  ant to run the build</li>
<li>If you have additional  tests to run, use an  &lt;exec&gt; within a  &lt;parallel&gt; block to start your  newly built binary in the background, then run the  tests</li>
<li>If everything is good and passes, tag  your source code with the build label.</li>
</ul>
<p>So,  although it is fairly easy to add build plugins for various other projects, you  can save yourself a bit of pain simply using the  one &lt;exec&gt; or shelling  out of an  &lt;ant&gt; builder.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chrisread.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chrisread.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=13&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2007/03/05/using-cruisecontrol-for-non-java-projects/feed/</wfw:commentRss>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Quick Comparison of TeamCity 1.2, Bamboo 1.0 and CruiseControl 2.6</title>
		<link>http://blog.chris-read.net/2007/02/21/quick-comparison-of-teamcity-12-bamboo-10-and-cruisecontrol-26/</link>
		<comments>http://blog.chris-read.net/2007/02/21/quick-comparison-of-teamcity-12-bamboo-10-and-cruisecontrol-26/#comments</comments>
		<pubDate>Wed, 21 Feb 2007 21:41:53 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
		
		<category><![CDATA[Development]]></category>

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

		<guid isPermaLink="false">http://www.chris-read.net/?p=13</guid>
		<description><![CDATA[One of the things I spend a lot of my life doing is looking after Continuous Integration environments. As I work for ThoughtWorks, and am one of the guys who created Buildix, it should come as no surprise that this is all done with CruiseControl. However, in the past few months there a few new [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>One of the things I spend a lot of my life doing is looking after <a target="_blank" href="http://www.martinfowler.com/articles/continuousIntegration.html">Continuous Integration</a> environments. As I work for <a target="_blank" title="ThoughtWorks" href="http://www.thoughtworks.com">ThoughtWorks</a>, and am one of the guys who created <a target="_blank" title="Buildix" href="http://buildix.thoughtworks.com">Buildix</a>, it should come as no surprise that this is all done with <a target="_blank" title="CruiseControl" href="http://cruisecontrol.sf.net">CruiseControl</a>. However, in the past few months there a few new Continuous Integration tools that have crept out onto the scene. The two that I hear the most about are <a target="_blank" title="TeamCity" href="http://www.jetbrains.com/teamcity/">TeamCity</a> and <a target="_blank" title="Bamboo" href="http://www.atlassian.com/software/bamboo/">Bamboo</a>. I finally managed to get a few hours to test them out, and here&#8217;s my impressions.</p>
<p>One of the things I wanted to see was how quick and easy it was to get these tools up and running. With this in mind, I specifically decided in advance to pull down the .war bundle of each one and try that out. In my experience, this would be the one that most of the clients I&#8217;ve been at would have gone for.</p>
<p><strong>Notes:</strong></p>
<ul>
<li>This is very much a first impressions run of the products - I had a limited time window (2 hours total) to do this in.</li>
<li>People could quite fairly say that I have a biased view, but I&#8217;ve tried to keep this as fair as possible.</li>
<li>I only tested doing an Ant build of a simple sample webapp from a subversion repository.</li>
<li>You have to buy a license for TeamCity and Bamboo (I got evaluation licenses for both), but CruiseControl is still free&#8230;</li>
</ul>
<p><strong>Test Environment:</strong></p>
<ul>
<li>Fedora Core 4</li>
<li>Via C3 800 server with 512Mb RAM</li>
<li>Sun Java 1.6.0-b105</li>
<li>Apache Ant 1.7.0</li>
<li>Jetty 6.1.1</li>
<li>Subversion 1.2.3</li>
</ul>
<p><span id="more-12"></span></p>
<p><strong>TeamCity 1.2</strong></p>
<p>This is the one I&#8217;ve heard the most about, and the one I&#8217;ve been most keen to try out. Back in the days when I used to be a developer, our IDE&#8217;s were nothing much more than glorified syntax highlighters. I&#8217;d poked Eclipse a few times in the early days, and not really seen what the fuss was about. Then I spent 10 weeks in a small room <a href="http://apcj.blogspot.com/">Alistair Jones</a> and James Lewis. They kindly took some time to show me all the funky thinks <a href="http://www.jetbrains.com/idea/">IntelliJ</a> could do. If JetBrains can write an IDE that is so good, what could they do if they turned their minds to CI?</p>
<p>Getting the webapp up and running was pretty simple (as expected). I did notice some errors scroll past the Jetty console, but chose to ignore them initially as things didn&#8217;t seem too bad. Things started to get a bit wobbly when it came to getting the agent running though. There are some basic typos in their install documentation that had me scratching my head for a minute or two. Trying to get the agent to play nice with the webapp was more of a pain, lots of NullPointerExceptions all over the place. As it all seemed to be in XML parsing, I decided to gear back to Java 1.5 and this got all the NPE&#8217;s to go away. I now had an agent up and running! Which is where my first concern pops up. It appears anyone can just spark up an agent and point it at TeamCity. I can see all those afflicted with <a href="http://en.wikipedia.org/wiki/Sarbox">SarBox</a> liking that.</p>
<p>There was not much that was configurable for the rest of the system. Mail and IM server details were pretty much it, so I decided to move on to trying to get it to do some builds.</p>
<p>I did manage to get a project configured, but things pretty much went downhill from there. I got lots of strange errors all over the place when trying to look at build reports. Bouncing the webapp seemed to trigger the agent into doing a build, but I could not get it to trigger a build from a checkin.</p>
<p>In short - quite a disappointment really. I&#8217;ll have to try out the release they bundle with Tomcat to see if that is any better. I also didn&#8217;t try get it to play with IDEA, which I&#8217;m starting to feel is what it&#8217;s all about really.</p>
<p><strong>Bamboo 1.0</strong></p>
<p>I&#8217;d only recently heard of Bamboo. I&#8217;ve used other Atlassian products (<a target="_blank" href="http://www.atlassian.com/software/jira/">Jira</a> and <a target="_blank" href="http://www.atlassian.com/software/confluence/">Confluence</a>) in the past, and so was a bit apprehensive about what this would be like as I find their other products a bit heavy. Would this be more of the same?</p>
<p>Installation was a breeze (as it is with their other products). The only bump was having to unpack the war file (one of my pet hates) to open up a properties file to set the <em>bamboo.home</em> property. It was only once I edited the file that I saw this could be set as a system property. It would have made me a whole lot happier if the nice initial system check screen had told me I could set this as a property instead of telling me to unpack a .war.</p>
<p>There are quite a few interesting system options you can set. I quite liked having a global build expiry option, and the separate build queues concept (didn&#8217;t get to play with it though). Other options I quite liked were the global JVM and Builder lists. Time to move on to actually setting something up.</p>
<p>Creating a project is pretty simple, the only thing that annoyed me the typical Atlassian fixation for mainframe style descriptors. Each project needs to have a ALLCAPSNOSPACESDESCRIPTOR to identify itself. Most intuitive. Everything else was pretty self explanitory. Even selecting build artifacts was a joy. Once the project is created, it does an initial checkout and build.</p>
<p>Now to trigger a build. This is one area they still need a bit of work on. While Bamboo did trigger a build correctly when I made repository changes, the polling mechanism is a bit heavy. It seems to do an update, and then if anything has changed it will build. Finding details on what exactly triggered the build also takes some digging, it&#8217;s not that obvious. One thing I do like though is that it keeps a history of individuals activity. You can drill down to each user and see their checkin rate, build breaking rate, build fixing rate, etc. I can see the <a target="_blank" title="Pointy Haired Boss" href="http://en.wikipedia.org/wiki/Pointy_Haired_Boss">PHB</a> types signing the cheque for this feature alone.</p>
<p>Other features I like are the way they show the ant log files for each build, and also how you can effectively tail the log file of a build in progress. The way it parses your JUnit results is also pretty nifty, going as far as building an English sentence for each of your tests if you name them in the recommended <em>testShouldDescribeWhatTheTestIsDoing</em> format.</p>
<p>Things that I felt were missing were auto refresh of your status screen, and the email reports didn&#8217;t trigger when I expected them too, and the format was pretty primitive. It also takes a long time for the app to start (probably because of the Hibernate over HSQL database it keeps everything in), and app response is pretty slow.</p>
<p>In short - not bad for a 1.0 release! Functional, but not sure if I&#8217;d use it&#8230;</p>
<p><strong>CruiseControl 2.6</strong></p>
<p>I&#8217;ve not had a chance, or the need, to upgrade any of the systems I look after to Cruise 2.6. They&#8217;re all running on 2.5 and doing pretty well. While I admit that using this on a daily basis gives it somewhat of an unfair advantage, I think it also means I&#8217;ve probably got less to say about it.</p>
<p>First off, installation is pretty easy if you&#8217;re using the embedded Jetty for your reporting. If you want to do what I&#8217;ve done with the others and run it in your own container, it&#8217;s not that much harder. The only things you need to do are edit the startup script, and edit the web.xml file in the webapp to point it to all the correct directories. As I said above, this is a pet hate of mine.</p>
<p>Configuring a new project is a real bitch after using the other two. Even with my experience, and even using the sample connectfour project as a template, I still managed to get a type in there. Enough said on the configuration front.</p>
<p>Things I still liked about it compared to the others was the speed. It&#8217;s small, simple, and fast. That&#8217;s a key thing for me as CI is all about fast feedback, and if your tools are taking their time, you&#8217;re reducing your feedback loop. The other important thing about feedback is the information. Although the others all look pretty, there is still some basic information they&#8217;re missing for the builds - who changed what and why.</p>
<p>The new kids on the block are really make the grand pappy of them all show its age. I don&#8217;t think this is a bad thing though. New ideas should always be welcome in any field. They also show how much they still have to learn.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chrisread.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chrisread.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=12&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2007/02/21/quick-comparison-of-teamcity-12-bamboo-10-and-cruisecontrol-26/feed/</wfw:commentRss>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Why testing early pays off</title>
		<link>http://blog.chris-read.net/2007/02/12/why-testing-early-pays-off/</link>
		<comments>http://blog.chris-read.net/2007/02/12/why-testing-early-pays-off/#comments</comments>
		<pubDate>Mon, 12 Feb 2007 11:28:42 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.chris-read.net/?p=12</guid>
		<description><![CDATA[Part of what we&#8217;re doing at my current client is writing an HTTP interface to allow read only access to a Tangosol cache. For the first month or so we&#8217;ve been using Jetty (6.0.2) for testing and development, because it&#8217;s free and easy. Everything has been going well, and we finally got the official ruling [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Part of what we&#8217;re doing at my current client is writing an HTTP interface to allow read only access to a Tangosol cache. For the first month or so we&#8217;ve been using Jetty (6.0.2) for testing and development, because it&#8217;s free and easy. Everything has been going well, and we finally got the official ruling that our webapp will run in production under JBoss (4.0.3SP1). We did expect this, as current webapps they have in production run under JBoss, but we were not sure of which version we were going to end up on so we stuck with Jetty. We&#8217;ve been very carefull to keep our app as vanilla as possible, but when we deploy our happy app under JBoss, we start getting showered with NullPointerExceptions like these:</p>
<p>java.lang.NullPointerException<br />
at org.apache.xalan.transformer.SerializerSwitcher.switchSerializerIfHTML(SerializerSwitcher.java:153)<br />
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:991)</p>
<p>After a bit of poking around I found that the only nulls that existed in that area of our code was when we were calling startElement() and endElement() with nulls. A quick look at the JavaDocs for these methods says that you should pass &#8220;the empty string&#8221; if there is no Namespace URI or Namespace. Simply replacing calls like:</p>
<p>transformerHandler.startElement(null, null, ERROR_TAG_NAME, errorAttributes)</p>
<p>with</p>
<p>transformerHandler.startElement(&#8221;", &#8220;&#8221;, ERROR_TAG_NAME, errorAttributes)</p>
<p>sorted out the problem!</p>
<p>We&#8217;re only due to go live with this app in July, but one of the patterns that has saved me many times is to test early and often. The trick is not to limit your testing, but push it as far as you can go. In this case, testing in a production like environment 5 months before we&#8217;re due to go live has meant we only needed to change a few lines of code in two classes. Imagine how much more we would have to change in 5 months time&#8230;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chrisread.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chrisread.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=11&subd=chrisread&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2007/02/12/why-testing-early-pays-off/feed/</wfw:commentRss>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
	</channel>
</rss>