<?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/"
	>

<channel>
	<title>Good Practices Archives - scmGalaxy</title>
	<atom:link href="https://www.scmgalaxy.com/tutorials/tag/good-practices/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.scmgalaxy.com/tutorials/tag/good-practices/</link>
	<description>A Platform for Software Engineers</description>
	<lastBuildDate>Sat, 27 Feb 2021 09:55:38 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>
	<item>
		<title>Branching and Merging Best Practices &#124; Branching and Merging Guide</title>
		<link>https://www.scmgalaxy.com/tutorials/branching-and-merging-practices/</link>
					<comments>https://www.scmgalaxy.com/tutorials/branching-and-merging-practices/#respond</comments>
		
		<dc:creator><![CDATA[scmgalaxy K]]></dc:creator>
		<pubDate>Tue, 22 Feb 2011 06:48:46 +0000</pubDate>
				<category><![CDATA[Concept & Definition]]></category>
		<category><![CDATA[Best]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[branch]]></category>
		<category><![CDATA[Branching]]></category>
		<category><![CDATA[Branching and Merging]]></category>
		<category><![CDATA[Branching and Merging Best Practices]]></category>
		<category><![CDATA[Branching and Merging Good Practices]]></category>
		<category><![CDATA[Branching and Merging Guide]]></category>
		<category><![CDATA[Branching and Merging Guidelines]]></category>
		<category><![CDATA[Branching and Merging Learning Resources]]></category>
		<category><![CDATA[Branching and Merging References]]></category>
		<category><![CDATA[Branching and Merging Tutorials]]></category>
		<category><![CDATA[Branching Patterns]]></category>
		<category><![CDATA[Branching Strategies]]></category>
		<category><![CDATA[Good Practices]]></category>
		<category><![CDATA[Merge]]></category>
		<category><![CDATA[Merging]]></category>
		<category><![CDATA[Practices]]></category>
		<guid isPermaLink="false">http://www.scmgalaxy.com/tutorials/2011/02/22/branching-and-merging-practices/</guid>

					<description><![CDATA[<p>Branching and Merging Practices Branching and Merging Practices from Rajesh Kumar</p>
<p>The post <a href="https://www.scmgalaxy.com/tutorials/branching-and-merging-practices/">Branching and Merging Best Practices | Branching and Merging Guide</a> appeared first on <a href="https://www.scmgalaxy.com/tutorials">scmGalaxy</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-3890" src="https://www.scmgalaxy.com/tutorials/wp-content/uploads/2011/02/branching-and-merging.png" alt="branching-and-merging" width="600" height="400" srcset="https://www.scmgalaxy.com/tutorials/wp-content/uploads/2011/02/branching-and-merging.png 600w, https://www.scmgalaxy.com/tutorials/wp-content/uploads/2011/02/branching-and-merging-300x200.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></h2>
<h2><strong>Branching and Merging Practices</strong></h2>
<h2><iframe style="border: 1px solid #CCC; border-width: 1px; margin-bottom: 5px; max-width: 100%;" src="//www.slideshare.net/slideshow/embed_code/key/nhN1p3CFUc9RyN" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowfullscreen="allowfullscreen"> </iframe></h2>
<div style="margin-bottom: 5px;"><strong> <a title="Branching and Merging Practices " href="//www.slideshare.net/rajeshatbuzz/branching-and-merging-practices" target="_blank" rel="noopener">Branching and Merging Practices </a> </strong> from <strong><a href="https://www.slideshare.net/rajeshatbuzz" target="_blank" rel="noopener">Rajesh Kumar</a></strong></div>
<p>The post <a href="https://www.scmgalaxy.com/tutorials/branching-and-merging-practices/">Branching and Merging Best Practices | Branching and Merging Guide</a> appeared first on <a href="https://www.scmgalaxy.com/tutorials">scmGalaxy</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.scmgalaxy.com/tutorials/branching-and-merging-practices/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Best Practices-Software Configuration and Release Management (SCRM)</title>
		<link>https://www.scmgalaxy.com/tutorials/best-pactices-software-configuration-and-release-management-scrm/</link>
					<comments>https://www.scmgalaxy.com/tutorials/best-pactices-software-configuration-and-release-management-scrm/#respond</comments>
		
		<dc:creator><![CDATA[scmgalaxy K]]></dc:creator>
		<pubDate>Mon, 17 May 2010 06:27:31 +0000</pubDate>
				<category><![CDATA[Practice of Software Configuration Management]]></category>
		<category><![CDATA[Best Pactices]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Configuration Management Best Practices]]></category>
		<category><![CDATA[Good Practices]]></category>
		<category><![CDATA[Intruction]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Recommend]]></category>
		<category><![CDATA[Release]]></category>
		<category><![CDATA[Release Management Best Practices]]></category>
		<category><![CDATA[SCRM]]></category>
		<category><![CDATA[SCRM Best Practices]]></category>
		<category><![CDATA[SCRM Best Practices Guide]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Software Configuration and Release Management]]></category>
		<category><![CDATA[Software Configuration and Release Management Best Practices]]></category>
		<guid isPermaLink="false">http://www.scmgalaxy.com/tutorials/2010/05/17/best-pactices-software-configuration-and-release-management-scrm/</guid>

					<description><![CDATA[<p>Introduction The development of software applications is an evolutionary process, moving towards some predetermined end goals. These goals are usually [&#8230;]</p>
<p>The post <a href="https://www.scmgalaxy.com/tutorials/best-pactices-software-configuration-and-release-management-scrm/">Best Practices-Software Configuration and Release Management (SCRM)</a> appeared first on <a href="https://www.scmgalaxy.com/tutorials">scmGalaxy</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="alignnone size-full wp-image-4377" src="https://www.scmgalaxy.com/tutorials/wp-content/uploads/2010/05/software-configuration-and-.png" alt="software-configuration-and-release-management-best-practices" width="600" height="400" srcset="https://www.scmgalaxy.com/tutorials/wp-content/uploads/2010/05/software-configuration-and-.png 600w, https://www.scmgalaxy.com/tutorials/wp-content/uploads/2010/05/software-configuration-and--300x200.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 2;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 18pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">Introduction</span></span></strong></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">The development of software applications is an </span><a name="OLE_LINK2"></a><a name="OLE_LINK1"></a><span style="mso-bookmark: OLE_LINK2;"><span style="color: #000000;">evolutionary</span></span><span style="color: #000000;"> process, moving towards some predetermined end goals. These goals are usually in the form of a <strong>Release</strong>, either internal or external, to deliver a set of required functionality. <strong>Software Release Management </strong>is the process of ensuring releases can be reliably planned, scheduled and successfully transitioned (<strong>deployed</strong>) to Test and Live Environments. Software Release Management is not just about &#8220;automating the path to production&#8221; although that is certainly an important part. It also about adopting a holistic view of application changes, using the &#8220;Release&#8221; as the container to ensure that changes are packaged, released and tested in a repeatable and controlled manner. Release Management is often likened to the conductor of an orchestra, with the individual changes to be implemented the various instruments within it. Software Release Management is intrinsically linked with the more well understood and adopted <strong>Software Change and Configuration Management </strong>disciplines.</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">This article defines a set of good practices for helping in the successful adoption of Software Release Management. Although this article is about Software Release Management, many of the practices are generic and can also apply to Release Management in its wider sense as described in the </span></span><a href="http://www.itil-officialsite.com/"><span style="font-family: 'Times New Roman','serif'; color: blue; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="text-decoration: underline;">IT Infrastructure Library (ITIL</span></span></a><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">) whereby all aspects of hardware installation (e.g. do we need new PCs?), infrastructure upgrade (e.g. do we need to upgrade inter-site links?) and end-user training are considered. In some cases such a release might not include any software artefacts at all.</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 2;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 18pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">Defintions</span></span></strong></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">In order to define some good practices it is first worth defining some terms which are used in Software Release Management. The following table lists of set of generic terms which are taken both from service management and application development.</span></span></p>
<table class="MsoNormalTable" style="mso-cellspacing: 1.5pt; mso-yfti-tbllook: 1184;" border="0" cellpadding="0">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="text-align: center; line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Term</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="text-align: center; line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Definition</span></strong></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">RFC (Request for Change)</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">A high-level change request that captures the detail of a change that is to be made to a new or existing application. RFCs are usually decomposed down to lower level work requests or tasks for software development.</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">CAB (Change Advisory Board)</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">The collection of stakeholders who review all RFCs at specific intervals to assess whether they should be implemented, assign priorities and allocated them to a Release.</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 3;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Release</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">A stable, executable version of a product  intended for deployment to testing and production.</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 4;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Release Package</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">A logical container that defines the set of RFCs and Deployment Units (sometimes called Release Units) that are to be included in a Release. It also includes metadata such as the type of release (see Release Type) and its planned dates (see Release Calendar).</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 5;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Release Type</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">The type of release that is to be implemented, i.e. Major, Minor, Emergency. Each Release Type will usually have a different workflow.</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 6;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Release Policy</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">An organizations published policy that determines under which circumstances different Release Types should be used as well as the standard set of milestones that selecting a particular Release Type implies in the Release Calendar.</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 7;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Release Calendar</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">A set of published milestones that details when Releases are planned to transition through the different development, test and production phases.</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 8;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Baseline</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">A snapshot of the exact versions of Configuration Items, including executables, libraries, configuration files and documentation that are to be deployed.</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 9;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Build</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">An operational version of a product or part of a product. Not all builds are released but builds are typically carried to transform inputs (source code) into executed and installable Deployment Units.</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 10; mso-yfti-lastrow: yes;">
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">Deployment Unit</span></strong></p>
</td>
<td style="background-color: transparent; border: #f0f0f0; padding: 0.75pt;">
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';">A physical, self-contained, installable release of an application.</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">An example of how these different definitions relate to one another is illustrated in the diagram below:</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 2;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 18pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">The Best Practices</span></span></strong></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">The following good practices are based on many years implementing and observing Software Release Management. They are listed in no particular priority or order.</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">1. Define regular, targeted release dates</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">You should strictly plan and manage your releases and deliver releases regularly. Create a <strong>Release Calendar</strong> for each type Product&#8217;s<strong> Release Package</strong> to ensure that release progress is effectively communicated and planned. If a number of releases are being developed in parallel, create and communicate a high-level release milestone plan. The Release Calendar should communicate both internal (development, testing) and external (deployment to live) milestones. The Release Packages and Release Calendar are more easily managed and communicated if the details are kept within a database or workflow tool.</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">2. Always have a tested back-out plan</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">For releases that are being deployed to managed live environments you should always have a tested back-out plan. For example, if you deploy a new Internet Banking product release onto the live servers and subsequently find that there are problems with it, there should be a process in place for removing this release and rolling back to the previous one. In this scenario it is desirable that this process is as automatic as possible. The acceptance testing and rollout scenario should be part of the workflow defined for each <strong>Release Package</strong>.</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">3. Have a documented Release Policy</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">Your Software Release Management processes and policies should be clearly defined and documented. This should include the definition of the types of release you will manage, their workflows, the default calendars, as well as roles, responsibilities and artifacts. Usually this type of information is captured in a <strong>Release Management Plan</strong>. Make sure that this plan clearly states who is responsible for each part of the release process, i.e. who plans and manages the release, who builds and delivers the release internally and who packages and deploys the release externally. All the artefacts that are to be produced as part of the release process, i.e. Release Plan, Release Notes, Installation Instructions, should be clearly documented (and example templates given) along with who is responsible for generating them.</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">4. Construct Deployment Units as early as possible</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">Every time you build your application you should be constructing <strong>Deployment Units</strong> with the potential to be installed, for example a J2EE .EAR file or a Windows .MSI package. These Deployment Units might not be released beyond the development team but the point is that the build, packaging and installation process is proven early and at each phase.</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">5. Use an independent team to construct all external releases</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">If your team is very small then the developers might be able to carry out the build and construct the <strong>Deployment Unit</strong>. However, for any medium to large size product it is desirable to have a separate release team. This team usually manages the build process and packages up the results of the build into the Deployment Unit. They usually deploy internally (and sometimes externally) or pass the deployment unit to a separate deployment team. The release team is also responsible for creating the logical Release Package&#8217;s and communicating release dates.</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">6. All deployments should be performed by a team independent of the Development team</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">Developers should not be allowed to transition Deployment Units into a live environment. There is a potential conflict of interests in this situation. For audit ability and traceability it is better to have a separate team deploy the release to Live (and usually Acceptance Testing)</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">7. Test the deployment process at least once before deploying to Live</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">The deployment process should be tested at least once before any release is put into a live environment. This is normally carried out by having an Acceptance Test environment that mimics the live environment and is controlled in the same way.</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">8. Automate as much as possible – use integrated tools for Configuration, Change Management and Deployment Management</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">Software Release Management can be a repetitive and error prone manual process, therefore as much as possible should be automated. At the very least, the inputs and outputs of the release process (including the build components and release documentation) should be versioned using a Configuration Management tool (e.g Perforce,Subversion,Clearcase,TFS,etc) A Change Management tool can be used for controlling the content of the release and making Requests For Changes (RFCs) to it. A Deployment Management tool can be used to move the release to different environments or to install onto multiple desktop machines. Obviously, this all works best if these tools are integrated through to the Release Management process and its supporting tool(s).</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">9. Use a mature Software Configuration Management process and tool to support the development of multiple releases in parallel</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">When you are developing, building and deploying multiple releases in parallel it is critical that you have a Software Configuration Management tool that supports parallel development. Such tools are sometimes high-end, expensive toolsets (not open-source  but they can significantly help to automate and reduce errors in the otherwise manual branching and merging process.</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;">10. Link all release documentation and scripts to your Deployment Unit</span></span></strong><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><br />
<span style="color: #000000;">When a release is deployed you should be able to identify from the <strong>Deployment Unit </strong>all the related hardware and software that is required to support the release.  The Release Package is a good container for managing these relationships. The <strong>Release</strong> <strong>Package </strong>can either relate all this together in documentation form or better still reference entries in a database. Such a database should identify for each product that is built and released: the required hardware, supporting third-party software and the Installation and Configuration instructions. In the </span></span><a href="http://www.itil.co.uk/"><span style="font-family: 'Times New Roman','serif'; color: blue; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="text-decoration: underline;">ITIL</span></span></a><span style="font-family: 'Times New Roman','serif'; font-size: 12pt; mso-fareast-font-family: 'Times New Roman';"><span style="color: #000000;"> world such a database is often called the CMDB (Configuration Management Database).</span></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; margin: 0in 0in 0pt;">
<p>The post <a href="https://www.scmgalaxy.com/tutorials/best-pactices-software-configuration-and-release-management-scrm/">Best Practices-Software Configuration and Release Management (SCRM)</a> appeared first on <a href="https://www.scmgalaxy.com/tutorials">scmGalaxy</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.scmgalaxy.com/tutorials/best-pactices-software-configuration-and-release-management-scrm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Best Practices in Software Configuration Management &#8211; SCM Best Practices Guide</title>
		<link>https://www.scmgalaxy.com/tutorials/best-practices-in-software-configuration-management/</link>
					<comments>https://www.scmgalaxy.com/tutorials/best-practices-in-software-configuration-management/#comments</comments>
		
		<dc:creator><![CDATA[scmgalaxy K]]></dc:creator>
		<pubDate>Mon, 02 Feb 2009 09:12:32 +0000</pubDate>
				<category><![CDATA[Practice of Software Configuration Management]]></category>
		<category><![CDATA[Best]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Best practices in SCM]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Configuration Management]]></category>
		<category><![CDATA[Good]]></category>
		<category><![CDATA[Good Practices]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Ideal]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Recomended]]></category>
		<category><![CDATA[Right]]></category>
		<category><![CDATA[SCM best practices]]></category>
		<category><![CDATA[SCM best practices Guide]]></category>
		<category><![CDATA[SCM best practices Techniques]]></category>
		<category><![CDATA[SCM Best Practices Tips]]></category>
		<category><![CDATA[SCM best practices Tutorial]]></category>
		<category><![CDATA[SCM Good Practices]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Software Configuration Management]]></category>
		<category><![CDATA[Software Configuration Management Best Practices]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[What]]></category>
		<guid isPermaLink="false">http://www.scmgalaxy.com/tutorials/2009/02/02/best-practices-in-software-configuration-management/</guid>

					<description><![CDATA[<p>Best Practices in Software Configuration Management Abstract When deploying new SCM (software configuration management) tools, implementers sometimes focus on perfecting [&#8230;]</p>
<p>The post <a href="https://www.scmgalaxy.com/tutorials/best-practices-in-software-configuration-management/">Best Practices in Software Configuration Management &#8211; SCM Best Practices Guide</a> appeared first on <a href="https://www.scmgalaxy.com/tutorials">scmGalaxy</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3973 aligncenter" src="https://www.scmgalaxy.com/tutorials/wp-content/uploads/2009/02/SCM-pRactices.png" alt="scm-best-practices" width="600" height="400" srcset="https://www.scmgalaxy.com/tutorials/wp-content/uploads/2009/02/SCM-pRactices.png 600w, https://www.scmgalaxy.com/tutorials/wp-content/uploads/2009/02/SCM-pRactices-300x200.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><strong>Best Practices in Software Configuration Management</strong></p>
<p><strong>Abstract</strong><br />
When deploying new SCM (software configuration management) tools,<br />
implementers sometimes focus on perfecting fine-grained activities, while<br />
unwittingly carrying forward poor, large-scale practices from their previous jobs or<br />
previous tools. The result is a well-executed blunder. This paper promotes some<br />
high-level best practices that reflect the authors’ experiences in deploying SCM.</p>
<p><strong>1. Introduction</strong><br />
“A tool is only as good as you use it,” the saying goes<em>. </em>As providers of software configuration management (SCM) tools and consultants to software companies, we<br />
are often asked for sound advice on SCM best practices – that is, how to deploy SCM software to the maximum advantage. In answering these requests we have a bounty of direct and indirect SCM experience from which to draw. The direct experience comes from having been developers and codeline managers ourselves; the indirect experience comes from customer reports of successes and failures with our product (Perforce) and other SCM tools.<br />
The table below lists six general areas of SCM deployment, and some coarse-grained best practices within each of those areas. The following chapters explain each item.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="319"><strong>Workspaces, </strong>where<br />
developers build, test, and<br />
debug.</td>
<td valign="top" width="319">· Don’t share workspaces.<br />
· Don’t work outside of managed workspaces.<br />
· Don’t use jello views.<br />
· Stay in sync with the codeline.<br />
· Check in often.</td>
</tr>
<tr>
<td valign="top" width="319"><strong>Codelines, </strong>the canonical sets<br />
of source files.</td>
<td valign="top" width="319">· Give each codeline a policy.<br />
· Give each codeline an owner.<br />
· Have a mainline.</td>
</tr>
<tr>
<td valign="top" width="319"><strong>Branches, </strong>variants of the<br />
codeline.</td>
<td valign="top" width="319">· Branch only when necessary.<br />
· Don’t copy when you mean to branch.<br />
· Branch on incompatible policy.<br />
· Branch late.<br />
· Branch, instead of freeze.</td>
</tr>
<tr>
<td valign="top" width="319"><strong>Change propagation, </strong>getting<br />
changes from one codeline to<br />
another.</td>
<td valign="top" width="319">· Make original changes in the branch that has<br />
evolved the least since branching.<br />
· Propagate early and often.<br />
· Get the right person to do the merge.</td>
</tr>
<tr>
<td valign="top" width="319"><strong>Builds, </strong>turning source files<br />
into products.</td>
<td valign="top" width="319">· Source + tools = product.<br />
· Check in all original source.<br />
· Segregate built objects from original source.<br />
· Use common build tools.<br />
· Build often.<br />
· Keep build logs and build output.</td>
</tr>
<tr>
<td valign="top" width="319"><strong>Process, </strong>the rules for all of<br />
the above.</td>
<td valign="top" width="319">· Track change packages.<br />
· Track change package propagations.<br />
· Distinguish change requests from change<br />
packages.<br />
· Give everything and owner.<br />
· Use living documents.</td>
</tr>
</tbody>
</table>
<p><strong>2. The Workspace</strong><br />
The workspace is where engineers edit source files, build the software components they’re working on, and test and debug what they’ve built. Most SCM systems have some notion of a workspace; sometimes they are called “sandboxes”, as in Source Integrity, or “views”, as in ClearCase and Perforce. Changes to managed SCM repository files begin as changes to files in a workspace. The best practices for workspaces include:· <em>Don’t share workspaces. </em>A workspace should have a single purpose, such as an edit/build/test area for a single developer, or a build/test/release area for a product release. Sharing workspaces confuses people, just as sharing a desk does. Furthermore, sharing workspaces compromises the SCM system’s ability to track activity by user or task. Workspaces and the disk space they occupy are cheap; don’t waste time trying to conserve them.· <em>Don’t work outside of managed workspaces. </em>Your SCM system can only track work in progress when it takes place within managed workspaces. Users working outside of workspaces are beached; there’s a river of information flowing past and they’re not part of it. For instance, SCM systems generally use workspaces to facilitate some of the communication among developers working on related tasks. You can see what is happening in others’ workspaces, and they can see what’s going on in yours. If you need to take an emergency vacation, your properly managed workspace may be all you can leave behind. Use proper workspaces.<br />
· <em>Don’t use jello views. </em>A file in your workspace should not change unless <em>you</em><em>explicitly </em>cause the change. A “jello view” is a workspace where file changes are<br />
caused by external events beyond your control. A typical example of a jello view is a workspace built upon a tree of symbolic links to files in another workspace –<br />
when the underlying files are updated, your workspace files change. Jello views are a source of chaos in software development. Debug symbols in executables<br />
don’t match the source files, mysterious recompilations occur in supposedly trivial rebuilds, and debugging cycles never converge – these are just some of the<br />
problems. Keep your workspaces firm and stable by setting them up so that users have control over when their files change.· <em>Stay in sync with the codeline. </em>As a developer, the quality of your work depends on how well it meshes with other peoples’ work. In other words, as changes are checked into the codeline, you should update your workspace and integrate those changes with yours. As an SCM engineer, it behooves you to make sure this workspace update operation is straightforward and unencumbered with tricky or time-consuming procedures. If developers find it fairly painless to update their workspaces, they’ll do it more frequently and integration problems won’t pile up at project deadlines.<br />
· <em>Check in often. </em>Integrating your development work with other peoples’ work also requires you to check in your changes as soon as they are ready. Once you’ve<br />
finished a development task, check in your changed files so that your work is available to others. Again, as the SCM engineer, you should set up procedures that encourage frequent check-ins. Don’t implement unduly arduous validation procedures, and don’t freeze codelines (see Branching, below). Short freezes are bearable, but long freezes compromise productivity. Much productivity can be wasted waiting for the right day (or week, or month) to submit changes.</p>
<p><strong>3. The Codeline</strong><br />
In this context, the codeline is the canonical set of source files required to produce your software. Typically codelines are branched, and the branches evolve into variant<br />
codelines embodying different releases. The best practices with regard to codelines are:<br />
· <em>Give each codeline a policy. </em>A codeline policy specifies the fair use and permissible check-ins for the codeline, and is the essential user’s manual for<br />
codeline SCM. For example, the policy of a development codeline should state that it isn’t for release; likewise, the policy of a release codeline should limit<br />
changes to approved bug fixes.1 The policy can also describe how to document changes being checked in, what review is needed, what testing is required, and<br />
the expectations of codeline stability after check-ins. A policy is a critical component for a documented, enforceable software development process, and a<br />
codeline without a policy, from an SCM point of view, is out of control.· <em>Give each codeline an owner. </em>Having defined a policy for a codeline, you’ll soon<br />
encounter special cases where the policy is inapplicable or ambiguous. Developers facing these ambiguities will turn to the person in charge of the<br />
codeline for workarounds. When no one is in charge, developers tend to enact their own workarounds without documenting them. Or they simply procrastinate<br />
because they don’t have enough information about the codeline to come up with a reasonable workaround. You can avoid this morass by appointing someone to<br />
own the codeline, and to shepherd it through its useful life. With this broader objective, the codeline owner can smooth the ride over rough spots in software<br />
development by advising developers on policy exceptions and documenting them.</p>
<p>· <em>Have a mainline. </em>A “mainline,” or “trunk,” is the branch of a codeline that evolves forever. A mainline provides an ultimate destination for almost all<br />
changes – both maintenance fixes and new features – and represents the primary, linear evolution of a software product. Release codelines and development<br />
codelines are branched from the mainline, and work that occurs in branches is propagated back to the mainline.</p>
<p>IMAGE  &#8211; 1</p>
<p>Figure 1 shows a mainline (called “main”), from which several release lines (“ver1”, “ver2” and “ver3”) and feature development lines (“projA”, “projb”, and<br />
“projC”) have been branched. Developers work in the mainline or in a feature development line. The release lines are reserved for testing and critical fixes, and<br />
are insulated from the hubbub of development. Eventually all changes submitted to the release lines and the feature development lines get merged into the<br />
mainline. The adverse approach is to “promote” codelines; for example, to promote a development codeline to a release codeline, and branch off a new development<br />
codeline. For example, Figure 2 shows a development codeline promoted to a release codeline (“ver1”) and branched into another development codeline<br />
(“projA”). Each release codeline starts out as a development codeline, and development moves from codeline to codeline.</p>
<p>IMAGE &#8211; 2</p>
<p>The promotion scheme suffers from two crippling drawbacks: (1) it requires the policy of a codeline to change, which is never easy to communicate to everyone;<br />
(2) it requires developers to relocate their work from one codeline to another, which is error-prone and time-consuming. <em>90% of SCM “process” is enforcing</em><br />
<em>codeline promotion to compensate for the lack of a mainline.</em> Process is streamlined and simplified when you use a mainline model<em>. </em>With a<br />
mainline, contributors’ workspaces and environments are stable for the duration of their tasks at hand, and no additional administrative overhead is incurred as<br />
software products move forward to maturity.</p>
<p><strong>4. Branching</strong><br />
Branching, the creation of variant codelines from other codelines, is the most problematic area of SCM. Different SCM tools support branching in markedly<br />
different ways, and different policies require that branching be used in still more different ways. We found the following guidelines helpful when branching (and<br />
sometimes when avoiding branching):·</p>
<p><em>Branch only when necessary. </em>Every branch is more work – more builds, more changes to be propagated among codelines, more source file merges. If you keep this in mind every time you consider making a branch you may avoid sprouting unnecessary branches.<br />
· <em>Don’t copy when you mean to branch. </em>An alternative to using your SCM tool’s branching mechanism is to copy a set of source files from one codeline and<br />
check them in to another as new files. Don’t think that you can avoid the costs of branching by simply copying. Copying incurs all the headaches of branching –<br />
additional entities and increased complexity – but without the benefit of your SCM system’s branching support. Don’t be fooled: even “read-only” copies<br />
shipped off to another development group “for reference only” often return with changes made. Use your SCM system to make branches when you spin off parts<br />
or all of a codeline.<br />
· <em>Branch on incompatible policy. </em>There is one simple rule to determine if a codeline should be branched: it should be branched when its users need different<br />
check-in policies. For example, a product release group may need a check-in policy that enforces rigorous testing, whereas a development team may need a<br />
policy that allows frequent check-ins of partially tested changes. This policy divergence calls for a codeline branch. When one development group doesn’t<br />
wish to see another development group’s changes, that is also a form of incompatible policy: each group should have its own branch.<br />
· <em>Branch late. </em>To minimize the number of changes that need to be propagated from one branch to another, put off creating a branch as long as possible. For<br />
example, if the mainline branch contains all the new features ready for a release, do as much testing and bug fixing in it as you can before creating a release<br />
branch. Every bug fixed in the mainline before the release branch is created is one less change needing propagation between branches.<br />
· <em>Branch instead of freeze. </em>On the other hand, if testing requires freezing a codeline, developers who have pending changes will have to sit on their changes<br />
until the testing is complete. If this is the case, branch the codeline early enough so that developers can check in and get on with their work.</p>
<p><strong>5. Change Propagation</strong><br />
Once you have branched codelines, you face the chore of propagating file changes across branches. This is rarely a trivial task, but there are some things you can do to<br />
keep it manageable.<br />
· <em>Make original changes in the branch that has evolved the least since branching.</em> It is much easier to merge a change from a file that is close to the common<br />
ancestor than it is to merge a change from a file that has diverged considerably. This is because the change in the file that has diverged may be built upon<br />
changes that are not being propagated, and those unwanted changes can confound the merge process. You can minimize the merge complexity by making<br />
original changes in the branch that is the most stable. For example, if a release codeline is branched from a mainline, make a bug fix first in the release line and<br />
then merge it into the mainline. If you make the bug fix in the mainline first, subsequently merging it into a release codeline may require you to <em>back out</em><br />
other, incompatible changes that aren’t meant to go into the release codeline.<br />
· <em>Propagate early and often. </em>When it’s feasible to propagate a change from one branch to another (that is, if the change wouldn’t violate the target branch’s<br />
policy), do it sooner rather than later. Postponed and batched change propagations can result in stunningly complex file merges.<br />
· <em>Get the right person to do the merge. </em>The burden of change propagation can be lightened by assigning the responsibility to the engineer best prepared to resolve<br />
file conflicts. Changes can be propagated by (a) the owner of the target files, (b) the person who make the original changes, or (c) someone else. Either (a) or (b)<br />
will do a better job than (c).</p>
<p><strong>6. Builds</strong><br />
A build is the business of constructing usable software from original source files. Builds are more manageable and less prone to problems when a few key practices are<br />
observed:<br />
· <em>Source + tools = product. </em>The only ingredients in a build should be source files and the tools to which they are input. Memorized procedures and yellow stickies<br />
have no place in this equation. Given the same source files and build tools, the resulting product should always be the same. If you have rote setup procedures,<br />
automate them in scripts. If you have manual setup steps, document them in build instructions. And document all tool specifications, including OS, compilers, include files, link libraries, make programs, and executable paths.<br />
· <em>Check in </em>all <em>original source. </em>When software can’t be reliably reproduced from the same ingredients, chances are the ingredient list is incomplete. Frequently<br />
overlooked ingredients are makefiles, setup scripts, build scripts, build instructions, and tool specifications. All of these are the source you build with.<br />
Remember: <em>source + tools = product.</em><br />
· <em>Segregate built objects from original source. </em>Organize your builds so that the directories containing original source files are not polluted by built objects<em>.</em><br />
Original source files are those you create “from an original thought process” with a text editor, an application generator, or any other interactive tool. Built objects<br />
are all the files that get created during your build process, including generated source files. Built objects should not go into your source code directories.<br />
Instead, build them into a directory tree of their own. This segregation allows you to limit the scope of SCM-managed directories to those that contain only<br />
source. It also corrals the files that tend to be large and/or expendable into one location, and simplifies disk space management for builds.<br />
· <em>Use common build tools. </em>Developers, test engineers, and release engineers should all use the same build tools. Much time is wasted when a developer<br />
cannot reproduce a problem found in testing, or when the released product varies from what was tested. Remember: <em>source + tools = product.</em><br />
· <em>Build often. </em>Frequent, end-to-end builds with regression testing (“sanity” builds) have two benefits: (1) they reveal integration problems introduced by check-ins,<br />
and (2) they produce link libraries and other built objects that can be used by developers. In an ideal world, sanity builds would occur after every check-in, but<br />
in an active codeline it’s more practical to do them at intervals, typically nightly. Every codeline branch should be subject to regular, frequent, and complete builds<br />
and regression testing, even when product release is in the distant future.<br />
· <em>Keep build logs and build outputs. </em>For any built object you produce, you should be able to look up the exact operations (e.g., complete compiler flag and link<br />
command text) that produced the last known good version of it. Archive build outputs and logs, including source file versions (e.g., a label), tool and OS<br />
version info, compiler outputs, intermediate files, built objects, and test results, for future reference. As large software projects evolve, components are handed<br />
off from one group to another, and the receiving group may not be in a position to begin builds of new components immediately. When they do begin to build<br />
new components, they will need access to previous build logs in order to diagnose the integration problems they encounter.</p>
<p><strong>7. Process</strong><br />
It would take an entire paper, or several papers, to explore the full scope of SCM process design and implementation, and many such papers have already been written. Furthermore, your shop has specific objectives and requirements that will be reflected in the process you implement, and we do not presume to know what those are. In our experience, however, some process concepts are key to any SCM implementation:<br />
· <em>Track change packages. </em>Even though each file in a codeline has its revision history, each revision in its history is only useful in the context of a set of related<br />
files. The question “What other source files were changed along with this particular change to foo.c?” can’t be answered unless you track change<br />
<em>packages</em>, or sets of files related by a logical change. Change packages, not individual file changes, are the visible manifestation of software development.<br />
Some SCM systems track change packages for you; if yours doesn’t, write an interface that does.<br />
· <em>Track change package propagations. </em>One clear benefit of tracking change packages is that it becomes very easy propagate logical changes (e.g., bug fixes)<br />
from one codeline branch to another. However, it’s not enough to simply propagate change packages across branches; you must keep track of which<br />
change packages have been propagated, which propagations are pending, and which codeline branches are likely donors or recipients of propagations.<br />
Otherwise you’ll never be able to answer the question “Is the fix for bug X in the release Y codeline?” Again, some SCM systems track change package<br />
propagations for you, whereas with others you’ll have to write your own interface to do it. Ultimately, you should never have to resort to “diffing” files to<br />
figure out if a change package has been propagated between codelines.</p>
<p>· <em>Distinguish change requests from change packages. </em>“What to do” and “what was done” are different data entities. For example, a bug report is a “what to do”<br />
entity and a bug fix is a “what was done” entity. Your SCM process should distinguish between the two, because in fact there can be a one-to-many<br />
relationship between change requests and change packages.<br />
· <em>Give everything an owner. </em>Every process, policy, document, product, component, codeline, branch, and task in your SCM system should have an<br />
owner. Owners give life to these entities by representing them; an entity with an owner can grow and mature. Ownerless entities are like obstacles in an ant trail<br />
– the ants simply march around them as if they weren’t there.<br />
· <em>Use living documents. </em>The policies and procedures you implement should be described in living documents; that is, your process documentation should be as<br />
readily available and as subject to update as your managed source code. Documents that aren’t accessible are useless; documents that aren’t updateable<br />
are nearly so. Process documents should be accessible from all of your development environments: at your own workstation, at someone else’s<br />
workstation, and from your machine at home. And process documents should be easily updateable, and updates should be immediately available.</p>
<p><strong>8. Conclusion</strong><br />
Best practices in SCM, like best practices anywhere, always seem obvious once you’ve used them. The practices discussed in this paper have worked well for us, but<br />
we recognize that no single, short document can contain them all. So we have presented the practices that offer the greatest return and yet seem to be violated more<br />
often than not. We welcome the opportunity to improve this document, and solicit both challenges to the above practices as well as the additions of new ones.</p>
<p><strong>10. References</strong><br />
Berczuk, Steve. &#8220;Configuration Management Patterns&#8221;, 1997. Available at<br />
http://www.bell-labs.com/cgi-user/OrgPatterns/OrgPatterns?ConfigurationManagementPatterns.<br />
Compton, Stephen B, <em>Configuration Management for Software</em>, VNR Computer<br />
Library, Van Nostrand Reinhold, 1993.<br />
Continuus Software Corp., “Work Area Management”, <em>Continuus/CM: Change</em><br />
<em>Management for Software Development. </em>Available at<br />
http://www.continuus.com/developers/developersACE.html.<br />
Dart, Susan, &#8220;Spectrum of Functionality in Configuration Management Systems&#8221;,<br />
Software Engineering Institute, 1990. Available at<br />
<a href="http://www.sei.cmu.edu/technology/case/scm/tech_rep/TR11_90/TOC_TR11_90.html">http://www.sei.cmu.edu/technology/case/scm/tech_rep/TR11_90/TOC_TR11_90.html</a></p>
<p>Jameson, Kevin, <em>Multi Platform Code Management</em>, O&#8217;Reilly &amp; Associates, 1994<br />
Linenbach, Terris, &#8220;Programmers&#8217; Canvas: A pattern for source code management&#8221;<br />
1996. Available at http://www.rahul.net/terris/ProgrammersCanvas.htm.<br />
Lyon, David D, <em>Practical CM</em>, Raven Publishing, 1997<br />
McConnell, Steve, &#8220;Best Practices: Daily Build and Smoke Test&#8221;,<br />
<em>IEEE Software</em>, Vol. 13, No. 4, July 1996<br />
van der Hoek, Andre, Hall, Richard S., Heimbigner, Dennis, and Wolf, Alexander L.,<br />
&#8220;Software Release Management&#8221;, <em>Proceedings of the 6th European Software</em><br />
<em>Engineering Conference</em>, Zurich, Switzerland, 1997.</p>
<p><strong>10. Author</strong></p>
<p>Laura Wingerd<br />
Perforce Software, Inc.<br />
wingerd@perforce.com<br />
Christopher Seiwald<br />
Perforce Software, Inc.<br />
seiwald@perforce.com</p>
<p>The post <a href="https://www.scmgalaxy.com/tutorials/best-practices-in-software-configuration-management/">Best Practices in Software Configuration Management &#8211; SCM Best Practices Guide</a> appeared first on <a href="https://www.scmgalaxy.com/tutorials">scmGalaxy</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.scmgalaxy.com/tutorials/best-practices-in-software-configuration-management/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
