<?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</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>
	<lastBuildDate>Wed, 16 Dec 2009 15:23:24 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='blog.chris-read.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<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>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.chris-read.net/osd.xml" title="Chris Read" />
		<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&blog=4083712&post=107&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><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>
  <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/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&blog=4083712&post=107&subd=chrisread&ref=&feed=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>Report back from DevOpsDays 2009</title>
		<link>http://blog.chris-read.net/2009/11/24/report-back-from-devopsdays-2009/</link>
		<comments>http://blog.chris-read.net/2009/11/24/report-back-from-devopsdays-2009/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 10:27:26 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[agile sysadmin]]></category>
		<category><![CDATA[Config Management]]></category>
		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=100</guid>
		<description><![CDATA[A few months ago I got an email from Patrick Debois who I&#8217;d met at CITCON Europe asking if I&#8217;d be interested in speaking at the first conference aimed at System Administrators practising/interested in/sceptical about Agile. One of the key beliefs of those of us doing this already is that Agile practices are generally too [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=100&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><p>A few months ago I got an email from <a href="http://www.jedi.be/about/" target="_blank">Patrick Debois</a> who I&#8217;d met at <a href="http://www.citconf.com/" target="_blank">CITCON</a> Europe asking if I&#8217;d be interested in speaking at the first conference aimed at System Administrators practising/interested in/sceptical about Agile. One of the key beliefs of those of us doing this already is that Agile practices are generally too narrowly focussed in their implementation. At the moment it&#8217;s primarily the Development organization who drive its adoption, but to get the most benefit Development and Operations groups within an organization need to work together.</p>
<p>With this in mind it was decided to call the conference <a href="http://www.devopsdays.org/" target="_blank">DevOpsDays</a>. Videos of the talks will be online in the archives section soon, so I&#8217;ve decided to write down my thoughts about what went well and not so well &#8211; I am a fan of retrospectives.<br />
<span id="more-100"></span><br />
<strong>What Went Well</strong></p>
<p>The conference was in Ghent, a city in Belgium, and as expected had quite a heavy European contingent. It was not not exclusively so though, as <a href="http://reductivelabs.com/" target="_blank">Reductive Labs</a> and <a href="http://www.canonical.com/" target="_blank">Canonical</a> both sent representatives over from the USA, and one of the speakers is an Aussie who just happened to be back packing around Europe at the time. One of my first great learnings though was that there are about 10 of us in the greater London area who are doing this kind of thing (2 of them ex-TWers) so we&#8217;ve started meeting regularly and exchanging ideas.</p>
<p>As there was such a large concentration of us around London, we&#8217;ve decided to try and subvert one of the London Geek Nights as a DevOps night to try and spread the word to more Devs. I&#8217;ll probably make more noise about it here when we&#8217;ve got dates confirmed.</p>
<p>The next great thing I loved was the format. It was split up into talks in the morning, with Open Spaces in the afternoon, over 2 days. This format actually worked very well as many of the open space sessions were inspired by the talks. Another interesting mix was that there was an even split between talks on tools and talks on practices.</p>
<p>I also discovered some great tools! Here&#8217;s a brief list of ones I liked the most:</p>
<ul>
<li><a href="http://code.google.com/p/mcollective/" target="_blank">The Marionette Collective</a> &#8211; using a message bus to administer 100&#8217;s of servers using pub/sub topics. You&#8217;ve got to watch the video to appreciate the full awesomeness.</li>
<li><a href="http://auxesis.github.com/cucumber-nagios/" target="_blank">Cucumber-Nagios</a> &#8211; writing tests to monitor your system using Cucumber, and then formatting the results as a Nagios plugin so you can easily wire it in to your monitoring system.</li>
<li><a href="http://flapjack-project.com/" target="_blank">Flapjack</a> &#8211; another example of interesting use of a message bus. This time to parallelize the monitoring of 100&#8217;s of servers. I&#8217;m not sure I totally agree with the approach, but what really blew me away was they way they do graphing and reporting. It&#8217;s very impressive.</li>
<li><a href="http://collectd.org/" target="_blank">collectd</a> &#8211; collectd gathers statistics about the system it is running on and stores this information in RRD databases. One of the things I really like about this though is that there are plugins for it like <a href="http://support.hyperic.com/display/hypcomm/jcollectd" target="_blank">Jcollectd</a> which requires no code changes. Simply plug it into your classpath and it registers a JMX MBean that pumps data from your JVM to collectd (I think). I&#8217;ve not tried it in production yet though&#8230;</li>
</ul>
<p>Overall the conference was very well received, and I&#8217;m looking forward to next years instalment. There&#8217;s a lot of talk about doing a North American version&#8230;</p>
<p><strong>Not So Well<br />
</strong><br />
As we all know, the best bits about Away Days/Conferences are the talks in the hall between sessions. The problem with the program was that we barely had enough time for bio breaks between sessions, and everyone was quite burned out at the end of day two (not just because of the Belgian Beer). I think it&#8217;s a pretty easy thing to fix though and considering that it was the first conference of its type there&#8217;s bound to be some fine tuning required.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/100/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=100&subd=chrisread&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/11/24/report-back-from-devopsdays-2009/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 I&#8217;ve looked [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=91&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><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>
  <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/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&blog=4083712&post=91&subd=chrisread&ref=&feed=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>Real Clouds Don&#8217;t Have Logos</title>
		<link>http://blog.chris-read.net/2009/04/28/real-clouds-dont-have-logos/</link>
		<comments>http://blog.chris-read.net/2009/04/28/real-clouds-dont-have-logos/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 17:06:51 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=85</guid>
		<description><![CDATA[I&#8217;ve been doing even more reading than normal lately on the subject of Clouds lately as quite a few of us within ThoughtWorks who are going to be speaking on the subject next month are comparing notes. It follows that when I clicked the link for &#8220;The Wrong Cloud&#8221; I was not actually prepared for [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=85&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><p>I&#8217;ve been doing even more reading than normal lately on the subject of Clouds lately as quite a few of us within ThoughtWorks who are going to be speaking on the subject next month are comparing notes. It follows that when I clicked the link for &#8220;<a href="http://www.maya.com/the-feed/the-wrong-cloud" target="_blank">The Wrong Cloud</a>&#8221; I was not actually prepared for a delightfully entertaining <a href="http://www.maya.com/file_download/126/The%20Wrong%20Cloud.pdf" target="_blank">paper</a> that would contain my quote of the day:</p>
<p><em>&#8220;Today’s so-called cloud isn’t really a cloud at all. It’s a bunch of corporate dirigibles painted to look like clouds. You can tell they’re fake because they all have logos on them. Real clouds don’t have logos.&#8221;</em></p>
<p>As much as I enjoyed reading their paper, I must say that I disagree with a lot of what the guys at Maya are saying. Yes, there is a large dose of spin and hand wavey magic going on with the current leading fashion trend (that bit is totally true). Yes, it is very easy to tightly couple your application to a cloud vendor. The thing is though that it&#8217;s not that different from the tie in you get when selecting what language you use to develop your application in, which third party libraries you use or even what operating system(s) to target. The only real difference I can think of is that if for some reason the cloud vendor you&#8217;re backing stops running your app goes down, unlike all those mission critical OS/2 applications that are still running out there&#8230;</p>
<p>I&#8217;m pretty sure that you&#8217;d have fair warning before the plug was pulled though, especially if you&#8217;re still paying them money every month for their services.</p>
<p>The real questions you need to ask before doing anything on any cloud service are:</p>
<ol>
<li>What is the problem I&#8217;m trying to solve?</li>
<li>Do any of the cloudy offerings actually help me solve that problem?</li>
<li>What is the cost difference between deploying this app in the cloud vs our own infrastructure (assuming you have any of your own)?</li>
<li>What is the point at which that will change? Is there a usage point where it would be cheaper for me to move off the cloud?</li>
<li>If I chose platform X, how hard will it be to move to platform Y?</li>
</ol>
<p>Cloud is not a magic silver bullet &#8211; such things don&#8217;t exist. As with any technology choice you make, you need to select the most cost effective one for the problem you have, and try your hardest to ignore the FUD.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=85&subd=chrisread&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/04/28/real-clouds-dont-have-logos/feed/</wfw:commentRss>
		<slash:comments>1</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&blog=4083712&post=77&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><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>
  <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/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&blog=4083712&post=77&subd=chrisread&ref=&feed=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>Talking about Java in the Google Cloud in London</title>
		<link>http://blog.chris-read.net/2009/04/23/java-in-the-google-cloud/</link>
		<comments>http://blog.chris-read.net/2009/04/23/java-in-the-google-cloud/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 19:12:21 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=74</guid>
		<description><![CDATA[Ola Bini and myself are going to be talking about Java in the Google Cloud at Skills Matter in London on 11 May.
Registration and more info at http://skillsmatter.com/podcast/ajax-ria/java-in-the-google-cloud
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=74&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><p>Ola Bini and myself are going to be talking about Java in the Google Cloud at Skills Matter in London on 11 May.</p>
<p>Registration and more info at <a href="http://skillsmatter.com/podcast/ajax-ria/java-in-the-google-cloud" target="_blank">http://skillsmatter.com/podcast/ajax-ria/java-in-the-google-cloud</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/74/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=74&subd=chrisread&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/04/23/java-in-the-google-cloud/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>EC2 AMI Creation Tips Part 2: Work with Images, not Volumes</title>
		<link>http://blog.chris-read.net/2009/04/08/ec2-ami-creation-tips-part2/</link>
		<comments>http://blog.chris-read.net/2009/04/08/ec2-ami-creation-tips-part2/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 17:53:14 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[ami]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[ec2]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=64</guid>
		<description><![CDATA[It&#8217;s been a long time since my first post on EC2 AMI Creation Tips. At the time the primary images people were using were the RedHat based ones supplied by Amazon, but I was trying to do something Ubuntu based. Since then a whole host of other well prepared images are now available. I was [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=64&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><p>It&#8217;s been a long time since my first post on <a href="http://blog.chris-read.net/2007/11/19/ec2-ami-creation-tips/" target="_blank">EC2 AMI Creation Tips</a>. At the time the primary images people were using were the RedHat based ones supplied by Amazon, but I was trying to do something Ubuntu based. Since then a whole host of other well prepared images are now available. I was even lucky enough to be invited to create an AMI for Sun&#8217;s launch of OpenSolaris on EC2, but am not allowed to say much more about it&#8230;</p>
<p>Recently though I&#8217;ve been speaking to more and more people who are trying to take an existing AMI and customise it for their own use. They do this by booting the AMI they want to base theirs on, doing the customization, then bundling up that volume. Generally they do pretty well, but there are three common themes that crop up that often cause pain: transient runtime configuration being bundled up, the time (and to a lesser extent effort) it takes to bundle the new image in the first place and making further changes to the image down the line.</p>
<p>Thankfully there is a simple single solution to these three problems &#8211; bundle from an image, not a running volume, and keep that image (or a set of images) along with some nice helper scripts on an EBS volume. That&#8217;s the theory, but as always there&#8217;s something in the real world that stops it being easy. By default, only the owner of an image can download and unpack an image directly from S3 and the images are encrypted with the owners EC2 private key. For this process to work, you&#8217;ll need to at least bootstrap yourself initially by going through the well known and well documented process of bundling a running system. After that though it&#8217;s easy. Really. Promise&#8230;</p>
<p>Let&#8217;s have a closer look at the problems we&#8217;re trying to solve first though before I go into how we fix them.</p>
<h3>Transient Runtime Pollution</h3>
<p>The most frustrating of these is the udev system flagging the source machines MAC address for eth0 and so making their custom image unusable because the network interface does not come up. There are still distributions out there which try to be &#8220;helpful&#8221; by remembering which physical device, such as network card, maps to which logical device name, such as eth0. This is not in itself a bad thing. This is one feature I was crying for 10 years ago when I started using Linux on bigger iron. I would dread adding another network card to a server because I would normally end up having to re-label the external interfaces. The thing is though that you&#8217;re now creating an image that could be running anywhere and you don&#8217;t have physical or even console access to it.</p>
<p>Other examples of things that break are helper scripts. Because we&#8217;re now on an operating system image that is meant to be able to run anywhere, there are certain things you want to run only once the very first time the system boots. Once they&#8217;ve run the these scripts either create a lock file, clear their own executable bits or even delete themselves. If you&#8217;re trying to re-bundle and image you&#8217;ve already booted, you need to make sure you back out these changes.</p>
<p>Doing your customization in an image that has never actually been booted helps you keep all these things pristine.</p>
<h3>Time and Effort of Creation</h3>
<p>This one is actually quite straight forward. When you&#8217;re bundling a running volume, what happens under the hood is:</p>
<ol>
<li>A new sparse file for the image is created</li>
<li>A new filesystem is created on the new image file</li>
<li>This new filesystem is mounted somewhere</li>
<li>The contents of your running volume is copied into the new image file</li>
<li>The new filesystem is then unmounted</li>
<li>The image file is compressed and encrypted</li>
<li>The compressed and encrypted file is then split into chunks</li>
<li>Your manifest is created</li>
</ol>
<p>Some of these steps very I/O intensive. When you&#8217;re working with an image though, steps 1 to 5 don&#8217;t happen (well, steps 3 and 5 are needed for you to make changes) so you&#8217;ll be doing almost 50% less IO. This means that bundling a new image will take about half time. If you work with your image on an EBS volume it&#8217;ll be even faster as they have better performance characteristics than the standard instance stores.</p>
<p>Bundling and uploading images are not simple commands though. You need to specify things like your AWS access key and provide your EC2 encryption key. There&#8217;s options for which kernels and ramdisks to use. There&#8217;s lots of typing which means lots of room for human error. The way to get around this is to have small shell scripts with all these options in them. Now they are simple commands&#8230;</p>
<h3>Maintenance</h3>
<p>Once you&#8217;ve got your new AMI looking the way you want and doing the things you need, chances are that a few weeks after you&#8217;ve started using it you find that there&#8217;s a security fix or package update you&#8217;d like to apply. Often this ends up with people starting the whole process from scratch again. Boot up a new instance of the AMI you want to update, update it, type in all those commands and remember the options you used to bundle the volume and upload the new one. If you kept your scripts and image on an EBS you could simply attach it to a running instance and make the fixes there using the same scripts you used last time. Hows that for repeatability?</p>
<p>&#8220;So, just how do I work with an image then?&#8221; I hear you ask. Here&#8217;s a basic outline to get you started.</p>
<h3>1. Set up your environment</h3>
<p>These steps assume that you have the EC2 AMI and API tools installed locally, and that you&#8217;re running the commands on an EC2 instance. If you don&#8217;t have them, please look at <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=368&amp;categoryID=88" target="_blank">EC2 AMI Tools</a> and <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&amp;categoryID=88" target="_blank">EC2 API Tools</a>.</p>
<p>You also need some environment variables configured to make life easier:</p>
<p style="padding-left:30px;"><em>EC2_PRIVATE_KEY=/path/to/your/EC2/private/key<br />
EC2_CERT=/path/to/your/EC2/cert</em></p>
<h3>2. Create your EBS Volume</h3>
<p>The hardest thing will be working out how big you need to make it. Absolute worst case will be 20gb per image, but in reality 10gb should be plenty. Remember though that an EBS can only be mounted in the availability zone it is created in, so this command creates one in the same zone you are in.</p>
<p style="padding-left:30px;"><em>ec2-create-volume -s 10 -z `curl http://169.254.169.254/2008-09-01/meta-data/placement/availability-zone`</em></p>
<h3>3. Prepare the Volume</h3>
<p>First, attach the volume to a running EC2 instance. Make sure it&#8217;s at least the same type (i386 or x86_64) as the image you&#8217;re working on.</p>
<p style="padding-left:30px;"><em>ec2-attach-volume vol-&lt;your vol id&gt; -i `curl http://169.254.169.254/2008-09-01/meta-data/instance-id` -d /dev/sdp</em></p>
<p>An EBS volume is a raw bit bucket. You need to partition it (if you&#8217;re in to that kind of thing) and create the filesystem on it. Partitions don&#8217;t really make sense here though, so just create a nice shiny filesystem on it once it&#8217;s mounted on the instance.</p>
<p style="padding-left:30px;"><em>mke2fs -j /dev/sdp</em></p>
<p>In this instance I&#8217;m making an EXT3 filesystem, but you can use any filesystem that&#8217;s supported by the host machine. Please make sure though that the block device you specify (in this example <em>/dev/sdp</em>) matches what you told EC2 to mount your EBS volume on.</p>
<p style="padding-left:30px;"><em>mkdir /ebs</em></p>
<p style="padding-left:30px;"><em>mount /dev/sdp /ebs</em></p>
<p>This mounts your new filesystem on a directory called <em>/ebs</em></p>
<p style="padding-left:30px;"><em>mkdir /ebs/mnt</em></p>
<p style="padding-left:30px;"><em>mkdir /ebs/download</em></p>
<p style="padding-left:30px;"><em>mkdir /ebs/upload</em></p>
<p style="padding-left:30px;"><em>mkdir /ebs/.ec2</em></p>
<p>This creates some handy directories to help you along with the process. This is what they do:</p>
<ul>
<li><em>mnt</em>: Will be used as the mount point to access your image</li>
<li><em>download</em>: This is where you&#8217;ll to download your initial bundle to</li>
<li><em>upload</em>: When you bundle an image, put it here ready to be uploaded</li>
<li><em>.ec2</em>: This will contain your AWS access keys and your EC2 PEM files as follows:
<ul>
<li><em>s3.secret</em>: S3 Secret Key</li>
<li><em>s3.access</em>: S3 Access Key</li>
<li><em>ec2-pk.pem</em>: EC2 Private Key</li>
<li><em>ec2-cert.pem</em>: EC2 Certificate</li>
<li><em>id</em>: EC2 user ID (Note: AWS account number, NOT Access Key ID)</li>
</ul>
</li>
</ul>
<p style="padding-left:30px;"><em>ec2-download-bundle -b your-bucket -a `cat /ebs/.ec2/s3.access` -s `cat /ebs/.ec2/s3.secret` -k /ebs/.ec2/ec2-pk.pem -d /ebs/download -p your-image-name</em></p>
<p>This command pulls down the bundle you want to customise from S3. As I said before though, this will only work if you have sufficient rights on S3 to download the image and the EC2 private key that bundled it up and encrypted it in the first place.</p>
<p style="padding-left:30px;"><em>ec2-unbundle -k /ebs/.ec2/ec2-pk.pem -s /ebs/download -d /ebs -m /ebs/download/your-image-name.manifest.xml </em></p>
<p>This command uncompresses and decrypts the image file from the downloaded bundle. It takes a while&#8230;</p>
<h3>4. Customise</h3>
<p>Now you&#8217;re ready to work. All you need is two shell scripts to go in your /ebs directory.<em> <a href="http://chris-read.net.s3.amazonaws.com/work.sh">work.sh</a></em> mounts up your image (if it&#8217;s not mounted already) and chroot&#8217;s you in and you&#8217;re now up and running &#8211; customise to your hearts content. When you&#8217;re done, make sure you&#8217;ve logged out of all your work.sh scripts (yes you can run more than one) and then run <a href="http://chris-read.net.s3.amazonaws.com/bundle-and-upload.sh"><em>bundle-and-upload.sh</em></a>.</p>
<p>When you&#8217;re done, just shut down your host machine. When you want to work on it again later, just boot up a new AMI, attach your volume, mount it up and you&#8217;re at step 4 already.</p>
<p>Have fun&#8230;</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=64&subd=chrisread&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/04/08/ec2-ami-creation-tips-part2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Above the Clouds &#8211; This Sounds Familiar&#8230;</title>
		<link>http://blog.chris-read.net/2009/02/24/above-the-clouds-this-sounds-familiar/</link>
		<comments>http://blog.chris-read.net/2009/02/24/above-the-clouds-this-sounds-familiar/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 13:24:49 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Networks]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Virtualization]]></category>
		<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=57</guid>
		<description><![CDATA[I found a link to Above the Clouds, a paper on Cloud Computing recently published by a quartet of UC Berkeley RAD Lab professors. I&#8217;ve been quite disappointed with publications on the subject of the latest buzzword taking the world by storm right now, so I was not expecting much when I first clicked on [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=57&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><p>I found a link to <a href="http://berkeleyclouds.blogspot.com/" target="_blank">Above the Clouds</a>, a paper on Cloud Computing recently published by a quartet of <a href="http://radlab.cs.berkeley.edu/wiki/RAD_Lab" target="_blank">UC Berkeley RAD Lab</a> professors. I&#8217;ve been quite disappointed with publications on the subject of the latest buzzword taking the world by storm right now, so I was not expecting much when I first clicked on the link. The thing is, as I started reading through the Executive Summary it all sounded very familiar. The outline the give in the summary follows the same outline as a talk I gave in November last year at the <a href="http://www.thoughtworks.com/" target="_blank">ThoughtWorks</a> London office for the <a href="http://www.meetup.com/Londonjavacommunity/" target="_blank">London Java Community</a>.</p>
<p>The only criticism I have is that they don&#8217;t put enough emphasis on one of my key reasons for why it&#8217;s suddenly taken off. Cloud computing is not a new idea &#8211; it&#8217;s an extension of the Utility Computing that John McCarthy talked about in 1961. Although they only make a passing remark in section 3, I think one of the most important reasons it&#8217;s taken off is that the services Amazon provide were the first that were <strong>not</strong> a &#8220;solution looking for a problem&#8221;. Earlier offerings by the likes of Sun, HP and Intel all created a solution that they tried to sell to clients. The problem was that there were remarkably few problems that their solutions solved. Amazon simply exposed services that they were using internally already. That&#8217;s not to say the other reasons they give are not valid, I totally agree with them. I think they just missed a good point.</p>
<p>One of the topics I only glanced over is covered cover quite well in section 6 &#8211; Cloud Computing Economics. They provide some interesting example cost calculations. Although the numbers are obviously US centric, they do provide a nice way for a company to approach making the old &#8220;build vs buy&#8221; comparison.</p>
<p>In summary, I highly recommend this paper for anyone who wants to get the head around what this Cloud stuff is all about and what they need to do to prepare for it.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=57&subd=chrisread&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/02/24/above-the-clouds-this-sounds-familiar/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?
This [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&blog=4083712&post=50&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<br /><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>
  <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/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&blog=4083712&post=50&subd=chrisread&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/02/13/introducing-escape/feed/</wfw:commentRss>
		<slash:comments>1</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&blog=4083712&post=44&subd=chrisread&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<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 &#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>
  <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" />]]></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>
	</channel>
</rss>