<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Customize This: Tailoring deployment packages to your target environments</title>
	<atom:link href="http://blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/</link>
	<description>Software development done right!</description>
	<lastBuildDate>Wed, 08 Feb 2012 14:41:38 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Mark van Holsteijn</title>
		<link>http://blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/#comment-96512</link>
		<dc:creator>Mark van Holsteijn</dc:creator>
		<pubDate>Fri, 17 Sep 2010 18:36:28 +0000</pubDate>
		<guid isPermaLink="false">http://blog.xebia.com/?p=4893#comment-96512</guid>
		<description>When a file does not have a particular structure, the configuration instructions work off a template file that contains references to configuration variables. In this case, you have to specify a source and a destination in the deployment unit. e.g.

replace-properties from sql/.create-table.sql to sql/create-table.sql

Configuration variables do not have to be included and can be specified at configuration time. This allows the administrator to keep the security sensitive properties apart from the general settings.


Cheers,

Mark</description>
		<content:encoded><![CDATA[<p>When a file does not have a particular structure, the configuration instructions work off a template file that contains references to configuration variables. In this case, you have to specify a source and a destination in the deployment unit. e.g.</p>
<p>replace-properties from sql/.create-table.sql to sql/create-table.sql</p>
<p>Configuration variables do not have to be included and can be specified at configuration time. This allows the administrator to keep the security sensitive properties apart from the general settings.</p>
<p>Cheers,</p>
<p>Mark</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Andrew Phillips</title>
		<link>http://blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/#comment-96297</link>
		<dc:creator>Andrew Phillips</dc:creator>
		<pubDate>Mon, 06 Sep 2010 12:51:39 +0000</pubDate>
		<guid isPermaLink="false">http://blog.xebia.com/?p=4893#comment-96297</guid>
		<description>&lt;em&gt;@Mark:&lt;/em&gt; the tool you describe sounds like a flexible and quite powerful customization solution. If I understand correctly, it is based around a &quot;customization descriptor&quot; file that contains the pointer definitions (the actual values are also specified in the package or are supplied externally at &quot;customization time&quot;)? 

I can see how the customization descriptor, assuming it is written in a fairly human-readable way, can provide some visibility into the customization process, especially if the customizations for the entire package can be reviewed in one file. Pointer syntax (think &lt;a href=&quot;http://en.wikipedia.org/wiki/Xpath&quot; target=&quot;_new&quot; rel=&quot;nofollow&quot;&gt;XPath&lt;/a&gt;) can be hard to interpret, but that be mitigated by including a plain text description of what is actually being pointed to.

I&#039;d be more curious to know how this approach provides safety, however. Idempotency prevents you from screwing up if you run the customization multiple times, but that doesn&#039;t address the issue of customizations not being applied at all. Of course, your tool may somehow integrated with the app server...

Regarding the other points:

&lt;em&gt;&gt; 1. Pointer based is precise. You will NOT have any accidental replacements and 
&gt; if it performs a incorrect replacement, it is consistently incorrect&lt;/em&gt;

Agreed, although with a suitable placeholder syntax (&lt;tt&gt;${...}&lt;/tt&gt; or whatever) accidental replacements should not happen either. Certainly, plain string search&#039;n&#039;replace is something to avoid if at all possible.

&lt;em&gt;&gt; 2. Pointer based is non-intrusive: No changes are required to the source 
&gt; files themselves.&lt;/em&gt;

Indeed - perhaps the main reason why pointer-based replacement scores &#039;High&#039; for convenience.

&lt;em&gt;&gt; 3. It supports strict separation of responsibility between developer and 
&gt; deployer, although best results are achieved when they cooperate.&lt;/em&gt;

That depends largely on whether or how the customization descriptor splits the pointer specification from the specification of the actual values. This also determines, to a large extent, how well the system can deal with sensitive data that should only be seen by deployers (the production database password, for instance).

&lt;em&gt;&gt; 4. Above two features allows you to configure any deployment unit, not just the 
&gt; once that were prepared by the developers.&lt;/em&gt;

Indeed - that&#039;s what I meant by &lt;em&gt;&quot;Ironically, this can be useful in order to &quot;patch&quot; packages that were not written in a customizable way.&quot;&lt;/em&gt; ;-) It shouldn&#039;t be forgotton, though, that pointer-based replacement only works if the targeted files have a suitable structure where elements can reliably be pointed &lt;em&gt;to&lt;/em&gt;. 

For &lt;tt&gt;.properties&lt;/tt&gt; files this is fairly trivial, and XML supports powerful, fine-grained pointers via XPath (although constructing these for e.g. a piece of WebSphere configuration XML can be a non-trivial exercise!), but modifying an SQL script via pointers can present some interesting challenges.</description>
		<content:encoded><![CDATA[<p><em>@Mark:</em> the tool you describe sounds like a flexible and quite powerful customization solution. If I understand correctly, it is based around a &#8220;customization descriptor&#8221; file that contains the pointer definitions (the actual values are also specified in the package or are supplied externally at &#8220;customization time&#8221;)? </p>
<p>I can see how the customization descriptor, assuming it is written in a fairly human-readable way, can provide some visibility into the customization process, especially if the customizations for the entire package can be reviewed in one file. Pointer syntax (think <a href="http://en.wikipedia.org/wiki/Xpath" target="_new" rel="nofollow">XPath</a>) can be hard to interpret, but that be mitigated by including a plain text description of what is actually being pointed to.</p>
<p>I&#8217;d be more curious to know how this approach provides safety, however. Idempotency prevents you from screwing up if you run the customization multiple times, but that doesn&#8217;t address the issue of customizations not being applied at all. Of course, your tool may somehow integrated with the app server&#8230;</p>
<p>Regarding the other points:</p>
<p><em>> 1. Pointer based is precise. You will NOT have any accidental replacements and<br />
> if it performs a incorrect replacement, it is consistently incorrect</em></p>
<p>Agreed, although with a suitable placeholder syntax (<tt>${...}</tt> or whatever) accidental replacements should not happen either. Certainly, plain string search&#8217;n'replace is something to avoid if at all possible.</p>
<p><em>> 2. Pointer based is non-intrusive: No changes are required to the source<br />
> files themselves.</em></p>
<p>Indeed &#8211; perhaps the main reason why pointer-based replacement scores &#8216;High&#8217; for convenience.</p>
<p><em>> 3. It supports strict separation of responsibility between developer and<br />
> deployer, although best results are achieved when they cooperate.</em></p>
<p>That depends largely on whether or how the customization descriptor splits the pointer specification from the specification of the actual values. This also determines, to a large extent, how well the system can deal with sensitive data that should only be seen by deployers (the production database password, for instance).</p>
<p><em>> 4. Above two features allows you to configure any deployment unit, not just the<br />
> once that were prepared by the developers.</em></p>
<p>Indeed &#8211; that&#8217;s what I meant by <em>&#8220;Ironically, this can be useful in order to &#8220;patch&#8221; packages that were not written in a customizable way.&#8221;</em> <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  It shouldn&#8217;t be forgotton, though, that pointer-based replacement only works if the targeted files have a suitable structure where elements can reliably be pointed <em>to</em>. </p>
<p>For <tt>.properties</tt> files this is fairly trivial, and XML supports powerful, fine-grained pointers via XPath (although constructing these for e.g. a piece of WebSphere configuration XML can be a non-trivial exercise!), but modifying an SQL script via pointers can present some interesting challenges.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mark van Holsteijn</title>
		<link>http://blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/#comment-96222</link>
		<dc:creator>Mark van Holsteijn</dc:creator>
		<pubDate>Wed, 01 Sep 2010 15:33:50 +0000</pubDate>
		<guid isPermaLink="false">http://blog.xebia.com/?p=4893#comment-96222</guid>
		<description>Andrew,

Nice article and good to see that you have named the different styles of customizing deployments. 

In a solution that I created for a customer I introduced the concept of configurable deployment units. A configuration deployment unit contains all the relevant instructions to tailor the deployment unit to a specific environment.  A important feature of this deployment unit is that the configuration operation itself is idempotent.  Repeated configuration of the same deployment unit delivers the same result (unless the parameter values change). 

A self contained configurable deployment unit is a specialization which also contains all the parameter values for the different environment (D, T, A and P). 

The deployment configurator executes the actual instructions, provides the visibility and safety features that you claim are inherent disadvantages of the pointer based replacement pattern.  You could even improve the tooling surrounding the configurable deployment unit to provide more insight into the configuration process to the developer and deployer alike (For instance through an eclipse plugin).

In addition, the configurator does support token based replacement as well but you have to explicit instruct it and provide a source and target name to ensure idempotency of the configuration. 

The reasons I prefer pointer based above token based are:

1. Pointer based is precise.  You will NOT have any accidental replacements and if it performs a incorrect replacement, it is consistently incorrect ;-) 
2. Pointer based is non-intrusive: No changes are required to the source files themselves. 
3. It supports strict separation of responsibility between developer and deployer, although best results are achieved when they cooperate.
4. Above two features allows you to configure &lt;strong&gt;any&lt;/strong&gt; deployment unit, not just the once that were prepared by the developers.

Cheers,

Mark</description>
		<content:encoded><![CDATA[<p>Andrew,</p>
<p>Nice article and good to see that you have named the different styles of customizing deployments. </p>
<p>In a solution that I created for a customer I introduced the concept of configurable deployment units. A configuration deployment unit contains all the relevant instructions to tailor the deployment unit to a specific environment.  A important feature of this deployment unit is that the configuration operation itself is idempotent.  Repeated configuration of the same deployment unit delivers the same result (unless the parameter values change). </p>
<p>A self contained configurable deployment unit is a specialization which also contains all the parameter values for the different environment (D, T, A and P). </p>
<p>The deployment configurator executes the actual instructions, provides the visibility and safety features that you claim are inherent disadvantages of the pointer based replacement pattern.  You could even improve the tooling surrounding the configurable deployment unit to provide more insight into the configuration process to the developer and deployer alike (For instance through an eclipse plugin).</p>
<p>In addition, the configurator does support token based replacement as well but you have to explicit instruct it and provide a source and target name to ensure idempotency of the configuration. </p>
<p>The reasons I prefer pointer based above token based are:</p>
<p>1. Pointer based is precise.  You will NOT have any accidental replacements and if it performs a incorrect replacement, it is consistently incorrect <img src='http://blog.xebia.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
2. Pointer based is non-intrusive: No changes are required to the source files themselves.<br />
3. It supports strict separation of responsibility between developer and deployer, although best results are achieved when they cooperate.<br />
4. Above two features allows you to configure <strong>any</strong> deployment unit, not just the once that were prepared by the developers.</p>
<p>Cheers,</p>
<p>Mark</p>
]]></content:encoded>
	</item>
</channel>
</rss>
<!-- This Quick Cache file was built for (  blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/feed/ ) in 0.50555 seconds, on Feb 9th, 2012 at 10:17 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 9th, 2012 at 11:17 pm UTC -->
