<?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>Quality Software Development with Ease &#187; Hudson</title>
	<atom:link href="http://qualityswdev.com/tag/hudson/feed/" rel="self" type="application/rss+xml" />
	<link>http://qualityswdev.com</link>
	<description>Thoughts on better ways to develop high quality software by Manuel Küblböck. Agile and Lean methodologies, XP practices and other software development goodness.</description>
	<lastBuildDate>Sat, 05 Nov 2011 11:24:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='qualityswdev.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/616a91f395956dcbbef17b7fa1e2d403?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Quality Software Development with Ease &#187; Hudson</title>
		<link>http://qualityswdev.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://qualityswdev.com/osd.xml" title="Quality Software Development with Ease" />
	<atom:link rel='hub' href='http://qualityswdev.com/?pushpress=hub'/>
		<item>
		<title>CI Gossip: Is Hudson asking Jenkins out again?</title>
		<link>http://qualityswdev.com/2011/05/05/ci-gossip-is-hudson-asking-jenkins-out-again/</link>
		<comments>http://qualityswdev.com/2011/05/05/ci-gossip-is-hudson-asking-jenkins-out-again/#comments</comments>
		<pubDate>Thu, 05 May 2011 21:50:22 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Jenkins]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=528</guid>
		<description><![CDATA[After the recent divorce of Hudson and Jenkins following the tragical death of Hudson&#8217;s mother Sun and a long battle over trademark rights, Hudson seems to have come to senses and is planning to hand over the code to Eclipse. I&#8217;ve seen Jenkins&#8217; father Kohsuke in Hamburg earlier this week where he presented some stats <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=528&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://qualityswdev.files.wordpress.com/2011/05/divorce.jpg"><img class="alignleft size-thumbnail wp-image-532" title="divorce" src="http://qualityswdev.files.wordpress.com/2011/05/divorce.jpg?w=105&#038;h=102" alt="divorce" width="105" height="102" /></a>After the recent divorce of Hudson and Jenkins following the tragical <a href="http://www.infoq.com/news/2009/04/oraclebuyssun" target="_blank">death</a> of Hudson&#8217;s mother Sun and a <a href="http://jenkins-ci.org/content/hudsons-future" target="_blank">long battle</a> over trademark rights, Hudson seems to have come to senses and is <a href="http://www.oracle.com/us/corporate/press/393483" target="_blank">planning to hand over the code to Eclipse</a>.</p>
<p>I&#8217;ve seen Jenkins&#8217; father Kohsuke in <a href="http://jenkins-ci.org/content/hamburg-hackathon-great-success" target="_blank">Hamburg</a> earlier this week where he presented <a href="http://www.slideshare.net/kohsuke/current-state-of-jenkins" target="_blank">some stats on the project activities</a>. I don&#8217;t remember the exact numbers, but he drove home the point that Jenkins is where the action is. It seems like Jenkins moved out and took the kids (the open source community) with her. Apparently lawyers don&#8217;t code. Who knew?</p>
<p>It appears that Hudson&#8217;s new foster parents Sonatype are driving the recent activities trying to reunite the once happy couple in the hope to revive the lethargic Hudson. It <a href="http://kohsuke.org/2011/05/04/oracle-proposes-to-move-hudson-to-eclipse/" target="_blank">remains to be seen</a> if Jenkins can forgive Hudson for what he put her through. After all the hard work to build up a life of her own, Hudson&#8217;s request for forgiveness seems almost too much to ask for.</p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/continuous-integration/'>Continuous Integration</a>, <a href='http://qualityswdev.com/tag/hudson/'>Hudson</a>, <a href='http://qualityswdev.com/tag/jenkins/'>Jenkins</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/528/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/528/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/528/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=528&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2011/05/05/ci-gossip-is-hudson-asking-jenkins-out-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://qualityswdev.files.wordpress.com/2011/05/divorce.jpg?w=150" medium="image">
			<media:title type="html">divorce</media:title>
		</media:content>
	</item>
		<item>
		<title>Distributed CI: How it could work</title>
		<link>http://qualityswdev.com/2011/02/02/distributed-ci-how-it-could-work/</link>
		<comments>http://qualityswdev.com/2011/02/02/distributed-ci-how-it-could-work/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 16:51:21 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Cargo]]></category>
		<category><![CDATA[Confluence]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Distributed CI]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[Sonar]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=336</guid>
		<description><![CDATA[I think distributed CI is the logical next step in the evolution of Continuous Integration by getting rid of the manual step of running a private build on the developer machine before committing to the master repository. Here is how I imagine this might work. Managers, developers and customers (or all stakeholders if you will) <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=336&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I think <a href="http://qualityswdev.com/2010/12/15/why-distributed-ci-is-the-logical-next-step/">distributed CI is the logical next step</a> in the evolution of Continuous Integration by getting rid of the manual step of running a private build on the developer machine before committing to the master repository. Here is how I imagine this might work.</p>
<p style="text-align:center;"><a href="http://qualityswdev.files.wordpress.com/2011/01/DciDevMachine.png"><img class="size-full wp-image-436 aligncenter" title="DCI dev machine" src="http://qualityswdev.files.wordpress.com/2011/01/bildschirmfoto-2011-01-08-um-22-27-122.png?w=510" alt=""   /></a></p>
<ul>
<li>Managers, developers and customers (or all stakeholders if you will) collaborate via a wiki and issue tracking tool. These two components tend to be heavily intertwined and are often realized within a single tool. Project management is happening in this area as well.</li>
<li>Developers can access the tasks in the issue tracker from within their development environment (IDE).</li>
<li>While programming, quality assurance plugins inside the IDE point out potential bugs or design flaws to the developers using the same metrics as are measured by the quality analysis run by the central CI server.</li>
<li>Whenever the system is in a consistent state developers commit their changes to their local clone of the Version Control System (VCS) repository. This should happen fairly frequently; several times a day. If you don&#8217;t commit frequently you are not doing <em>continuous</em> integration. (side note: The VCS should contain everything that is needed to produce the system from scratch, including database scripts, operating system setup (aka <a href="http://www.agileweboperations.com/the-implications-of-infrastructure-as-code" target="_blank">infrastructure as code</a>), etc. &#8211; everything.)</li>
<li>The local Continuous Integration (CI) tool notices the changes in the VCS repository, gets the latest changes from the master repository and kicks off a build of the changed code module. The build also runs a suite of unit tests to make sure the changes haven&#8217;t broken any existing code.</li>
</ul>
<p><a href="http://qualityswdev.files.wordpress.com/2011/01/dci-central-server.png"><img class="aligncenter size-full wp-image-465" title="DCI - central server" src="http://qualityswdev.files.wordpress.com/2011/01/dci-central-server.png?w=510" alt="DCI - central server"   /></a></p>
<ul>
<li>After successfully building (and testing) the code the build tool stores the created artefacts in a repository manager. Note: I believe build artefacts don&#8217;t belong in your VCS for several reasons. You shouldn&#8217;t have to store them there either, because you should be able to recreate them from any version in your VCS. But there are also reasons why it might not even be a good idea to do so. Most importantly, it makes traceability harder. For each artefact I want to know which version of my source was used to build it. If build artefacts are stored in VCS as well and therefore create new versions themselves, this becomes harder. Also, all these snapshot versions that are produced many times a day, of which some might even break the build are not worth the disk space they occupy.</li>
<li>Once the local commit build is successfully run and the snapshot artefacts stored in a repository manager the local CI tool pushes the changes to the master repository.</li>
<li>Similar to what happened on the developer machine the central CI tool picks up the changes and runs a commit build. The produced artefact becomes a release candidate with a new version number and is stored in the repository manager, where it can be attained by later phases. (The <a href="http://maven.apache.org/plugins/maven-release-plugin/index.html" target="_blank">maven-release-plugin</a> is a great tool to automate this.)</li>
<li>The produced artefacts are then automatically deployed to a test environment. The deployment tool gets the artefacts from the repository manager and deploys them on a test environment.</li>
<li>There automated acceptance tests are run by the CI tool. If these acceptance tests are successful the tested artefacts are promoted to enter the last phase in your deployment pipeline &#8211; deployment to production. It is important to note that only the commit build phase produces new artefacts. All following phases are re-using these artefacts. An example on how to configure Maven not to rebuild the artefacts in later phases can be found <a href="http://stackoverflow.com/questions/4330518/how-to-stop-mavens-verify-phase-rebuilding-the-artifact" target="_blank">here</a>. Your own deployment pipeline may include more phases than just these two. For instance a manual test phase or performance test phase. Usually these can be performed in parallel and therefore require separate environments (hint: virtual machines are of great help here, but that&#8217;s a topic for another post).</li>
<li>Deployment to production either happens automatically, if you are practicing continuous deployment (good on you), or by manually deploying from your CI server. Even if done manually this should only require the click of a button and should only be possible for artefacts that have successfully completed the previous phases in your deployment pipeline.</li>
<li>Periodically the central CI tool runs a code quality analysis tool, which measures code quality by analysing code coverage and other metrics. Discovered violations can be accessed and fixed directly within the IDE.</li>
<li>The IDE, the VCS, the CI and code quality analysis tool all feed information back to the issue tracking tool to provide a complete picture of the status of a tracked task.</li>
<li>Automated monitoring keeps an eye on the system while it is running in the target environments. This monitoring can also be utilized during automated deployments to decide if a deployment was successful or needs to be backed out. It is mostly agreed upon that the monitor should check business metrics rather than technical aspects.</li>
</ul>
<p>You can find the entire diagram in animated form <a href="http://prezi.com/eellpeguyvgu/the-creation-of-software/" target="_blank">here</a>.</p>
<p>Here are my favorite tools for the above process:</p>
<ul>
<li>Wiki: <a href="http://www.atlassian.com/software/confluence/" target="_blank">Confluence</a></li>
<li>Issue Tracking and Project Management: <a href="http://www.atlassian.com/software/jira/" target="_blank">Jira</a></li>
<li>IDE: <a href="http://www.eclipse.org/" target="_blank">Eclipse</a> (with <a href="http://www.eclipse.org/mylyn/" target="_blank">Mylyn</a> for Jira issue/task integration and <a href="http://docs.codehaus.org/display/SONAR/Installing+Sonar+Eclipse" target="_blank">Sonar IDE</a> to see all the technical debt right in your IDE where you need it the most)</li>
<li>VCS: <a href="http://git-scm.com/" target="_blank">Git</a>/<a href="http://mercurial.selenic.com/" target="_blank">Mercurial</a> (I am undecided on this one)</li>
<li>Build: <a href="http://maven.apache.org/" target="_blank">Maven</a></li>
<li>CI: <a href="http://hudson-labs.org/" target="_blank">Hudson</a> (soon to be <a href="http://jenkins-ci.org/" target="_blank">Jenkins</a>)</li>
<li>Repository Manager: <a href="http://nexus.sonatype.org/" target="_blank">Nexus</a></li>
<li>Quality Analysis: <a href="http://www.sonarsource.org/" target="_blank">Sonar</a></li>
<li>Deployment: <a href="http://cargo.codehaus.org/Home" target="_blank">Cargo</a> (for deploying to an application server) + <a href="http://vagrantup.com/" target="_blank">Vagrant</a>/<a href="http://www.puppetlabs.com/" target="_blank">Puppet</a> (for creating, provisioning and managing environments)</li>
<li>Monitoring: <a href="http://www.splunk.com/" target="_blank">Splunk</a></li>
</ul>
<p><a class="twitter-share-button" href="http://twitter.com/share">Tweet this</a></p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/cargo/'>Cargo</a>, <a href='http://qualityswdev.com/tag/confluence/'>Confluence</a>, <a href='http://qualityswdev.com/tag/continuous-integration/'>Continuous Integration</a>, <a href='http://qualityswdev.com/tag/distributed-ci/'>Distributed CI</a>, <a href='http://qualityswdev.com/tag/eclipse/'>Eclipse</a>, <a href='http://qualityswdev.com/tag/git/'>Git</a>, <a href='http://qualityswdev.com/tag/hudson/'>Hudson</a>, <a href='http://qualityswdev.com/tag/jenkins/'>Jenkins</a>, <a href='http://qualityswdev.com/tag/jira/'>Jira</a>, <a href='http://qualityswdev.com/tag/maven/'>Maven</a>, <a href='http://qualityswdev.com/tag/mercurial/'>Mercurial</a>, <a href='http://qualityswdev.com/tag/nexus/'>Nexus</a>, <a href='http://qualityswdev.com/tag/puppet/'>Puppet</a>, <a href='http://qualityswdev.com/tag/sonar/'>Sonar</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/336/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/336/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/336/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/336/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/336/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/336/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/336/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/336/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/336/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/336/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/336/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/336/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/336/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/336/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=336&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2011/02/02/distributed-ci-how-it-could-work/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://qualityswdev.files.wordpress.com/2011/01/bildschirmfoto-2011-01-08-um-22-27-122.png" medium="image">
			<media:title type="html">DCI dev machine</media:title>
		</media:content>

		<media:content url="http://qualityswdev.files.wordpress.com/2011/01/dci-central-server.png" medium="image">
			<media:title type="html">DCI - central server</media:title>
		</media:content>
	</item>
		<item>
		<title>Hudson is dead. Long live Jenkins.</title>
		<link>http://qualityswdev.com/2011/01/11/hudson-is-dead-long-live-jenkins/</link>
		<comments>http://qualityswdev.com/2011/01/11/hudson-is-dead-long-live-jenkins/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 18:05:56 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Jenkins]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=443</guid>
		<description><![CDATA[Watch out. There is a new butler in town. Today the Hudson community representatives in the negotiations with Oracle announced that Hudson is likely to be renamed to Jenkins. The proposal also suggests to move all infrastructure off Oracle&#8217;s servers. This will be decided in the next few days, after Oracle&#8217;s expected proposal later this <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=443&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Watch out. There is a new butler in town. Today the Hudson community representatives in the negotiations with Oracle <a href="http://www.hudson-labs.org/content/hudsons-future" target="_blank">announced</a> that Hudson is likely to be renamed to <strong>Jenkins</strong>. The proposal also suggests to move all infrastructure off Oracle&#8217;s servers. This will be decided in the next few days, after Oracle&#8217;s expected proposal later this week.</p>
<p>I think this is the only sensible thing to do, because as soon as Oracle&#8217;s lawyers are done with suing everyone else they will try to extract money out of Hudson. The sooner Jenkins is completely independent, the better.</p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/hudson/'>Hudson</a>, <a href='http://qualityswdev.com/tag/jenkins/'>Jenkins</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/443/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=443&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2011/01/11/hudson-is-dead-long-live-jenkins/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>
	</item>
		<item>
		<title>Why distributed CI is the logical next step</title>
		<link>http://qualityswdev.com/2010/12/15/why-distributed-ci-is-the-logical-next-step/</link>
		<comments>http://qualityswdev.com/2010/12/15/why-distributed-ci-is-the-logical-next-step/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 15:31:09 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Distributed CI]]></category>
		<category><![CDATA[Hudson]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=415</guid>
		<description><![CDATA[It has become a best practice to run a private build on the developer machine before committing a change to the central source repository to minimize broken CI builds. Despite being a sensible measure to improve the development process this practice has always bugged me, because it is an extra manual step. In my opinion <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=415&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://qualityswdev.files.wordpress.com/2010/12/distributed.jpg"><img class="alignleft size-thumbnail wp-image-417" style="margin:5px;" title="distributed" src="http://qualityswdev.files.wordpress.com/2010/12/distributed.jpg?w=135&#038;h=89" alt="" width="135" height="89" /></a>It has become a best practice to run a private build on the developer machine before committing a change to the central source repository to minimize broken CI builds. Despite being a sensible measure to improve the development process this practice has always bugged me, because it is an extra manual step. In my opinion automating this step is one of the <a href="http://qualityswdev.com/2010/09/19/continuous-integration-ci-the-missing-pieces/">missing pieces</a> for a better CI process.</p>
<p>Most of us (should) have got used to the following five steps when changing/adding a piece of code:</p>
<ol>
<li>Save/commit your changes in your IDE</li>
<li>Run the unit tests that cover the changed area</li>
<li>Run a private local build</li>
<li>Push your changes to the master repository</li>
<li>Your CI tool automatically picks up the changes and executes your deployment pipeline</li>
</ol>
<p>You also probably didn&#8217;t execute steps three and four every time you did step one. Mostly not because it wouldn&#8217;t make sense to do so, but because these steps are time consuming. I believe that only the first step should be manual, all others can be triggered by their previous step.</p>
<ol>
<li>Save/commit your changes in your IDE</li>
<li>Your IDE <strong>automatically</strong> runs the necessary unit tests (e.g. with <a href="http://www.threeriversinstitute.org/junitmax/" target="_blank">JUnit Max</a> or <a href="http://improvingworks.com/products/infinitest/" target="_blank">Infinitest</a>)</li>
<li>Your distributed CI tool <strong>automatically</strong> pulls the latest changes from the master repository and runs a local build</li>
<li>Your distributed CI tool <strong>automatically</strong> pushes the changes to the master repository</li>
<li>Your central CI tool <strong>automatically</strong> picks up the changes and executes your deployment pipeline</li>
</ol>
<p>When practicing rigorous TDD one could even argue that not even the first step needs to be manual. The first two steps could be switched around and your IDE could run the unit tests whenever the code compiles and then automatically save your changes when all unit tests are green.</p>
<ol>
<li>Your IDE <strong>automatically</strong> runs the necessary unit tests whenever the code compiles</li>
<li>Your IDE <strong>automatically</strong> commits your changes when all unit tests are green</li>
<li>Your distributed CI tool <strong>automatically</strong> pulls the latest changes from the master repository and runs a local build</li>
<li>Your distributed CI tool <strong>automatically</strong> pushes the changes to the master repository</li>
<li>Your CI tool <strong>automatically</strong> picks up the changes and executes your deployment pipeline</li>
</ol>
<p>No more manual steps at all. Just pure coding. It will be a bright future.</p>
<p>I set up the distributed CI part by installing a <a href="http://hudson-labs.org/node">Hudson</a> instance on my developer machine and another one on my CI server. When my local Hudson detects a change to my local Git repository it runs jobs to pull the latest changes from the master repository and update my clone, then executes a commit build and finally pushes the changes to the master repository, where the other Hudson instance runs the full deployment pipeline, including acceptance tests. This seems to work fine, but is of course quite a bit to set up and even harder to keep in sync without native tool support by Hudson.</p>
<p>P.S. I made a visual representation of how I am envisaging the development process with distributed CI. You can find it <a href="http://prezi.com/eellpeguyvgu/the-creation-of-software/">here</a>. I will probably explain the diagram in more detail in a follow up post.</p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/continuous-integration/'>Continuous Integration</a>, <a href='http://qualityswdev.com/tag/distributed-ci/'>Distributed CI</a>, <a href='http://qualityswdev.com/tag/hudson/'>Hudson</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/415/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/415/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/415/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=415&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2010/12/15/why-distributed-ci-is-the-logical-next-step/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://qualityswdev.files.wordpress.com/2010/12/distributed.jpg?w=150" medium="image">
			<media:title type="html">distributed</media:title>
		</media:content>
	</item>
		<item>
		<title>Continuous Integration (CI) &#8211; the missing pieces</title>
		<link>http://qualityswdev.com/2010/09/19/continuous-integration-ci-the-missing-pieces/</link>
		<comments>http://qualityswdev.com/2010/09/19/continuous-integration-ci-the-missing-pieces/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 06:43:43 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Hudson]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=368</guid>
		<description><![CDATA[Continuous Integration (CI) has been around for a while now, and is part of most decent development environments these days. It is certainly mature enough to not give you an excuse any more for not using it. Yet there are a few features that I haven&#8217;t found in any CI tool I have used so <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=368&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin:5px;" title="Make a wish dad" src="http://www.seenobjects.org/images/mediumlarge/2005-10-24-make-a-wish-dad.jpg" alt="" width="151" height="100" />Continuous Integration (CI) has been around for a while now, and is part of most decent development environments these days. It is certainly mature enough to not give you an excuse any more for not using it. Yet there are a few features that I haven&#8217;t found in any CI tool I have used so far, but that I would like to see implemented.</p>
<p>On top of my most wanted list is <strong>resource awareness</strong>. A resource aware CI tool would run builds depending on which resources are available at the time. I have my builds set up to run different categories of tests and I configured my CI tool so that:</p>
<ul>
<li>my unit test build runs on every commit to the version control system</li>
<li>integration tests, that require external systems like databases or the file system are run in a subsequent build, which gets triggered after a successful completion of the unit test build</li>
<li>functional tests, that require a deployed system are run on a set schedule, e.g. nightly (if there were any changes since the last build)</li>
</ul>
<p>This setup is by no means following any hard rules, and your own setup most likely differs from mine depending on your own needs. However, what I am fairly certain of is that you had to configure your CI tool of choice when to run your tests and that you probably don&#8217;t adjust these settings once you found one that seems to work for you. This might be fine in your eyes, but I think we can do better. What if your CI tool decided when to run tests depending on which resources are available to do so? Why not run your functional tests right now if some of your processors are idle? Why not postpone slower integration tests if there are more commit builds in the queue that are waiting to have their unit tests run? <a href="http://hudson-ci.org/" target="_blank">Hudson</a> made a step in this direction by automatically building multi module <a href="http://maven.apache.org/" target="_blank">Maven</a> projects in parallel if possible, but there is certainly a lot of room for improvement.</p>
<p>Closely related to the above is my desire for <strong>automatic test categorization</strong>. In order to run tests in different builds with different frequencies you need to split them up into separate categories. The main reason being to run the fastest tests first in order to receive feedback as quickly as possible. What if your CI tool did this for you? If a test runs under 200 milliseconds it&#8217;s probably a unit test. If a test accesses a database it&#8217;s at least an integration test. If a test is a Selenium test it is most certainly a functional test. With a set of rules like these the CI tool could split up your tests for you. This doesn&#8217;t mean you shouldn&#8217;t organize your tests in separate folders or packages, but it means that you don&#8217;t have to if you choose not to.</p>
<p>In addition to this categorization, I would like CI tools to be smarter about <strong>test execution order</strong>, similar to how <a href="http://www.threeriversinstitute.org/junitmax/" target="_blank">JUnit Max</a> or <a href="http://improvingworks.com/products/infinitest/" target="_blank">Infinitest</a> are doing this in your IDE. This means that previously failing tests run first; quicker tests run before slower tests; new ones before older and so forth. (<em>Update 1 July 2011:</em> Sometimes dreams do come true. Check out <a href="http://test-load-balancer.github.com/" target="_blank">Test Load Balancer</a>)</p>
<p>And last but not least I would like a <strong>visual presentation</strong> of where my builds are at, which I have described in a <a href="http://qualityswdev.com/2010/05/15/deployments-should-be-non-events/" target="_blank">previous post</a> in more detail. <a href="http://www.thoughtworks-studios.com/go-agile-release-management/features-benefits" target="_blank">Go</a>&#8216;s deployment pipelines are so far the best solution that I have seen in this respect.</p>
<p>Oh yeah, one more thing. If you have been practicing CI for a while you know that broken builds have to be fixed right away. In order to achieve this everyone gets notified as soon as the build breaks. Alarms go off, lights are flashing and emails and SMSes are sent out. Everyone gets interrupted. To avoid this undesirable event it has become common practice for developers to run a full build on their local machine before committing any code. This requires discipline by each and every developer though and I would prefer to see this automated. One way to achieve this could be a <strong>distributed CI </strong>environment, which could work as follows:</p>
<ul>
<li>On every commit/save to your local repository/workspace your local CI client performs an update from the central repository and runs all tests.</li>
<li>If no newer version is in the central repository you may configure to skip the unit tests if these are run by your IDE anyway.</li>
<li>On success a push/commit to the central repository is performed where the central CI server picks up the changes and runs configured builds.</li>
<li>All the way you receive unobtrusive feedback in your IDE. Only if your commit happens to break the build more interruptive measures are taken.</li>
</ul>
<p>For this to work efficiently with TDD, where you create failing tests all the time, the above mentioned smart test execution order is essential. Otherwise you keep running your entire unit test suite over and over again even though you already know that the test you just wrote is going to fail.</p>
<p>&#8216;But why all this?&#8217; you ask. There are two main objectives for the features described above: <strong>Minimizing manual work</strong> and <strong>speeding up feedback</strong>.</p>
<h6>Photo by <a href="http://www.seenobjects.org/2005-10-24-make-a-wish-dad" target="_blank">Martin Kenny</a></h6>
<br /> Tagged: <a href='http://qualityswdev.com/tag/continuous-integration/'>Continuous Integration</a>, <a href='http://qualityswdev.com/tag/hudson/'>Hudson</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/368/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/368/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/368/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=368&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2010/09/19/continuous-integration-ci-the-missing-pieces/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://www.seenobjects.org/images/mediumlarge/2005-10-24-make-a-wish-dad.jpg" medium="image">
			<media:title type="html">Make a wish dad</media:title>
		</media:content>
	</item>
		<item>
		<title>Deployments should be non-events</title>
		<link>http://qualityswdev.com/2010/05/15/deployments-should-be-non-events/</link>
		<comments>http://qualityswdev.com/2010/05/15/deployments-should-be-non-events/#comments</comments>
		<pubDate>Sat, 15 May 2010 04:55:43 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Release Management]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=308</guid>
		<description><![CDATA[The problem with &#8220;traditional&#8221; release management I say &#8220;traditional&#8221; release management for the lack of a better categorisation. What I mean by that is having separate phases (and teams) for development, system test, user acceptance test (UAT) and finally production. The problem is that it just takes too long after the developer commits his code <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=308&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h4>The problem with &#8220;traditional&#8221; release management</h4>
<p>I say &#8220;traditional&#8221; release management for the lack of a better categorisation. What I mean by that is having separate phases (and teams) for development, system test, user acceptance test (UAT) and finally production. The problem is that <strong>it just takes too long</strong> after the developer commits his code until it gets eventually deployed to production. In my experience, this is mostly due to delays in hand offs from one phase to another. And as we all know, thanks to <a href="http://www.poppendieck.com/papers/LeanThinking.pdf" target="_blank">Lean Thinking</a> this is waste.</p>
<h4>Why you (as a developer) should care</h4>
<p>The deployments to these different environments are usually <strong>stressful</strong>, because they bare some amount of risk of taking down the system you are deploying to. And the closer you get to production, the higher the penalty for doing so becomes. Because of this risk, deployments usually take place when potential problems would have the least impact on the users of these environments, which in general happens to be <strong>out of business hours</strong>. And last but not least, deployments tend to be <strong>boring and tedious</strong> tasks. Or did you ever get excited about doing a release? Yeah, that&#8217;s what I thought.</p>
<p><strong>Why you (as a manager) should care</strong></p>
<p>Of course, you also care about the factors mentioned above, because you want your developers to be as happy as possible, right? But furthermore, you especially dislike the <strong>risks </strong>associated with deployments, because you have to factor them into all sorts of calculations. Additionally, all these delays between phases mean that your <strong>time to market for new features and bug fixes is way higher than it needs to be</strong>, which means you are <strong>loosing money</strong>. Constantly.</p>
<h4>The obvious solution</h4>
<p>It&#8217;s easy, right? The answer is <a href="http://radar.oreilly.com/2009/03/continuous-deployment-5-eas.html" target="_blank">continuous deployment</a>. You fully automate your testing and deployment and you <strong>deploy straight to production after every commit</strong>. Sounds great. The problem is: Most organisations are not ready for full test automation or just not willing to give up manual testing. This may be for security or legal reasons, potential loss of revenue and/or reputation or something else. Bottom line is: <strong>Pure continuous deployment into production without any manual testing is not widely accepted.</strong> Period. I am not saying this goal is not worth aiming for. Trust me, I am all for it. I just don&#8217;t see it happening in the near future in most companies. In my opinion, the only way to practice continuous deployment into production is by having sophisticated real-time alerting combined with a system with built- in resilience. This would allow you to automatically detect and back out a failed deployment without an interruption of the system as a whole. Have a read of this <a href="http://eng.kaching.com/2010/05/deployment-infrastructure-for.html" target="_blank">blog post</a> about how the guys at kaChing managed to achieve this.</p>
<h4>A step in the right direction</h4>
<p>Don&#8217;t worry, not all is lost. Even if continuous deployment is not achievable for you right now, that doesn&#8217;t mean you can&#8217;t improve your situation at all. You can take the first steps towards continuous deployment by <strong>decreasing the batch size</strong> of deployments and <strong>automating the deployment and hand-offs</strong> between the environments.</p>
<ul>
<li>Decreasing the batch size should be easily achieved by just allowing automatic deployments into your first test environment. Only, of course, after a successful build that runs all your automated tests.</li>
<li>Automating the deployment may require some tailored scripts to suit your system. However, if you are using <a href="http://hudson-ci.org/" target="_blank">Hudson</a> and your deployment artifact is a war or ear file you can use the <a href="http://wiki.hudson-ci.org/display/HUDSON/Deploy+Plugin" target="_blank">deploy plugin</a>, which is based on <a href="http://cargo.codehaus.org/" target="_blank">Cargo</a>.</li>
<li>Automating the hand-offs could be achieved by using a central release management dashboard that is used by developers, testers and managers.</li>
</ul>
<p>So far I haven&#8217;t found any Hudson plugin that would provide this. What I have in mind is something like the following:</p>
<ul>
<li>Deployments can be configured to happen automatically or to require manual approval.</li>
<li>When deployment to an environment finishes, a configured set of people gets notified</li>
<li>The different environments where the application is running can be accessed directly from the dashboard</li>
<li>When approving a build, and all previous builds have been approved as well (there might be dependencies), deploy to next environment.</li>
<li>When rejecting a build
<ol>
<li>A tester raises one or more issues for the build. The issue tracking system is tightly integrated in the dashboard and can be reached via a link, which pre-fills relevant fields about the current build and project. This automatically rejects the build.</li>
<li>The developer that committed the change that triggered the rejected build gets notified.</li>
<li>The developer fixes the issue (after creating a failing test to expose it, of course).</li>
<li>The developer commits the fix with reference to the issue in the commit comment. This triggers a new automatic build, plus an automatic update of the issue and a notification to the tester who raised it (like the <a href="http://trac-hacks.org/wiki/TracSvnPoliciesPlugin" target="_blank">Trac SVN Policies Plugin</a>).</li>
<li>When the tester approves the new build the old build gets automatically approved as well, if this was the last outstanding issue for the old build.</li>
</ol>
</li>
</ul>
<p>In my mind it looks somewhat like this (click image to enlarge):</p>
<p style="text-align:center;"><a href="http://qualityswdev.files.wordpress.com/2010/05/releasemanagement1.png"><img class="aligncenter size-full wp-image-316" title="ReleaseManagement" src="http://qualityswdev.files.wordpress.com/2010/05/releasemanagement1.png?w=510" alt="Release Management Dashboard"   /></a></p>
<p>In order to do pure continuous deployment you could then configure the dashboard with only one environment (=production)  with automatic deployment. You can, however, choose to set up as many  intermediate environments as you like and also require manual approval of  deployments to any of them.</p>
<p><strong>Does anyone know if a Hudson plugin with this functionality exists or is in the making?</strong></p>
<p>With this in place I believe deployments can be non-events, in the meaning of being effortless and stress free. This does <strong>not </strong>mean you should stop celebrating your releases, though.</p>
<br /> Tagged: <a href='http://qualityswdev.com/tag/continuous-deployment/'>Continuous Deployment</a>, <a href='http://qualityswdev.com/tag/hudson/'>Hudson</a>, <a href='http://qualityswdev.com/tag/release-management/'>Release Management</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/308/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/308/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/308/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=308&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2010/05/15/deployments-should-be-non-events/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://qualityswdev.files.wordpress.com/2010/05/releasemanagement1.png" medium="image">
			<media:title type="html">ReleaseManagement</media:title>
		</media:content>
	</item>
		<item>
		<title>Java Build Server</title>
		<link>http://qualityswdev.com/2010/01/23/java-build-server/</link>
		<comments>http://qualityswdev.com/2010/01/23/java-build-server/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 04:01:17 +0000</pubDate>
		<dc:creator>Manuel Küblböck</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Build Server]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Sonar]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://qualityswdev.com/?p=85</guid>
		<description><![CDATA[Update [15.05.2010]: I finally had a chance to try out SecureCI, which is pretty much exactly what I described in this post. The guys from Coveros did a great job, so I suggest after reading this post you head over to their website, download SecureCI and give it a go. Thanks John for pointing this <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=85&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin:5px;" src="http://farm4.static.flickr.com/3452/3204450759_acf201a8f8_m.jpg" alt="" width="144" height="108" /></p>
<p><strong>Update [15.05.2010]:</strong> I finally had a chance to try out <a href="http://www.coveros.com/research/research_stack.php" target="_blank">SecureCI</a>, which is pretty much exactly what I described in this post. The guys from Coveros did a great job, so I suggest after reading this post you head over to their website, download SecureCI and give it a go. Thanks John for pointing this out to me.</p>
<p>In my last Java project, I set up a <strong>build server with Continuous Integration (CI) capability</strong>. I am a big fan of Test Driven Development (TDD) and I quite enjoyed <a href="http://hudson-ci.org/" target="_blank">Hudson</a> telling us right away when someone checked in code that broke the build. It just gives you so much more confidence in your code and keeps it releasable at all times. In addition, we used <a href="http://sonar.codehaus.org/" target="_blank">Sonar</a> to measure the quality of our code. I found it quite interesting to study how the different metrics changed over the course of the project. We paid particular attention to code coverage and tried to keep it as close to 100% as possible. This should happen naturally anyway if you are practicing TDD.</p>
<p>Setting all this up was a good experience to learn how it all fits together &#8211; But I learned my lesson and I don&#8217;t really want to do it over and over again. So, I started looking for a <strong>Virtual Appliance</strong> that had most, if not all, of these capabilities. Setting up a build server must have been done by other developers a million times before. Surely, someone along the way stuck it all on a Virtual Machine (VM) and made it open source, right? Well, that&#8217;s what I thought, but I couldn&#8217;t find any. So, I decided to create one myself. Unfortunately, I am lacking the hardware to do so at the moment. I have even already created a project for it on <a title="Java Build Server" href="https://launchpad.net/java-build-server" target="_blank">https://launchpad.net/java-build-server</a>. Although, I haven&#8217;t come around to create the VM yet, I still wanted to share my idea here to maybe animate someone else to go ahead and give it a go. So here it is: my idea of a Java build server.</p>
<p>I planned to start with what I think of as a good enough build server: A VM based on <strong><a class="zem_slink" title="Ubuntu" rel="homepage" href="http://www.ubuntu.com/">Ubuntu</a></strong> Server <strong><a title="Just enough operating system" rel="wikipedia" href="http://en.wikipedia.org/wiki/Just_enough_operating_system" target="_blank">JeOS</a></strong> with pre-configured installations of <strong><a rel="homepage" href="http://subversion.tigris.org/" target="_blank">Subversion</a></strong> (Source Control), <strong><a href="http://www.vmware.com/products/server/" target="_blank">Hudson</a></strong> (Continuous Integration), <strong><a href="http://sonar.codehaus.org/" target="_blank">Sonar</a></strong> (Quality Metrics), <strong><a class="zem_slink" title="MySQL" rel="homepage" href="http://www.mysql.com/">MySQL</a></strong> (to store Quality Metrics), <strong><a href="maven.apache.org/" target="_blank">Maven</a></strong> (Build) and <strong><a href="http://nexus.sonatype.org/" target="_blank">Nexus</a></strong> (Enterprise Maven Repository). Once this is all working I am going to also <a href="http://trac.edgewall.org/wiki/TracInstall" target="_blank">install</a> <strong><a href="http://trac.edgewall.org/" target="_blank">Trac</a></strong> (Wiki and issue tracking system). You might of course have your own preferences for tools to use for the tasks listed above. Feel free to swap out whatever tool you wish. You might already have an enterprise Maven repository. Fine, just use your existing one. All I am saying is, these tools will be on my build server VM; pre-configured as much as possible with standards found in the tools&#8217; documentation, following the <a href="http://en.wikipedia.org/wiki/Convention_over_configuration" target="_blank"><strong>convention over configuration</strong></a> paradigm.</p>
<h4>Creating the VM</h4>
<p>Here is how I am planning to create my Java build server VM. I am using <a href="http://www.vmware.com/appliances/getting-started/learn/vmware_studio.html" target="_blank">VMware Studio</a> to create the VM. VMware Studio is a Virtual Appliance itself and I deployed it in <a href="http://www.vmware.com/products/server/" target="_blank">VMware Server 2.0</a>. First I created a basic VM based on Ubuntu 8.04.1. Studio automatically installs VMware tools and embeds an in-guest management component called Virtual Appliance Management Infrastructure (VAMI), which lets you configure the network settings of your VM after it has been built. This is essential, since you want your development team to be able to connect to your copy of the build server VM. Here is a list of the essential settings I used to create the base VM:</p>
<ul>
<li>ubuntu-8.04.1-dvd-i386</li>
<li>1 CPU</li>
<li>512 MB RAM</li>
<li>8 GB</li>
<li>Network settings: DHCP (to automatically find an IP address)</li>
<li>Target format: zip</li>
</ul>
<p>After the build finished, I downloaded the zipped VM and deployed it on my VMware Server instance. I started the VM and assigned it a static IP address on the boot screen. I logged in and carried out the following steps:</p>
<ul>
<li>Update Ubuntu (sudo apt-get update &amp;&amp; sudo apt-get upgrade)</li>
<li><a href="https://help.ubuntu.com/community/Repositories/CommandLine" target="_blank">Add the universe and multiverse Ubuntu repositories</a></li>
<li><a href="http://www.howtogeek.com/howto/linux/installing-tomcat-6-on-ubuntu/" target="_blank">Install Java and Tomcat</a> (with admin packages)</li>
<li><a href="http://odyniec.net/articles/ubuntu-subversion-server/" target="_blank">Install Subversion</a> (SVN)</li>
<li><a href="http://www.sonatype.com/books/maven-book/reference/installation-sect-maven-linux.html" target="_blank">Install Maven</a></li>
<li><a href="https://help.ubuntu.com/8.04/serverguide/C/mysql.html" target="_blank">Install MySQL</a></li>
<li><a href="http://hudson-ci.org/" target="_blank">Deploy Hudson</a> to Tomcat</li>
<li><a href="http://docs.codehaus.org/display/SONAR/Install+Sonar" target="_blank">Deploy Sonar</a> to Tomcat</li>
<li><a href="http://www.sonatype.com/books/nexus-book/reference/ch02s02.html" target="_blank">Deploy Nexus</a> to Tomcat</li>
</ul>
<h4>Using the VM</h4>
<p>Of course there are some project and company specific configurations that cannot be set in advance. Here is what is left to do:</p>
<ul>
<li>Install a VM container on a server (e.g. <a href="http://www.vmware.com/products/server/" target="_blank">VMware Server</a>)</li>
<li><a href="https://launchpad.net/java-build-server" target="_blank">Download</a> and start the VM in your container</li>
<li>Set the network details on the boot screen</li>
<li>Add your developers as users to Subversion (in /usr/local/svn/passwd-team)</li>
<li>Create a project</li>
<li>Create Hudson jobs to monitor your project</li>
</ul>
<h4><strong>What&#8217;s next?</strong></h4>
<p>To make using this Java build server even easier I am also planning to create the following:</p>
<ul>
<li>a <strong><a href="http://maven.apache.org/plugins/maven-archetype-plugin/" target="_blank">Maven archetype</a></strong> that only needs the IP address of the build server to be configured</li>
<li>a <strong>script to create a new project</strong> on the build server (create SVN project, create Hudson jobs, etc.)</li>
</ul>
<h6>Image by <a href="http://www.flickr.com/photos/44124412397@N01/3204450759">indigoprime</a> via Flickr</h6>
<br /> Tagged: Build Server, Continuous Integration, Hudson, Java, Maven, Nexus, Sonar, Subversion, Ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/qualityswdev.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/qualityswdev.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/qualityswdev.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=qualityswdev.com&amp;blog=10101488&amp;post=85&amp;subd=qualityswdev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://qualityswdev.com/2010/01/23/java-build-server/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9e8234609df154fdd93a08a885103a16?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">kueblboe</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3452/3204450759_acf201a8f8_m.jpg" medium="image" />
	</item>
	</channel>
</rss>
