<?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>Principia &#187; Build Management</title>
	<atom:link href="http://blog.principia-it.co.uk/category/itslm/build-management/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.principia-it.co.uk</link>
	<description>Power from Simplicity</description>
	<lastBuildDate>Tue, 07 Feb 2012 07:40:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.principia-it.co.uk' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/6f78c9f4917c134dd89eb02c5ec6e5d8?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Principia &#187; Build Management</title>
		<link>http://blog.principia-it.co.uk</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.principia-it.co.uk/osd.xml" title="Principia" />
	<atom:link rel='hub' href='http://blog.principia-it.co.uk/?pushpress=hub'/>
		<item>
		<title>Building a CM system using Atlassian</title>
		<link>http://blog.principia-it.co.uk/2011/05/07/building-a-cm-system-using-atlassian/</link>
		<comments>http://blog.principia-it.co.uk/2011/05/07/building-a-cm-system-using-atlassian/#comments</comments>
		<pubDate>Sat, 07 May 2011 15:17:30 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Build Management]]></category>
		<category><![CDATA[Change Management]]></category>
		<category><![CDATA[CMCrossroads]]></category>
		<category><![CDATA[Configuration Management]]></category>
		<category><![CDATA[Plain Old Blog]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Software Configuration Management]]></category>

		<guid isPermaLink="false">http://blog.principia-it.co.uk/?p=911</guid>
		<description><![CDATA[I&#8217;m usually somewhat reluctant to make recommendations about specific tools, but every now and then something impresses me so much I feel I should at least draw attention to it. In the course of helping a client look for tools to support their development process I recalled that a couple of years ago I looked [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=911&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m usually somewhat reluctant to make recommendations about specific tools, but every now and then something impresses me so much I feel I should at least draw attention to it.</p>
<p>In the course of helping a client look for tools to support their development process I recalled that a couple of years ago I looked briefly at <a href="http://www.atlassian.com/software/jira/">JIRA</a> when building a change control system for another client. So, I suggested we look at JIRA as a possible tool for this new system.</p>
<p>Having looked around the JIRA site I noticed that Atlassian had also taken <a href="http://www.atlassian.com/software/fisheye/">FishEye</a> (a tool I had used before for providing viewing and analysis tools on repositories) into their stable. And they also support a whole suite of integrated tools that can be used individually or together.</p>
<p>I suggested we take a closer look. So, we set about creating a very simple demonstration of the tools.</p>
<p>I have to say, &#8216;I&#8217;m impressed&#8217;.</p>
<p>These are great looking, well integrated, easy to use, easy to set up and very competitively priced tools. Based on a couple of months playing around with them, I&#8217;d have absolutely no difficulty recommending them to organisations of almost any size—certainly they should be on your list of tools to look at.</p>
<p>Not only are the tools themselves very flexible and easy to configure but the company seems very keen to hear from their customers. They have open beta programmes and actively encourage users to take part in product development (they really do want to know what their customers want). They also provide really low cost licenses; up to 90 days evaluation licenses and then for small teams (or individuals) they offer 10 user licenses for $10. Seriously! This is a brilliant move. It means freelance consultants (such as your&#8217;s truly) can actually use their tools and develop for them, without needing to remortgage the house to obtain licenses. (The tools also don&#8217;t require a massive hardware commitment—in fact I&#8217;m running a system on a Linux virtual machine on my Mac Pro  and it works great for development and creating documentation/training material.)</p>
<p>Oh, and if you&#8217;re a non-profit or open source organisation they will let you have unlimited licenses for free! Genius.</p>
<p>Can&#8217;t be bothered with all that setup? Atlassian offer a hosted solution for many of their tools too. (Although I can&#8217;t comment on these as I have not tried them, but if they&#8217;re anything like as good as what I have seen so far, they&#8217;re probably worth looking at if you want a hosted solution.)</p>
<p>The price apart, the tools really are very good. And if they don&#8217;t do exactly what you want you can always write your own extensions. Atlassian publish comprehensive developer information and the tools all communicate through open web interfaces and all support a plugin architecture (which I understand Atlassian are working hard to make simpler to use).</p>
<p>Another promising sign is that Atlassian &#8216;eat their own dog food&#8217;. They user all their own tools internally and pride themselves on being the guinea pigs for all their product development. Their own website and online documentation is all run through their own products.</p>
<p>Even better! Atlassian let their product speak for itself. No annoying salespeople calling, no pressure to come along and &#8216;do a demo&#8217;. They just provide you with a really simple way to download their product, get an evaluation license, and then let the product do the selling (no kidding I had downloaded, installed and licensed JIRA in about ten minutes—it took about a day to install, license and integrate the entire suite). Brilliant! [Note to all vendors: if you're product is good then let it speak for you. If you're product needs to be explained, then make it better, provide good online documentation, and provide help when it's requested. I understand that some customer like a demo, but many just want to try out your product for themselves. After all, if it can't be setup and used by their own staff, what hope is there for the future? They just end up being highly dependent on your consulting services. Oh. I think I get it now.]</p>
<p>If, as seems likely, the client goes ahead with this solution I&#8217;ll be sure to report back on how these products perform under real life conditions, but for now, <a href="http://altassian.com">go take a look</a>.</p>
<br />Filed under: <a href='http://blog.principia-it.co.uk/category/itslm/build-management/'>Build Management</a>, <a href='http://blog.principia-it.co.uk/category/itslm/change-management/'>Change Management</a>, <a href='http://blog.principia-it.co.uk/category/cmcrossroads/'>CMCrossroads</a>, <a href='http://blog.principia-it.co.uk/category/itslm/configuration-management/'>Configuration Management</a>, <a href='http://blog.principia-it.co.uk/category/plain-old-blog/'>Plain Old Blog</a>, <a href='http://blog.principia-it.co.uk/category/reviews/'>Reviews</a>, <a href='http://blog.principia-it.co.uk/category/itslm/configuration-management/software-configuration-management/'>Software Configuration Management</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/principiait.wordpress.com/911/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/principiait.wordpress.com/911/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/principiait.wordpress.com/911/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/principiait.wordpress.com/911/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/principiait.wordpress.com/911/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/principiait.wordpress.com/911/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/principiait.wordpress.com/911/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/principiait.wordpress.com/911/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/principiait.wordpress.com/911/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/principiait.wordpress.com/911/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/principiait.wordpress.com/911/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/principiait.wordpress.com/911/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/principiait.wordpress.com/911/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/principiait.wordpress.com/911/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=911&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.principia-it.co.uk/2011/05/07/building-a-cm-system-using-atlassian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/41c439c6892b6a1b53ea8c1686324b4c?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Principia IT</media:title>
		</media:content>
	</item>
		<item>
		<title>Keeping configuration separate in ANT</title>
		<link>http://blog.principia-it.co.uk/2010/10/21/keeping-configuration-separate-in-ant/</link>
		<comments>http://blog.principia-it.co.uk/2010/10/21/keeping-configuration-separate-in-ant/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 11:21:19 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[ANT]]></category>
		<category><![CDATA[Build Management]]></category>
		<category><![CDATA[Plain Old Blog]]></category>

		<guid isPermaLink="false">http://blog.principia-it.co.uk/?p=788</guid>
		<description><![CDATA[Actually, this advice holds for any software system, but in this article I am focussing on ANT. One often sees, in ANT scripts, something like this at the head of the build.xml file. So far, so good. The author of this ANT script has thought to define properties that control the script&#8217;s behaviour at the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=788&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Actually, this advice holds for any software system, but in this article I am focussing on ANT.</p>
<p>One often sees, in ANT scripts, something like this at the head of the <span class="code">build.xml</span> file.</p>
<p><pre class="brush: xml;">
&lt;project name=&quot;myproj&quot;&gt;
    &lt;property name=&quot;buildroot.dir&quot; location=&quot;${basedir}/..&quot;/&gt;
    &lt;property name=&quot;source.dir&quot; location=&quot;${buildroot.dir}/src&quot;/&gt;
    &lt;property name=&quot;bin.dir&quot; location=&quot;${buildroot.dir}/bin&quot;/&gt;

    &lt;property name=&quot;bld.package&quot; value=&quot;true&quot;&gt;
</pre></p>
<p>So far, so good. The author of this ANT script has thought to define properties that control the script&#8217;s behaviour at the start of the script. This means that, should circumstances change, it is relatively easy to change the script&#8217;s behaviour. So, should it be decided that the <span class="code">bin</span> directory should be moved to another location, we simply change the definition of the <span class="code">bin.dir</span> property and no other changes are necessary in the script.</p>
<p>Another, not so obvious, advantage of this approach is that these properties can be easily changed by defining the properties outside the script (passed on the command line, e.g. <span class="code">ant -Dbin.dir=special/bin</span> or by some client script, e.g. a call from CruiseControl), either way, the property defined will not be overridden by the script because <span class="code">&lt;property&gt;</span> never redefines a property once it is set. Neat.</p>
<p>The problem with putting properties in the <span class="code">build.xml</span> file itself makes them more difficult to access from other ANT scripts.</p>
<p>Suppose I have another ANT script that I want to interact with the same build system. I want to ensure that the script can pick up the configuration information (things like the directories the build system is using or settings that dictate build behaviour like the <span class="code">bld.package</span> property). If these are defined in the <span class="code">build.xml</span> then accessing them is tricky. If, however, they are defined in their own file I can simply load that &#8216;configuration&#8217; file separate to the <span class="code">build.xml</span> but be confident that the settings are the same as were used by the build itself.</p>
<p>There are two approaches to isolating configuration from the scripts that use them; use another ANT file and <span class="code">&lt;include&gt;</span> or <span class="code">&lt;import&gt;</span> it, or I can use a property file, e.g. <span class="code">build.properies</span> and <span class="code">&lt;property file=&quot;build.properties&quot;&gt;</span> or <span class="code">&lt;loadproperties srcfile=&quot;build.properties&quot;&gt;</span> it into a script. The approach you take will depend upon the sort of information you want in your configuration, where you are likely to use it, and how much flexibility you need.</p>
<p>Personally I prefer <span class="code">&lt;loadproperties srcfile=&quot;build.properties&quot;&gt;</span> for most purposes and I use <span class="code">&lt;include&gt;</span> as a wrapper when I need special configuration that is not accessible through the more direct <span class="code">build.properies</span> format.</p>
<p>So, I might have the following in my main <span class="code">build.xml</span>.</p>
<p><pre class="brush: xml;">
&lt;project name=&quot;myproj&quot;&gt;
    &lt;include file=&quot;config.xml&quot;/&gt;
</pre></p>
<p>And then, in the <span class="code">config.xml</span> I might have the following.</p>
<p><pre class="brush: xml;">
&lt;project name=&quot;myproj.config&quot;&gt;
    &lt;loadproperties srcfile=&quot;build.properties&quot;/&gt;

    &lt;defaultexcludes add=&quot;**/*.bak&quot;&gt;
&lt;/project&gt;
</pre></p>
<p>The <span class="code">defaultexcludes</span> would me more difficult to set using a properties file, so I use the <span class="code">config.xml</span> here. I am using <span class="code">&lt;loadproperties&gt;</span> here, but could have used <span class="code">&lt;properties file=&quot;&quot;&gt;</span>.  <span class="code">&lt;loadproperties&gt;</span> provides some extra flexibility because it supports filterchains, but that&#8217;s a topic for another post. I just feel that  <span class="code">&lt;loadproperties&gt;</span> describes better what the script is doing, but as I say, in this case, it&#8217;s a matter of personal preference.</p>
<p>And finally, in the <span class="code">build.properties</span> I might have the following.</p>
<p><pre class="brush: plain;">
buildroot.dir=${basedir}/..
source.dir=${buildroot.dir}/src
bin.dir=${buildroot.dir}/bin

bld.package=true
</pre></p>
<p>Now the <span class="code">build.properties</span> are available in a simple form to be loaded into any script that needs this project&#8217;s main configuration. The <span class="code">config.xml</span> provides additional configuration that I may want to load but is not available in the property file format, and is often not relevant to basic configuration information such as locations. I can also use the <span class="code">config.xml</span> to perform more advanced scripting of configuration if needed.</p>
<div class="sidebar">
A note of caution: when using this approach you need to be careful that the <span class="code">basedir</span> property is correctly set before loading the <span class="code">build.properties</span>, otherwise all your paths will be wrong.
</div>
<p>I find that this approach of breaking out configuration into separate files according to both its function and how I think it will be accessed has saved me a lot of work over the years. It also disciplines me into thinking about how my builds should be configured and encourages me to keep all the configuration information in one place (if I find myself tempted to use a <span class="code">&lt;property&gt;</span> to define a location or simple string in my main <span class="code">build.xml</span> I ask myself, would this be better in the <span class="code">build.properties</span>? It generally is.)</p>
<p>Keeping configuration separate also makes the main <span class="code">build.xml</span> much easier to reuse. Just copy the build system into the new project, change the <span class="code">build.properties</span> and, assuming you&#8217;ve written your <span class="code">build.xml</span> well, everything should work without further change.</p>
<br />Filed under: <a href='http://blog.principia-it.co.uk/category/tools-n-tips/ant/'>ANT</a>, <a href='http://blog.principia-it.co.uk/category/itslm/build-management/'>Build Management</a>, <a href='http://blog.principia-it.co.uk/category/plain-old-blog/'>Plain Old Blog</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/principiait.wordpress.com/788/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/principiait.wordpress.com/788/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/principiait.wordpress.com/788/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/principiait.wordpress.com/788/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/principiait.wordpress.com/788/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/principiait.wordpress.com/788/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/principiait.wordpress.com/788/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/principiait.wordpress.com/788/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/principiait.wordpress.com/788/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/principiait.wordpress.com/788/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/principiait.wordpress.com/788/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/principiait.wordpress.com/788/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/principiait.wordpress.com/788/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/principiait.wordpress.com/788/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=788&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.principia-it.co.uk/2010/10/21/keeping-configuration-separate-in-ant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/41c439c6892b6a1b53ea8c1686324b4c?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Principia IT</media:title>
		</media:content>
	</item>
		<item>
		<title>When is a change a change?</title>
		<link>http://blog.principia-it.co.uk/2010/06/12/when-is-a-change-a-change/</link>
		<comments>http://blog.principia-it.co.uk/2010/06/12/when-is-a-change-a-change/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 17:27:04 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Build Management]]></category>
		<category><![CDATA[Change Management]]></category>
		<category><![CDATA[Configuration Management]]></category>
		<category><![CDATA[Plain Old Blog]]></category>
		<category><![CDATA[Software Configuration Management]]></category>
		<category><![CDATA[Version Control]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[CM]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[SCM]]></category>

		<guid isPermaLink="false">http://blog.principia-it.co.uk/?p=624</guid>
		<description><![CDATA[A change can be viewed in two ways; conceptually or literally. What I mean by this distinction is that when I say the requested change is to &#8220;correct spelling mistakes in the poem&#8221; I am specifying conceptually what the change is to achieve (and after the fact, what the change achieved). On the other hand [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=624&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A change can be viewed in two ways; conceptually or literally. What I mean by this distinction is that when I say the requested change is to &#8220;correct spelling mistakes in the poem&#8221; I am specifying conceptually what the change is to achieve (and after the fact, what the change achieved). On the other hand we are used to dealing with change in a more literal sense of as set of revisions, for example, &#8220;I edited file1 in this change&#8221;. In this post I discuss some of the issues and implications of these two views of change.<span id="more-624"></span></p>
<p>Let&#8217;s put this into concrete terms.</p>
<p>Suppose the original change request is something like, &#8220;correct the spelling mistakes in the poem&#8221; and the poem is held in two files. </p>
<p><span class="code">file1.txt</span> contains the following text.<br />
<pre class="brush: plain;">Mary hard a litl lamb,
It's fles was wite as snow,</pre></p>
<p>And <span class="code">file2.txt</span> contains the following text.<br />
<pre class="brush: plain;">And everywere that Mary went,
That lam was sure to go.</pre></p>
<p>&nbsp;</p>
<p>We correct these two file to the following using a change record <span class="code">CR1</span>.<br />
<pre class="brush: plain;">Mary hard a little lamb.
It's fleece was white as snow</pre><br />
And<br />
<pre class="brush: plain;">And everywhere that Mary went,
That lamb was sure to go.</pre></p>
<p>&nbsp;</p>
<p>Here then is my first build (<span class="code">build1</span>).<br />
<div id="attachment_742" class="wp-caption aligncenter" style="width: 310px"><a href="http://principiait.files.wordpress.com/2010/06/buildintegrity.png"><img src="http://principiait.files.wordpress.com/2010/06/buildintegrity.png?w=300&#038;h=266" alt="" title="Initial build" width="300" height="266" class="size-medium wp-image-742" /></a><p class="wp-caption-text">Initial build: conceptual and literal change equivalent</p></div><br />
This build has integrity because it contains the content of all valid changes nominated to the build as <em>known at the time the build was constructed</em>, but it is not correct because <span class="code">CR1</span> fails to satisfy the original request to &#8220;correct the spelling mistakes in the poem&#8221;.</p>
<p>So, not bad, but the still have &#8220;hard&#8221; instead of &#8220;had&#8221; in the first line of <span class="code">file1.txt</span>. This does not change the integrity of <span class="code">build1</span>, but does make another build (<span class="code">build2</span>) necessary to include a correction to the erroneous work submitted into <span class="code">build1</span>. </p>
<p>There are different ways we might choose to track the correction of the defect arising from <span class="code">build1</span>.</p>
<table class="wit indent">
<tbody>
<tr>
<td>Reuse&nbsp;CR1</td>
<td>
<p>Regress <span class="code">CR1</span> to a lifecycle state where the developer can add to it. Allow changes to be associated with <span class="code">CR1</span>, and then resubmit <span class="code">CR1</span> into a new build.</p>
<p>This approach, while simple, may be misleading. When revisiting <span class="code">build1</span> we need to be sure that we look at <span class="code">CR1</span> as it was when the build was executed, not as it is after the correction is applied. This can make metrics collection unnecessarily complex.</p>
</td>
</tr>
<tr>
<td>Create a new&nbsp;change</td>
<td>
<p>Treat the defect resolution as a separate change. This could be a new change or a special &#8216;defect&#8217; record.</p>
<p>This has the benefit of keeping track of the revisions that correct the defect in the original change separate to the original change. A feature potentially useful in simplifying metrics collection.</p>
</td>
</tr>
<tr>
<td>Create a separate but subsidiary change</td>
<td>
<p>We create a separate change record to track the specific revisions created to correct the defect, but we relate it to the original change request in a child-parent relationship (the original change being the parent.</p>
<p>This has the benefit of keeping track of the specific revisions that correct the defect while maintaining a link to the original change.</p>
</td>
</tr>
</tbody>
</table>
<p>Each approach has its own merits but, from the perspective of build integrity, they share an the important feature; when dealing with the conceptual change &#8220;correct the spelling mistakes in the poem&#8221;, they are semantically equivalent. For <span class="code">build2</span> to have integrity it must include both the revisions associated with the original change and all new revisions associated with the correction to the change, regardless of how that correction is controlled.</p>
<p>We correct the defect in <span class="code">build1</span> with an additional change to <span class="code">file1.txt</span> to produce the following.<br />
<pre class="brush: plain;">Mary had a little lamb,
It's fleece was white as snow,</pre></p>
<p>The following illustration shows <span class="code">build2</span> (in this case I have re-used <span class="code">CR1</span> to correct the defect). I should be obvious that missing any revision associated with <span class="code">CR1</span> has the potential to break the build&#8217;s integrity (we may have only part of <span class="code">CR1</span> in the build).<br />
<div id="attachment_745" class="wp-caption aligncenter" style="width: 310px"><a href="http://principiait.files.wordpress.com/2010/06/buildintegrityfix.png"><img src="http://principiait.files.wordpress.com/2010/06/buildintegrityfix.png?w=300&#038;h=234" alt="" title="Second build using reworked change" width="300" height="234" class="size-medium wp-image-745" /></a><p class="wp-caption-text">Fix Build: Conceptual change implemented with reworked literal change</p></div><br />
Using a separate change record to control the defect does not really solve this problem, it merely makes it less apparent. Consider the following illustration, it shows the same situation but this time I have used another change record (<span class="code">D1</span>) to control the defect.<br />
<div id="attachment_744" class="wp-caption aligncenter" style="width: 310px"><a href="http://principiait.files.wordpress.com/2010/06/buildintegrityfix1.png"><img src="http://principiait.files.wordpress.com/2010/06/buildintegrityfix1.png?w=300&#038;h=234" alt="" title="Second build with separate change" width="300" height="234" class="size-medium wp-image-744" /></a><p class="wp-caption-text">Fix build: Conceptual change now implemented with two literal changes</p></div><br />
Although I can exclude the defect resolution from the build configuration and, in this special case, claim to have maintained build integrity, it is difficult to justify semantically as I have not really included the sum of the conceptual change — the change is supposed to achieve a specific effect upon the system (the spelling correction), something it failed to do with the original literal <span class="code">CR1</span> in <span class="code">build1</span> but we hope it does with the combination of literal changes managed by change records <span class="code">CR1</span> and <span class="code">D1</span>.</p>
<p>And this is the point. Yes, the literal changes <span class="code">CR1</span> and <span class="code">D1</span> are, in one sense, changes. In practical terms though each on its own fails to achieve the objective of the original change request and consequently they are little more than sets of revisions. The two literal changes controlled by records <span class="code">CR1</span> and <span class="code">D1</span>, taken together, achieve the original goal of the change request &#8220;correct spelling mistakes in the poem&#8221;. It is this latter type of change (what I have called conceptual change) that is more interesting to configuration management and build integrity is maintained through these conceptual changes rather than the less significant literal changes.</p>
<p>This distinction between the conceptual change and literal change becomes increasingly important as we consider configuration integrity, a subject I shall discuss in more detail in subsequent posts.</p>
<br />Filed under: <a href='http://blog.principia-it.co.uk/category/itslm/build-management/'>Build Management</a>, <a href='http://blog.principia-it.co.uk/category/itslm/change-management/'>Change Management</a>, <a href='http://blog.principia-it.co.uk/category/itslm/configuration-management/'>Configuration Management</a>, <a href='http://blog.principia-it.co.uk/category/plain-old-blog/'>Plain Old Blog</a>, <a href='http://blog.principia-it.co.uk/category/itslm/configuration-management/software-configuration-management/'>Software Configuration Management</a>, <a href='http://blog.principia-it.co.uk/category/itslm/configuration-management/software-configuration-management/version-control/'>Version Control</a> Tagged: <a href='http://blog.principia-it.co.uk/tag/build/'>build</a>, <a href='http://blog.principia-it.co.uk/tag/change/'>change</a>, <a href='http://blog.principia-it.co.uk/tag/cm/'>CM</a>, <a href='http://blog.principia-it.co.uk/tag/development-2/'>development</a>, <a href='http://blog.principia-it.co.uk/tag/scm/'>SCM</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/principiait.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/principiait.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/principiait.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/principiait.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/principiait.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/principiait.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/principiait.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/principiait.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/principiait.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/principiait.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/principiait.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/principiait.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/principiait.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/principiait.wordpress.com/624/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=624&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.principia-it.co.uk/2010/06/12/when-is-a-change-a-change/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/41c439c6892b6a1b53ea8c1686324b4c?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Principia IT</media:title>
		</media:content>

		<media:content url="http://principiait.files.wordpress.com/2010/06/buildintegrity.png?w=300" medium="image">
			<media:title type="html">Initial build</media:title>
		</media:content>

		<media:content url="http://principiait.files.wordpress.com/2010/06/buildintegrityfix.png?w=300" medium="image">
			<media:title type="html">Second build using reworked change</media:title>
		</media:content>

		<media:content url="http://principiait.files.wordpress.com/2010/06/buildintegrityfix1.png?w=300" medium="image">
			<media:title type="html">Second build with separate change</media:title>
		</media:content>
	</item>
		<item>
		<title>Stubbing in build processes</title>
		<link>http://blog.principia-it.co.uk/2010/01/05/stubbing-in-build-processes/</link>
		<comments>http://blog.principia-it.co.uk/2010/01/05/stubbing-in-build-processes/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 14:54:46 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Build Management]]></category>
		<category><![CDATA[CMCrossroads]]></category>
		<category><![CDATA[Configuration Management]]></category>
		<category><![CDATA[ITSLM]]></category>
		<category><![CDATA[Plain Old Blog]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[stub]]></category>
		<category><![CDATA[system build]]></category>

		<guid isPermaLink="false">http://blog.principia-it.co.uk/?p=391</guid>
		<description><![CDATA[When developing systems of any size the development team inevitably encounters the following problem. The developers of one sub-system need access to functionality to be provided by another, but the second sub-system is not in a position to provide the functionality and probably will not be for some time. When this happens it is common [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=391&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>When developing systems of any size the development team inevitably encounters the following problem. The developers of one sub-system need access to functionality to be provided by another, but the second sub-system is not in a position to provide the functionality and probably will not be for some time. When this happens it is common for the sub-system teams to provide stubs.</p>
<p>Stubs come in several flavours:</p>
<ul>
<li>non-functional stubs provide no functionality, they simply provide a template interface to allow client sub-systems to compile;</li>
<li>static-function stubs allow client sub-systems to compile and also provide static responses when the interface is called;</li>
<li>dynamic stubs provide more complex responses when called. Methods used to provide these dynamic stubs vary but some common approaches are:
<ul>
<li>record and playback,</li>
<li>static tables,</li>
<li>randomised response, and</li>
<li>minimal function.</li>
</ul>
</li>
</ul>
<p>A stub is a proxy for the final functionality to be offered by the sub-system. As such we want the stub references in the client code to use the same calling convention as the final product. In the build process we need some means to nominate the stub or the final product into our build.</p>
<p>There are two principal approaches to solving this latter problem. The first relies on the build itself to select the appropriate module (stub or final). In our build script we may have, for example, a simple path modifier that builds either the stub or final code into a library which is then used by clients. The second method relies upon the source control system to deliver either the stub or final source into the source configuration, this source is then built into the target library. In this post I begin looking at some of the issues involved in both build and configuration managing stubs.<span id="more-391"></span></p>
<p>Although the second approach has some appeal, the first offers more flexibility. Suppose We have module A that is to supply some functionality to a client system S. The normal build chain would be something like <span class="code">A-Ao-L-S</span> (source <span class="code">A</span> built to object <span class="code">Ao</span> which is linked into a library <span class="code">L</span><sup><a href="#fn1">1</a></sup> and consumed by system <span class="code">S).</span></p>
<p><span class="code"> </span></p>
<div id="attachment_457" class="wp-caption aligncenter" style="width: 307px"><a href="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward.png"><img class="size-full wp-image-457 " title="Simplified Build Chain" src="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward.png?w=450" alt="Simplified Build Chain"   /></a><p class="wp-caption-text">Simplified Build Chain</p></div>
<p>If we supply a stub <span class="code">A&#8217;</span> the chain becomes <span class="code">A&#8217;-Ao&#8217;-L-S</span>.</p>
<div id="attachment_458" class="wp-caption aligncenter" style="width: 307px"><a href="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub.png"><img class="size-full wp-image-458" title="Stub Build Chain" src="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub.png?w=450" alt="Stub Build Chain"   /></a><p class="wp-caption-text">Stub Build Chain</p></div>
<p>The <span class="code">L-S</span> relationship remains the same whether we elect to build the stub or final product into system <span class="code">S</span>. So far, so good. Our build system simply nominates the appropriate build into library <span class="code">L</span> (<span class="code">A&#8217;-Ao&#8217;</span> or <span class="code">A-Ao</span>). This allows us to build the entire system with or without the stub code in place.</p>
<div id="attachment_459" class="wp-caption aligncenter" style="width: 307px"><a href="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stuboption.png"><img class="size-full wp-image-459" title="Stub Variant Build Chains" src="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stuboption.png?w=450" alt="Stub Variant Build Chains"   /></a><p class="wp-caption-text">Stub Variant Build Chains</p></div>
<p>Suppose the problem where a little more complex. Suppose that instead of <span class="code">L</span> being used universally in <span class="code">S</span> there were an intermediate set of sub-systems (<span class="code">S&#8217;</span> and <span class="code">S&#8221;</span>). Now our build chain is: <span class="code">A-Ao-L-(S&#8217;|S&#8221;)-S</span></p>
<p><span class="code"> </span></p>
<div id="attachment_460" class="wp-caption aligncenter" style="width: 382px"><a href="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub-subsystems.png"><img class="size-full wp-image-460" title="Build Chain with Intermediate Sub-systems" src="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub-subsystems.png?w=450" alt="Build Chain with Intermediate Sub-systems"   /></a><p class="wp-caption-text">Build Chain with Intermediate Sub-systems</p></div>
<p>What if developers of <span class="code">S&#8217;</span> wish to use the stub code and <span class="code">S&#8221;</span> wish to use the final code for testing? The build system that nominates <span class="code">Ao</span> or <span class="code">Ao&#8217;</span> into <span class="code">L</span> is not sufficient to accommodate this requirement. We need to add another step and provide a means to nominate the appropriate library.</p>
<div id="attachment_461" class="wp-caption aligncenter" style="width: 382px"><a href="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub-subsystems-optoons.png"><img class="size-full wp-image-461" title="Stub Libraries" src="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub-subsystems-optoons.png?w=450" alt="Stub Libraries"   /></a><p class="wp-caption-text">Using Stub Libraries</p></div>
<p>But this opens up another problem. The libraries <span class="code">L</span> and <span class="code">L&#8217;</span> currently contain either stub code or final code, but the sub-systems <span class="code">S&#8217;</span> and <span class="code">S&#8221;</span> may each require different component to be stubbed out at different times and this will lead to a profusion of libraries, each with a unique combination of stubbed modules.</p>
<p>One we reach this situation we need to query our library architecture and our testing approach. There is no universal approach to building systems using arbitrary set of stubs like this. We could use some run-time configuration but this opens up a whole new set of issues around configuration management and ensuring delivered systems do not contain inappropriate stub code.</p>
<p>This post has offered a very light-weight introduction to build management of stubs. This is, of course, a large a complex issue for configuration management. The take-home message should be, make sure you design your build system with stubbing in mind and work with system architects, test managers and developers to ensure that your build system can accommodate appropriate configurations for stubbed testing.</p>
<hr /><a name="fn1"></a>. Although identified as a library, L could be any collection of items representing stubbed or non-stubbed entities.</p>
<br />Posted in Build Management, CMCrossroads, Configuration Management, ITSLM, Plain Old Blog Tagged: build, stub, system build <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/principiait.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/principiait.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/principiait.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/principiait.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/principiait.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/principiait.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/principiait.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/principiait.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/principiait.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/principiait.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/principiait.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/principiait.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/principiait.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/principiait.wordpress.com/391/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=391&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.principia-it.co.uk/2010/01/05/stubbing-in-build-processes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/41c439c6892b6a1b53ea8c1686324b4c?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Principia IT</media:title>
		</media:content>

		<media:content url="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward.png" medium="image">
			<media:title type="html">Simplified Build Chain</media:title>
		</media:content>

		<media:content url="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub.png" medium="image">
			<media:title type="html">Stub Build Chain</media:title>
		</media:content>

		<media:content url="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stuboption.png" medium="image">
			<media:title type="html">Stub Variant Build Chains</media:title>
		</media:content>

		<media:content url="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub-subsystems.png" medium="image">
			<media:title type="html">Build Chain with Intermediate Sub-systems</media:title>
		</media:content>

		<media:content url="http://principiait.files.wordpress.com/2010/01/build-stubs-straightforward-stub-subsystems-optoons.png" medium="image">
			<media:title type="html">Stub Libraries</media:title>
		</media:content>
	</item>
		<item>
		<title>Stabilizing builds</title>
		<link>http://blog.principia-it.co.uk/2010/01/04/stabilizing-builds/</link>
		<comments>http://blog.principia-it.co.uk/2010/01/04/stabilizing-builds/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 21:13:34 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Build Management]]></category>
		<category><![CDATA[CMCrossroads]]></category>
		<category><![CDATA[ITSLM]]></category>
		<category><![CDATA[Plain Old Blog]]></category>
		<category><![CDATA[CM]]></category>
		<category><![CDATA[SCM]]></category>

		<guid isPermaLink="false">http://blog.principia-it.co.uk/?p=438</guid>
		<description><![CDATA[One challenge facing build managers is how to control the environment in which builds are performed. How to ensure that each repeated build uses the same sources, the same libraries, the same compilers, and so on. Only by ensuring all these elements can we truly claim to be able to reproduce a build reliably and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=438&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One challenge facing build managers is how to control the environment in which builds are performed. How to ensure that each repeated build uses the same sources, the same libraries, the same compilers, and so on. Only by ensuring all these elements can we truly claim to be able to reproduce a build reliably and only by controlling all these elements can we be certain that derived objects built previously are compatible with incremental builds.<span id="more-438"></span></p>
<p>Various solutions have been proposed to this conundrum, most of which involve tracking the complex relationships between source and derived objects. In recent years another somewhat simpler solution has presented itself. Instead of controlling all of the precondition factors individually, create one controlled environment and reuse this for each build. The potential flaw in this approach is that running a build will more often than not change the environment, and reconstructing the build environment is often difficult, time consuming and prone to error.</p>
<p>Virtual environments provide a perfect solution. Construct the build environment once as a virtual machine environment and then each build starts by restoring the virtual environment back to the initial condition. Source code (including the build scripts that direct the build) is stored in a separate repository and extracted to the build environment as normal. Derived objects (produced during a build) are held separate to the build environment so that they are not reset during the build.</p>
<p>There remains one potential problem when performing incremental builds. If your build relies on changes to the build environment to function properly, these changes will be discarded when the build environment is restored to its initial state. If, for example, your build registers objects with the Windows registry during the build, these items will not be registered at the start of the build so your build must be written to ensure these environmental changes are repeated even when the items themselves are not rebuilt.</p>
<br />Posted in Build Management, CMCrossroads, ITSLM, Plain Old Blog Tagged: CM, SCM <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/principiait.wordpress.com/438/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/principiait.wordpress.com/438/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/principiait.wordpress.com/438/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/principiait.wordpress.com/438/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/principiait.wordpress.com/438/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/principiait.wordpress.com/438/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/principiait.wordpress.com/438/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/principiait.wordpress.com/438/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/principiait.wordpress.com/438/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/principiait.wordpress.com/438/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/principiait.wordpress.com/438/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/principiait.wordpress.com/438/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/principiait.wordpress.com/438/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/principiait.wordpress.com/438/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.principia-it.co.uk&amp;blog=8032610&amp;post=438&amp;subd=principiait&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.principia-it.co.uk/2010/01/04/stabilizing-builds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/41c439c6892b6a1b53ea8c1686324b4c?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Principia IT</media:title>
		</media:content>
	</item>
	</channel>
</rss>
