<?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>jon torresdal</title>
	<atom:link href="http://blog.torresdal.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.torresdal.net</link>
	<description></description>
	<lastBuildDate>Sat, 23 Mar 2013 20:39:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>How ConDep came to life</title>
		<link>http://blog.torresdal.net/2013/03/23/how-condep-came-to-life/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-condep-came-to-life</link>
		<comments>http://blog.torresdal.net/2013/03/23/how-condep-came-to-life/#comments</comments>
		<pubDate>Sat, 23 Mar 2013 20:39:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/?p=903</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/uncategorized/" title="Uncategorized">Uncategorized</a></p>Some people have asked me how ConDep came to life. Here’s the short story… ConDep had several incarnations before it ending up as a DSL as today. The first version I created at Frende (where I work and where ConDep also came to life) was a set of PowerShell scripts and WebDeploy executing from a [...]]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/uncategorized/" title="Uncategorized">Uncategorized</a></p><p><a href="http://blog.torresdal.net/wp-content/uploads/2013/03/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://blog.torresdal.net/wp-content/uploads/2013/03/image_thumb.png" width="240" height="106" /></a>Some people have asked me how <a href="www.con-dep.net" target="_blank">ConDep</a> came to life. Here’s the short story… </p>
<p>ConDep had several incarnations before it ending up as a DSL as today. The first version I created at Frende (where I work and where ConDep also came to life) was a set of PowerShell scripts and WebDeploy executing from a build server (TFS back then) (there’s a <a href="http://www.hanselman.com/blog/HanselminutesPodcast230ContinuousDeploymentWithJonT%C3%B8rresdal.aspx" target="_blank">Hanselminutes interview</a> where I talk about that experience). 2nd version was a web application using PowerShell Remoting and WebDeploy Packages to push applications on demand (one click deployent). That worked for a while, but didn’t scale and was not flexible. 3rd attempt was creating a set of custom providers for WebDeploy which didn’t work at all. And finally, the 4th attempt, about 3 years after the 1st, ConDep started to come to life. The breakthrough was when I found a decent way of using the WebDeploy API in .NET to automate deployment and execution. </p>
<p>When I figured out how to do PowerShell over WebDeploy’s runCmd (remote cmd.exe) I had solved the 4 most pressing issues: </p>
<ol>
<li>Remote DOS (cmd.exe) execution over HTTP/HTTPS </li>
<li>Remote PowerShell executing (without PS Remoting) over HTTP/HTTPS </li>
<li>Decent deployment for files, directories and web applications that was not XCopy and also over HTTP/HTTPS</li>
<li>Built-in intelligence of how to work the load balancer during deployment. </li>
</ol>
<p>Some have also been surprised that an open source framework like this come out of a Norwegian insurance company. For me and for my coworkers (I hope) this is not surprising at all. First of all we use a number of open source frameworks and tools on a day-to-day basis and value them greatly, but most importantly solving deployment issues and technical time to market is not my company’s main focus area. So it made perfect sense to push this out to the community, get feedback and hopefully get help and input shaping it to become much better than we could ever figure out on our own. And in all fairness, I’ve created the majority of ConDep on my own private time, but couldn’t have done that without the challenges and experience I’ve got from where I work, and not to forget feedback and challenges from co-workers.</p>
<p>Have you tried or are using ConDep? Let me know what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2013/03/23/how-condep-came-to-life/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing ConDep</title>
		<link>http://blog.torresdal.net/2013/02/25/introducing-condep/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introducing-condep</link>
		<comments>http://blog.torresdal.net/2013/02/25/introducing-condep/#comments</comments>
		<pubDate>Mon, 25 Feb 2013 20:59:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ContinuousDelivery]]></category>
		<category><![CDATA[ContinuousDeployment]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[WebDeploy]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/?p=884</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/net/" title=".Net">.Net</a><a href="http://blog.torresdal.net/category/continuousdelivery/" title="ContinuousDelivery">ContinuousDelivery</a><a href="http://blog.torresdal.net/category/continuousdeployment/" title="ContinuousDeployment">ContinuousDeployment</a><a href="http://blog.torresdal.net/category/csharp/" title="CSharp">CSharp</a><a href="http://blog.torresdal.net/category/deployment/" title="Deployment">Deployment</a><a href="http://blog.torresdal.net/category/devops/" title="DevOps">DevOps</a><a href="http://blog.torresdal.net/category/iis/" title="IIS">IIS</a><a href="http://blog.torresdal.net/category/webdeploy/" title="WebDeploy">WebDeploy</a><a href="http://blog.torresdal.net/category/windows/" title="Windows">Windows</a></p>What’s ConDep? ConDep is an open source, highly extendable Domain Specific Language for Continuous Deployment, Continuous Delivery and Infrastructure as Code on Windows. What would I typically use ConDep for? To effectively deploy web and other server type applications to Windows servers, together with it’s required infrastructure (like IIS, WebSites, AppPools etc). Where can I [...]]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/net/" title=".Net">.Net</a><a href="http://blog.torresdal.net/category/continuousdelivery/" title="ContinuousDelivery">ContinuousDelivery</a><a href="http://blog.torresdal.net/category/continuousdeployment/" title="ContinuousDeployment">ContinuousDeployment</a><a href="http://blog.torresdal.net/category/csharp/" title="CSharp">CSharp</a><a href="http://blog.torresdal.net/category/deployment/" title="Deployment">Deployment</a><a href="http://blog.torresdal.net/category/devops/" title="DevOps">DevOps</a><a href="http://blog.torresdal.net/category/iis/" title="IIS">IIS</a><a href="http://blog.torresdal.net/category/webdeploy/" title="WebDeploy">WebDeploy</a><a href="http://blog.torresdal.net/category/windows/" title="Windows">Windows</a></p><p><strong>What’s ConDep?</strong></p>
<p>ConDep is an open source, highly extendable Domain Specific Language for Continuous Deployment, Continuous Delivery and Infrastructure as Code on Windows.</p>
<p><strong>What would I typically use ConDep for?</strong></p>
<p>To effectively deploy web and other server type applications to Windows servers, together with it’s required infrastructure (like IIS, WebSites, AppPools etc). </p>
<p><strong>Where can I get it?</strong></p>
<p>Latest NuGet package: <a title="https://nuget.org/packages/ConDep/" href="https://nuget.org/packages/ConDep/">https://nuget.org/packages/ConDep/</a></p>
<p>Source: <a title="https://github.com/torresdal/ConDep" href="https://github.com/torresdal/ConDep">https://github.com/torresdal/ConDep</a></p>
<p><strong>Who created it?</strong></p>
<p>I did :-)</p>
<p><strong>How do I get started?</strong></p>
<p>There’s a <a href="http://www.con-dep.net/documentation/1-0-1/getting-started/" target="_blank">Getting Started</a> section over at <a href="http://con-dep.net">http://con-dep.net</a> that should help you get up to speed and there’s some sample projects on GitHub (<a title="https://github.com/torresdal/ConDep.Samples" href="https://github.com/torresdal/ConDep.Samples">https://github.com/torresdal/ConDep.Samples</a>), but here’s a quick intro:</p>
<ol>
<li>Create a Class Library in Visual Studio (name it Deployment) </li>
<li>Get ConDep from NuGet (ConDep not ConDep.Dsl) </li>
<li>Create an ApplicationArtifact:      <br /> 
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<div id="codeSnippet" class="csharpcode">
<pre class="alt"><span class="kwrd">using</span> ConDep.Dsl;</pre>
<p><!--CRLF--></p>
<pre class="alteven"><span class="kwrd">using</span> ConDep.Dsl.Config;</pre>
<p><!--CRLF--></p>
<pre class="alt">&#160;</pre>
<p><!--CRLF--></p>
<pre class="alteven"><span class="kwrd">namespace</span> ConDepSamples.DotNetWebAppWithInfrastructure</pre>
<p><!--CRLF--></p>
<pre class="alt">{</pre>
<p><!--CRLF--></p>
<pre class="alteven">    <span class="kwrd">public</span> <span class="kwrd">class</span> DotNetWebApplication : ApplicationArtifact, IDependOnInfrastructure&lt;WebServerInfrastructure&gt;</pre>
<p><!--CRLF--></p>
<pre class="alt">    {</pre>
<p><!--CRLF--></p>
<pre class="alteven">        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Configure(IOfferLocalOperations onLocalMachine, ConDepConfig config)</pre>
<p><!--CRLF--></p>
<pre class="alt">        {</pre>
<p><!--CRLF--></p>
<pre class="alteven">            <span class="rem">//Deploy a Web Application to remote server(s)</span></pre>
<p><!--CRLF--></p>
<pre class="alt">            onLocalMachine.ToEachServer</pre>
<p><!--CRLF--></p>
<pre class="alteven">            (</pre>
<p><!--CRLF--></p>
<pre class="alt">                server =&gt; server.Deploy.IisWebApplication</pre>
<p><!--CRLF--></p>
<pre class="alteven">                (</pre>
<p><!--CRLF--></p>
<pre class="alt">                    sourceDir:      <span class="str">@&quot;..\..\..\SampleApps\AspNetWebFormApp&quot;</span>, </pre>
<p><!--CRLF--></p>
<pre class="alteven">                    webAppName:     <span class="str">&quot;AspNetWebFormApp&quot;</span>, </pre>
<p><!--CRLF--></p>
<pre class="alt">                    webSiteName:    <span class="str">&quot;ConDepSamples&quot;</span></pre>
<p><!--CRLF--></p>
<pre class="alteven">                )</pre>
<p><!--CRLF--></p>
<pre class="alt">            );</pre>
<p><!--CRLF--></p>
<pre class="alteven">&#160;</pre>
<p><!--CRLF--></p>
<pre class="alt">            <span class="rem">//Test that the Web Application works by executing a HTTP GET (failes if not HTTP Code 200 is returned)</span></pre>
<p><!--CRLF--></p>
<pre class="alteven">            onLocalMachine.HttpGet</pre>
<p><!--CRLF--></p>
<pre class="alt">            (</pre>
<p><!--CRLF--></p>
<pre class="alteven">                 url: <span class="kwrd">string</span>.Format(<span class="str">&quot;http://{0}:8082/AspNetWebFormApp/&quot;</span>, config.Servers[0].Name)</pre>
<p><!--CRLF--></p>
<pre class="alt">            );</pre>
<p><!--CRLF--></p>
<pre class="alteven">        }</pre>
<p><!--CRLF--></p>
<pre class="alt">    }</pre>
<p><!--CRLF--></p>
<pre class="alteven">}</pre>
<p><!--CRLF--></div>
</p></div>
</li>
<li>Create an InfrastructureArtifact<br />
    </p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<div id="codeSnippet" class="csharpcode">
<pre class="alt"><span class="kwrd">using</span> ConDep.Dsl;</pre>
<p><!--CRLF--></p>
<pre class="alteven"><span class="kwrd">using</span> ConDep.Dsl.Config;</pre>
<p><!--CRLF--></p>
<pre class="alt">&#160;</pre>
<p><!--CRLF--></p>
<pre class="alteven"><span class="kwrd">namespace</span> ConDepSamples.DotNetWebAppWithInfrastructure</pre>
<p><!--CRLF--></p>
<pre class="alt">{</pre>
<p><!--CRLF--></p>
<pre class="alteven">    <span class="kwrd">public</span> <span class="kwrd">class</span> WebServerInfrastructure : InfrastructureArtifact</pre>
<p><!--CRLF--></p>
<pre class="alt">    {</pre>
<p><!--CRLF--></p>
<pre class="alteven">        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Configure(IOfferInfrastructure require, ConDepConfig config)</pre>
<p><!--CRLF--></p>
<pre class="alt">        {</pre>
<p><!--CRLF--></p>
<pre class="alteven">            require</pre>
<p><!--CRLF--></p>
<pre class="alt">                <span class="rem">//Install IIS with Asp.net if not present</span></pre>
<p><!--CRLF--></p>
<pre class="alteven">                .IIS(iis =&gt; iis.Include.AspNet())</pre>
<p><!--CRLF--></p>
<pre class="alt">&#160;</pre>
<p><!--CRLF--></p>
<pre class="alteven">                <span class="rem">//Add an Application Pool running .NET Framework 4.0 (.NET 4.0 must be installed and registered with IIS)</span></pre>
<p><!--CRLF--></p>
<pre class="alt">                .IISAppPool(<span class="str">&quot;ConDepSamplesAppPool&quot;</span>, appPool =&gt; appPool.NetFrameworkVersion(NetFrameworkVersion.Net4_0))</pre>
<p><!--CRLF--></p>
<pre class="alteven">&#160;</pre>
<p><!--CRLF--></p>
<pre class="alt">                <span class="rem">//Create a Web Site (id 34) on port 8082 and asociate with application pool.</span></pre>
<p><!--CRLF--></p>
<pre class="alteven">                .IISWebSite(<span class="str">&quot;ConDepSamples&quot;</span>, 34, opt =&gt; opt</pre>
<p><!--CRLF--></p>
<pre class="alt">                    .AddHttpBinding(binding =&gt; binding.Port(8082))</pre>
<p><!--CRLF--></p>
<pre class="alteven">                    .ApplicationPool(<span class="str">&quot;ConDepSamplesAppPool&quot;</span>));</pre>
<p><!--CRLF--></p>
<pre class="alt">        }</pre>
<p><!--CRLF--></p>
<pre class="alteven">    }</pre>
<p><!--CRLF--></p>
<pre class="alt">}</pre>
<p><!--CRLF--></div>
</p></div>
</li>
<li>Create a config file (dev.env.json) and point to one or more servers you want to deploy to:<br />
    </p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper">
<div id="codeSnippet" class="csharpcode">
<pre class="alt">{</pre>
<p><!--CRLF--></p>
<pre class="alteven">    <span class="str">&quot;Servers&quot;</span> :</pre>
<p><!--CRLF--></p>
<pre class="alt">    [</pre>
<p><!--CRLF--></p>
<pre class="alteven">        {</pre>
<p><!--CRLF--></p>
<pre class="alt">            <span class="str">&quot;Name&quot;</span> : <span class="str">&quot;jat-web03&quot;</span></pre>
<p><!--CRLF--></p>
<pre class="alteven">        }</pre>
<p><!--CRLF--></p>
<pre class="alt">    ],</pre>
<p><!--CRLF--></p>
<pre class="alteven">    <span class="str">&quot;DeploymentUser&quot;</span>: </pre>
<p><!--CRLF--></p>
<pre class="alt">    {</pre>
<p><!--CRLF--></p>
<pre class="alteven">        <span class="str">&quot;UserName&quot;</span>: <span class="str">&quot;torresdal\\condeptest&quot;</span>,</pre>
<p><!--CRLF--></p>
<pre class="alt">        <span class="str">&quot;Password&quot;</span>: <span class="str">&quot;ReallySecureP@ssw0rd :)&quot;</span></pre>
<p><!--CRLF--></p>
<pre class="alteven">    }</pre>
<p><!--CRLF--></p>
<pre class="alt">}</pre>
<p><!--CRLF--></div>
</p></div>
</li>
<li>Build </li>
<li>Open cmd.exe and navigate to your bin/debug folder </li>
<li>Execute: <code>ConDep.exe Deployment.dll dev DotNetWebApplication</code> </li>
</ol>
<p>Feedback is welcome :-)</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2013/02/25/introducing-condep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lightning Talk: Why you shouldn&#8217;t track bugs</title>
		<link>http://blog.torresdal.net/2012/11/10/lightning-talk-why-you-shouldnt-track-bugs/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lightning-talk-why-you-shouldnt-track-bugs</link>
		<comments>http://blog.torresdal.net/2012/11/10/lightning-talk-why-you-shouldnt-track-bugs/#comments</comments>
		<pubDate>Sat, 10 Nov 2012 13:44:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/?p=794</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/agile/" title="Agile">Agile</a><a href="http://blog.torresdal.net/category/kanban/" title="Kanban">Kanban</a><a href="http://blog.torresdal.net/category/lean/" title="Lean">Lean</a><a href="http://blog.torresdal.net/category/scrum/" title="Scrum">Scrum</a><a href="http://blog.torresdal.net/category/testing/" title="Testing">Testing</a></p>I did a lightning talk at the Roots conference back in April titled &#8220;The simplest solution to bug tracking: don&#8217;t!&#8221;. The 6 minute talk is now online at Vimeo.com together with the other lighting talks at Roots.]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/agile/" title="Agile">Agile</a><a href="http://blog.torresdal.net/category/kanban/" title="Kanban">Kanban</a><a href="http://blog.torresdal.net/category/lean/" title="Lean">Lean</a><a href="http://blog.torresdal.net/category/scrum/" title="Scrum">Scrum</a><a href="http://blog.torresdal.net/category/testing/" title="Testing">Testing</a></p><p>I did a lightning talk at the <a href="http://rootsconf.no/">Roots conference</a> back in April titled &#8220;The simplest solution to bug tracking: don&#8217;t!&#8221;. The 6 minute talk is now online at Vimeo.com together with the <a href="http://vimeo.com/rootsconf">other lighting talks at Roots</a>.</p>
<p><iframe src="http://player.vimeo.com/video/52686653?badge=0" frameborder="0" width="600" height="336"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2012/11/10/lightning-talk-why-you-shouldnt-track-bugs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How Do We Track Bugs? Check In a Failing Test!</title>
		<link>http://blog.torresdal.net/2012/01/23/how-do-we-track-bugs-check-in-a-failing-test/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-do-we-track-bugs-check-in-a-failing-test</link>
		<comments>http://blog.torresdal.net/2012/01/23/how-do-we-track-bugs-check-in-a-failing-test/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 06:00:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[TeamManagement]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/2012/01/23/HowDoWeTrackBugsCheckInAFailingTest.aspx</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/agile/" title="Agile">Agile</a><a href="http://blog.torresdal.net/category/kanban/" title="Kanban">Kanban</a><a href="http://blog.torresdal.net/category/teammanagement/" title="TeamManagement">TeamManagement</a><a href="http://blog.torresdal.net/category/testing/" title="Testing">Testing</a><a href="http://blog.torresdal.net/category/work/" title="Work">Work</a></p>I’ve always tried to avoid bug tracking tools and have several times deleted the entire content in such tools (reported bugs) to great success. However, that’s not what I want to talk about here, but if this sounds weird to you go check out Gojko’s post on the subject. What I want to talk about [...]]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/agile/" title="Agile">Agile</a><a href="http://blog.torresdal.net/category/kanban/" title="Kanban">Kanban</a><a href="http://blog.torresdal.net/category/teammanagement/" title="TeamManagement">TeamManagement</a><a href="http://blog.torresdal.net/category/testing/" title="Testing">Testing</a><a href="http://blog.torresdal.net/category/work/" title="Work">Work</a></p><p>I’ve always tried to avoid bug tracking tools and have several times deleted the entire content in such tools (reported bugs) to great success. However, that’s not what I want to talk about here, but if this sounds weird to you go check out <a href="http://gojko.net/2011/05/17/bug-statistics-are-a-waste-of-time/" target="_blank">Gojko’s post on the subject</a>. </p>
<p>What I want to talk about here is one issue that came up during my team’s retrospective meeting on Friday. One of the improvement points that came up was bugs. Not that there where too many or that we should find more, but that some bugs where fixed and then reappeared as bugs again on a later stage. The suggested solution was: Instead of having the tester pull the buggy story from test and back into dev, he would write a test (integration or unit) that would replicate the bug and check it into source control.</p>
<p>Since we’re doing Kanban, what would the effect of the above action be? It will effectively stop the “assembly line”. In practice CI will report a failing test and the team will stop what they are doing to fix the failing test.</p>
<p>This is of course something we’ll adopt for all bugs, not just bugs that gets reported twice. I’ll leave it up to you to figure out all the benefits (and drawbacks if any) as well as why this solves our problem at hand. I’m looking forward to see how this will work out in practice.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2012/01/23/how-do-we-track-bugs-check-in-a-failing-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stepping Down from NNUG Bergen, Still Chairman of NNUG National</title>
		<link>http://blog.torresdal.net/2011/06/15/stepping-down-from-nnug-bergen-still-chairman-of-nnug-national/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stepping-down-from-nnug-bergen-still-chairman-of-nnug-national</link>
		<comments>http://blog.torresdal.net/2011/06/15/stepping-down-from-nnug-bergen-still-chairman-of-nnug-national/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 08:10:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[NNUG]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/2011/06/15/SteppingDownFromNNUGBergenStillChairmanOfNNUGNational.aspx</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/community/" title="Community">Community</a><a href="http://blog.torresdal.net/category/nnug/" title="NNUG">NNUG</a></p>I’ve been chapter lead of NNUG Bergen for 4,5 years now, together with a great group of people. I think we have accomplished a great deal. We’ve managed to attract some great developers in the local community to attend and participate in our meetings and discussions, as well as local, national and international speakers doing [...]]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/community/" title="Community">Community</a><a href="http://blog.torresdal.net/category/nnug/" title="NNUG">NNUG</a></p><p>I’ve been chapter lead of NNUG Bergen for 4,5 years now, together with a great group of people. I think we have accomplished a great deal. We’ve managed to attract some great developers in the local community to attend and participate in our meetings and discussions, as well as local, national and international speakers doing presentations and being social. When I now step down, it does not mean things are slow and boring. On the contrary, I’m confident NNUG Bergen will still progress towards an even greater community. For me personally I have too much going on and something needs to be sacrificed – and I believe NNUG Bergen will benefit from a change of “leadership”.</p>
<p>For your information the current NNUG Bergen board consist of: <a href="http://twitter.com/#!/stclairjohn" target="_blank">John St. Clair</a>, <a href="http://twitter.com/#!/tormaroe" target="_blank">Torbjørn Marø</a>, <a href="http://twitter.com/oyvindfanebust" target="_blank">Øyvind Fanebust</a> and <a href="http://twitter.com/thedersen" target="_blank">Thomas Pedersen</a> – a great representation of the .NET community in Bergen!</p>
<p>We have yet to announce who’s taking over after me, but we have many possible candidates, and I’m sure that person will continue the success of NNUG Bergen.</p>
<p>I will still be involved in the community though, attend meetings, present (if they allow me) and I will still keep the chairman role of NNUG National. Hopefully now get some more time to focus on tasks related to some of the National activities. Did anyone say a new website would be in order? <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.torresdal.net/content/binary/Windows-Live-Writer/Stepping-Down-from-NNUG-Bergen_9893/wlEmoticon-smile_2.png" /> That’s one of the things we’re going to sort out going forward.</p>
<p>If you know somebody that you think should be part of the board in NNUG Bergen or a candidate for chapter lead, drop me an email and I’ll make sure to forward it to the others.</p>
<p>See you at NNUG!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2011/06/15/stepping-down-from-nnug-bergen-still-chairman-of-nnug-national/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>We (Frende) are hiring</title>
		<link>http://blog.torresdal.net/2011/05/13/we-frende-are-hiring/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=we-frende-are-hiring</link>
		<comments>http://blog.torresdal.net/2011/05/13/we-frende-are-hiring/#comments</comments>
		<pubDate>Fri, 13 May 2011 07:44:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/2011/05/13/WeFrendeAreHiring.aspx</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/work/" title="Work">Work</a></p>Want to work for a great performing and highly skilled team primarily focusing on (but not limited to) Microsoft .NET? To give you a high level (technical) overview of what we’re currently working with, here’s a list: C# 4.0 and Visual Studio 2010 ASP.NET MVC and ASP.NET TDD (Test-Driven-Development) Executable Specifications using Specflow (similar to [...]]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/work/" title="Work">Work</a></p><p><a href="http://www.frende.no"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 10px 0px 20px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://blog.torresdal.net/content/binary/Windows-Live-Writer/Were-hiring_D7B5/image_3.png" width="240" height="25" /></a>Want to work for a great performing and highly skilled team primarily focusing on (but not limited to) Microsoft .NET? To give you a high level (technical) overview of what we’re currently working with, here’s a list:</p>
<ul>
<li>C# 4.0 and Visual Studio 2010 </li>
<li>ASP.NET MVC and ASP.NET </li>
<li>TDD (Test-Driven-Development) </li>
<li>Executable Specifications using Specflow (similar to Cucumber in Ruby) </li>
<li>DSL’s </li>
<li>StructureMap (IoC) </li>
<li>NUnit </li>
<li>NHibernate (ORM) using FluentNHibernate and LinqToNHibernate </li>
<li>NServiceBus </li>
<li>JQuery </li>
<li>Continues Integration using TeamCity </li>
<li>Continues Deployment using WebDeploy </li>
<li>Source Control in TFS </li>
<li>Everybody is Pair Programming </li>
<li>Kanban </li>
</ul>
<p>As you can probably see we’re doing web development only and you’re spot on! There’s a variety of applications ranging from online insurance shop to backend sales applications.</p>
<p>Our team is very much eager to learn and teach each other new techniques and technologies to improve planning, development, quality and delivery of the systems we create. As a member of our team you will be quickly integrated by participating in Pair Programming and take part in decisions and discussions from day 1. We don’t believe in having dedicated experts, but rather generalists that are able to be part of the complete development process, resulting in reduced handoffs. That being said, we all have areas of interests that we focus more on than others. </p>
<p>Quality is something we take seriously and therefor we use Executable Specifications (BDD) to define requirements as well as a communication tool with the business. We also need to have tests for our code units, create good design and have code that is Clean. That’s why we use a unit testing framework together with TDD.</p>
<p>Generally we’re looking for skilled developers. If you would like to work with the technologies mentioned earlier and also have a interest for and motivated by increasing quality by technical testing and you are a team player &#8211; then you are hired! You will then be the team member that has a special interest in driving our progress around Executable Specifications, TDD and any existing or coming tools that will improve our communication with the business as well as code and product quality. </p>
<p>Secondly we also practice Continues Deployment and Continues Integration, have lots of VM’s and have full control of our deployment environments. If you are a person that like some Operations work from time to time in addition to development, your are our new team member!</p>
<p>Last but not least, Frende is a small and young insurance company where communication flows quickly and decisions paths are short.</p>
<p>If this sounds interesting to you or you want to know more, drop me an email at jon@mydomain so we can have a chat.</p>
<p>There’s also a Norwegian ad out here: <a title="http://www.finn.no/finn/job/fulltime/object?finnkode=28416612" href="http://www.finn.no/finn/job/fulltime/object?finnkode=28416612">http://www.finn.no/finn/job/fulltime/object?finnkode=28416612</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2011/05/13/we-frende-are-hiring/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Continues Deployment on Hanselminutes</title>
		<link>http://blog.torresdal.net/2010/09/03/continues-deployment-on-hanselminutes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=continues-deployment-on-hanselminutes</link>
		<comments>http://blog.torresdal.net/2010/09/03/continues-deployment-on-hanselminutes/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 08:28:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WebDeploy]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/2010/09/03/ContinuesDeploymentOnHanselminutes.aspx</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/asp-net/" title="ASP.NET">ASP.NET</a><a href="http://blog.torresdal.net/category/deployment/" title="Deployment">Deployment</a><a href="http://blog.torresdal.net/category/web/" title="Web">Web</a><a href="http://blog.torresdal.net/category/webdeploy/" title="WebDeploy">WebDeploy</a></p>I was recently interviewed by Scott Hanselman on Hanselminutes about Continuous Deployment (or No-Click Deployment as I called it). The interview is now available online: http://hanselminutes.com/default.aspx?showID=248 I know I have two parts left in my No-Click Deployment series, covering the Load Balancer and TFS build integration, so hopefully I’ll manage to get those out shortly.]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/asp-net/" title="ASP.NET">ASP.NET</a><a href="http://blog.torresdal.net/category/deployment/" title="Deployment">Deployment</a><a href="http://blog.torresdal.net/category/web/" title="Web">Web</a><a href="http://blog.torresdal.net/category/webdeploy/" title="WebDeploy">WebDeploy</a></p><p>I was recently interviewed by Scott Hanselman on Hanselminutes about Continuous Deployment (or No-Click Deployment as I called it). The interview is now available online: <a href="http://hanselminutes.com/default.aspx?showID=248">http://hanselminutes.com/default.aspx?showID=248</a></p>
<p>I know I have two parts left in my No-Click Deployment series, covering the Load Balancer and TFS build integration, so hopefully I’ll manage to get those out shortly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2010/09/03/continues-deployment-on-hanselminutes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>No-Click Web Deployment – Part 2 – Web Deploy (a.k.a. msdeploy)</title>
		<link>http://blog.torresdal.net/2010/08/16/no-click-web-deployment-part-2-web-deploy-a-k-a-msdeploy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=no-click-web-deployment-part-2-web-deploy-a-k-a-msdeploy</link>
		<comments>http://blog.torresdal.net/2010/08/16/no-click-web-deployment-part-2-web-deploy-a-k-a-msdeploy/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 05:21:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[WebDeploy]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/2010/08/16/NoClickWebDeploymentPart2WebDeployAkaMsdeploy.aspx</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/net/" title=".Net">.Net</a><a href="http://blog.torresdal.net/category/asp-net/" title="ASP.NET">ASP.NET</a><a href="http://blog.torresdal.net/category/deployment/" title="Deployment">Deployment</a><a href="http://blog.torresdal.net/category/iis/" title="IIS">IIS</a><a href="http://blog.torresdal.net/category/tools/" title="Tools">Tools</a><a href="http://blog.torresdal.net/category/webdeploy/" title="WebDeploy">WebDeploy</a></p>In Part 1 I hadn’t decided if I was going to use Web Deploy as the base of this blog series or the PowerShell scripts I already had in production. I decided to give Web Deploy a chance. In the end I didn’t regret it, but I must admit it was not straight forward. Hopefully [...]]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/net/" title=".Net">.Net</a><a href="http://blog.torresdal.net/category/asp-net/" title="ASP.NET">ASP.NET</a><a href="http://blog.torresdal.net/category/deployment/" title="Deployment">Deployment</a><a href="http://blog.torresdal.net/category/iis/" title="IIS">IIS</a><a href="http://blog.torresdal.net/category/tools/" title="Tools">Tools</a><a href="http://blog.torresdal.net/category/webdeploy/" title="WebDeploy">WebDeploy</a></p><p>In <a href="http://blog.torresdal.net/2010/08/05/NoClickWebDeploymentPart1.aspx">Part 1</a> I hadn’t decided if I was going to use Web Deploy as the base of this blog series or the PowerShell scripts I already had in production. I decided to give Web Deploy a chance. In the end I didn’t regret it, but I must admit it was not straight forward. Hopefully this post will make it a breeze for you :-)</p>
<div style="padding-bottom: 7px; background-color: #efefef; padding-left: 7px; width: 500px; padding-right: 7px; margin-left: 10px; margin-right: 10px; padding-top: 7px">
<h4>Web Deploy With VS 2010 and TFS 2010</h4>
<p>VS 2010 and TFS 2010 now comes with Web Deploy integration and works great for low to medium complex web apps. When I tried it out with my requirements I did not manage to get my solution to work so I reverted back to the command line version. </p>
<p>The documentation for this topic is also sparse, and it looks/feels unfinished. Here’s some resources if you’re going down that road:</p>
<p>The Web Deploy MSBuild schema: <font face="Courier New">C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web</font></p>
<p>The official doc: <a href="http://msdn.microsoft.com/en-us/library/dd394698.aspx">http://msdn.microsoft.com/en-us/library/dd394698.aspx</a></p>
<p>Web Deploy @PDC: <a href="http://www.microsoftpdc.com/2009/FT56">http://www.microsoftpdc.com/2009/FT56</a></p>
<p>FAQ: <a href="http://blogs.msdn.com/b/aspnetue/archive/2010/03/05/automated-deployment-in-asp-net-4-frequently-asked-questions.aspx">http://blogs.msdn.com/b/aspnetue/archive/2010/03/05/automated-deployment-in-asp-net-4-frequently-asked-questions.aspx</a></p>
<p>MSBuild Web Deploy arguments + more resources: <a href="http://weblogs.asp.net/jdanforth/archive/2010/04/24/package-and-publish-web-sites-with-tfs-2010-build-server.aspx">http://weblogs.asp.net/jdanforth/archive/2010/04/24/package-and-publish-web-sites-with-tfs-2010-build-server.aspx</a></p>
</p></div>
<h3>THE commands</h3>
<p>The two commands below solves all the requirements I listed in my previous post. I spent a great deal of time learning and studying Web Deploy in order to come up with this, so I hope you find it useful. It might not look too hard now, but nothing is when you have the solution in front of you :-) I’m always open for better ways if you find one though. <strong>If I could ask the Web Deploy team for a new feature, it would be to make the two commands below really simple.</strong></p>
<p>The rest of this post will discuss these commands in detail. Text in blue can be replaced with your own values.</p>
<p><strong>Create package:</strong></p>
<pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 250px; padding-left: 5px; width: 530px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px">msdeploy.exe
	-verb:sync
	-source:manifest=<font style="color: blue">PackageManifest.xml</font>
	-dest:package=<font style="color: blue">Package.zip</font>,encryptPassword=&quot;<font style="color: blue">certificatePassword</font>&quot;
	-enableLink:AppPoolExtension
	-disableLink:CertificateExtension
	-disableLink:ContentExtension
	-replace:objectName=httpCert,targetAttributeName=hash,replace=<font style="color: blue">08bf3e051bd10cd8d89ac1a3ac431887886ed343</font>
	-replace:objectName=logFile,targetAttributeName=directory,replace=<font style="color: blue">C:\Web\Logs</font>
	-replace:objectName=virtualDirectory,targetAttributeName=physicalPath,match=&quot;<font style="color: blue">C:\\WebDeployTemplateWebSites</font>&quot;,replace=&quot;<font style="color: blue">C:\Web</font>&quot;
	-declareParam:name=HttpsBinding,kind=DestinationBinding,scope=<font style="color: blue">webSiteName</font>,match=.*:<font style="color: blue">443</font>:
	-declareParam:name=HttpBinding,kind=DestinationBinding,scope=<font style="color: blue">webSiteName</font>,match=.*:<font style="color: blue">80</font>:
	-declareParam:name=AppPoolUsername,kind=DeploymentObjectAttribute,scope=processModel,match=processModel/@userName
	-declareParam:name=AppPoolPassword,kind=DeploymentObjectAttribute,scope=processModel,match=processModel/@password</pre>
<p><strong>Install package:</strong> </p>
<p></p>
<pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 150px; padding-left: 5px; width: 530px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px">msdeploy.exe
	-verb:sync
	-source:package=<font style="color: blue">Package.zip</font>,encryptPassword=&quot;<font style="color: blue">certificatePassword</font>&quot;
	-dest:manifest=<font style="color: blue">InstallManifest.xml</font>,computerName=<font style="color: blue">FQDN</font>,username=&quot;<font style="color: blue">domain\user</font>&quot;,password=&quot;<font style="color: blue">domainUserPassword</font>&quot;
	-setParam:name=HttpsBinding,value=<font style="color: blue">10.0.0.21:443:</font>
	-setParam:name=HttpBinding,value=<font style="color: blue">10.0.0.21:80:</font>
	-setParam:name=AppPoolUsername,value=MyDomain\AppPoolServiceAccount
	-setParam:name=AppPoolPassword,value=MySecureAppPoolPassword</pre>
<p>Note that the above commands are one-liners. I only structured them the way I did to make them readable.</p>
<div style="padding-bottom: 7px; background-color: #efefef; padding-left: 7px; width: 500px; padding-right: 7px; margin-left: 10px; margin-right: 10px; padding-top: 7px">
<h4>Complex</h4>
<p>Web Deploy was built for the purpose of deploying web applications, so at first it looked like the perfect solution. However, I soon realized I had to study it in great detail to make it do what I wanted. I’m talking days not hours. Time I was not eager to spend to replace something already working or just for the sake of this blog post (sorry guys :-)). The reason for not giving up on it entirely was because Web Deploy had the potential to simplify/replace my scripts, have fewer moving parts, and make the total solution easier to maintain.</p>
<p>Around the same time as I published Part 1 I <a href="http://twitter.com/torresdal/status/20171596439">tweeted</a> my concern about Web Deploy’s complexity and the <a href="http://twitter.com/wdeploy/">@wdeploy</a> team contacted me. I sent them a long email describing my concerns and they promised to do “<em>creative things in the future”</em> to make it less complex. I’ve been in contact several times after that and they are very responsive and eager to get feedback on the product. I’m personally looking forward to see (and maybe help influence) how this product will evolve.</p>
</div>
<h3>Web Deploy Command Options </h3>
<p><strong></strong>Before diving into the inner workings of these commands, we need to know a bit more about the tool. Web Deploy have a lot of functionality and is extremely powerful. Here’s the command line syntax:</p>
<blockquote>
<pre style="width: 450px;">	msdeploy.exe -verb:&lt;verbName&gt;
	-source:&lt;provider&gt;[=&lt;pathToProviderObject&gt;
		[,&lt;providerSetting&gt;=&lt;providerSettingValue&gt;]]
	[-dest:&lt;provider&gt;[=&lt;pathToProviderObject&gt;
        	         [,&lt;providerSetting&gt;=&lt;providerSettingValue&gt;]]
	]
	[-&lt;MSDeployOperationSetting&gt; ...]</pre>
</blockquote>
<p>Doesn’t look too scary right? There is more to it though… </p>
<p><strong>Verbs<br />
    <br /></strong>The following verbs exist:</p>
<ul>
<li>delete </li>
<li>dump </li>
<li>getDependencies </li>
<li>getParameters </li>
<li>getSystemInfo </li>
<li>sync </li>
</ul>
<p><strong>Providers<br />
    <br /></strong>Let’s look at which providers it has:</p>
<ul>
<li><a href="http://technet.microsoft.com/en-us/library/dd569080(WS.10).aspx">Web Deploy appHostConfig Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569055(WS.10).aspx">Web Deploy appHostSchema Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569070(WS.10).aspx">Web Deploy appPoolConfig Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569042(WS.10).aspx">Web Deploy archiveDir Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569016(WS.10).aspx">Web Deploy auto Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd568971(WS.10).aspx">Web Deploy cert Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569107(WS.10).aspx">Web Deploy comObject32 Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569022(WS.10).aspx">Web Deploy comObject64 Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569034(WS.10).aspx">Web Deploy contentPath Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/ee522996(WS.10).aspx">Web Deploy createApp Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569036(WS.10).aspx">Web Deploy dbFullSql Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569017(WS.10).aspx">Web Deploy dbMySql Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/ff512642(WS.10).aspx">Web Deploy dbSqlite Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/ee207412(WS.10).aspx">Web Deploy dirPath Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/ee619746(WS.10).aspx">Web Deploy fcgiExtConfig Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/ee207414(WS.10).aspx">Web Deploy filePath Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569056(WS.10).aspx">Web Deploy gacAssembly Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569054(WS.10).aspx">Web Deploy iisApp Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd568982(WS.10).aspx">Web Deploy machineConfig32 Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569082(WS.10).aspx">Web Deploy machineConfig64 Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569104(WS.10).aspx">Web Deploy manifest Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569088(WS.10).aspx">Web Deploy metaKey Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569019(WS.10).aspx">Web Deploy package Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/ee522997(WS.10).aspx">Web Deploy recycleApp Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569085(WS.10).aspx">Web Deploy regKey Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569079(WS.10).aspx">Web Deploy regValue Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569009(WS.10).aspx">Web Deploy rootWebConfig32 Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd568994(WS.10).aspx">Web Deploy rootWebConfig64 Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/ee619740(WS.10).aspx">Web Deploy runCommand Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569047(WS.10).aspx">Web Deploy setAcl Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/ee619714(WS.10).aspx">Web Deploy urlScanConfig Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569021(WS.10).aspx">Web Deploy webServer Provider</a> </li>
<li><a href="http://technet.microsoft.com/en-us/library/dd569007(WS.10).aspx">Web Deploy webServer60 Provider</a> </li>
</ul>
<p>These are of course only the built-in providers, then you can create your own or use 3rd party ones if you like. A quick scan through this list shows that it does a lot more that just web stuff, like COM objects, registry settings, certificates, gac, databases.. the lot. </p>
<p><strong>Provider Settings</strong> </p>
<p>The providers again have a set of common provider settings:</p>
<ul>
<li>authType </li>
<li>computerName </li>
<li>encryptPassword </li>
<li>getCredentials </li>
<li>ignoreErrors </li>
<li>includeAcls </li>
<li>password </li>
<li>storeCredentials </li>
<li>tempAgent </li>
<li>userName </li>
<li>wmsvc </li>
</ul>
<p><strong>MSDeployOperationSetting<br />
    <br /></strong>From the <a href="http://technet.microsoft.com/en-us/library/dd569089(WS.10).aspx">documentation</a>:</p>
<blockquote>
<p><em>Web Deploy operation settings are non-provider specific command-line flags. They modify all of a Web Deploy operation.</em></p>
</blockquote>
<ul>
<li>allowUntrusted </li>
<li>declareParam </li>
<li>declareParamFile </li>
<li>dest </li>
<li>disableLink </li>
<li>disableRule </li>
<li>disableSkipDirective </li>
<li>enableLink </li>
<li>enableRule </li>
<li>enableSkipDirective </li>
<li>postSync </li>
<li>preSync </li>
<li>removeParam </li>
<li>replace </li>
<li>retryAttempts </li>
<li>retryInterval </li>
<li>setParam </li>
<li>setParamFile </li>
<li>showSecure </li>
<li>skip </li>
<li>source </li>
<li>useCheckSum </li>
<li>verb </li>
<li>verbose </li>
<li>whatif </li>
<li>xml </li>
<li>xpath </li>
</ul>
<p><strong>Manifest Provider</strong> </p>
<p>We now have an overview of the command line syntax of the tool, but there are a few other important aspects. The first one being the <a href="http://technet.microsoft.com/en-us/library/dd569104(WS.10).aspx">manifest provider</a>. Most likely you want to use more than one provider in your command, and that’s exactly what this provider does. Here’s an example from the documentation:</p>
<pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 130px; padding-left: 5px; width: 530px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px">
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"><span style="color: #0000ff">&lt;</span><span style="color: #800000">sitemanifest</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">appHostConfig</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;mySite&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">gacAssembly</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">comObject</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;Microsoft.ApplicationHost.AdminManager&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">contentPath</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;c:\source&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">regKey</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;HKLM\Software\ODBC&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">sitemanifest</span><span style="color: #0000ff">&gt;</span></pre>
</pre>
<p>I would actually preferred having these on the command line instead. When I trigger my commands from a build, I’m inserting variables into the command anyways and I would be better of with the ONE command and not have to maintain the xml files as well. Actually I would like to have both options. In the command I would suggest something like this (which would adhere to the existing conventions):</p>
<blockquote>
<p><font face="Courier New">-source:appHostConfig=mySite,gacAssembly=System.Web…,[…]=[…]</font></p>
</blockquote>
<p><strong>Link Extensions</strong> </p>
<p>Another one is the concept of <a href="http://technet.microsoft.com/en-us/library/dd569028(WS.10).aspx">link extensions</a>, which can be enabled/disabled by using the enableLink and disableLink operations. One example drawn from the documentation is:</p>
<blockquote>
<p><em>…if you specify <strong>-disableLink:ContentExtension</strong> on the command line, you can prevent content from being included in a <strong>sync</strong> operation. This enables you to synchronize two Web servers without moving any content.</em></p>
</blockquote>
<p><strong>Web Deploy Rules<br />
    <br /></strong>Web Deploy rules exists to disable or enable built-in or custom rules (using e.g. the enableRule and disableRule operations) for the <strong>sync</strong> verb. This is however (naturally) only true if the isDefault attribute is set to true in the rule definitions. See <a href="http://technet.microsoft.com/en-us/library/dd568992(WS.10).aspx">here</a> to find the built-in rules. By creating the file <font face="Courier New">Msdeploy.exe.configsettings</font> in <font face="Courier New">%program files%\IIS\Microsoft Web Deploy</font> folder, you can add custom rules.</p>
<p><strong>Packages and Archives<br />
    <br /></strong>From the docs:</p>
<blockquote>
<p><em>The Web Deploy <strong>package</strong> and <strong>archiveDir</strong> features let you create a snapshot backup of your Web site or Web server into a .zip file or archive directory. In addition, the parameterization and <strong>manifest</strong> features let you customize the archive or package that you create. You can then use your package files to deploy Web sites and Web servers to other computers or computer locations.</em></p>
</blockquote>
<div style="padding-bottom: 7px; background-color: #efefef; padding-left: 7px; width: 500px; padding-right: 7px; margin-left: 10px; margin-right: 10px; padding-top: 7px">
<h4>What’s wrong?</h4>
<p>That’s a lot of stuff to consume! In order to effectively use this tool for deployment, you have to learn most of these verbs, providers and operations, figure out how they work and how you can take advantage of them.</p>
<p>This is (in my opinion) what Greg Young have been talking about and expressed in the NDC Magazine article </strong><a href="http://www.ndc2010.no/index.aspx?id=268781">Failure</a> (well worth the read), where the intent is lost in the system and the user is forced to “reverse engineer” it to make sense of it all. </p>
<p>I’m fully aware of the endless amount of user scenarios that exists, and I don’t expect the Web Deploy team to cover them all, but the most common ones would be nice. Like the one I’m showing in this post I would think would be quite common for auto deployment scenarios. The advanced configuration could still be available for the not-so-common scenarios. Instead I’m “forced” to spend a lot of time learning the inner workings of a complicated tool, which in the end create a lot of value. <strong>How valuable wouldn’t it be if I didn’t have to invest so much time in learning the tool?</strong></p>
<p>I’m also aware of the new TFS 2010 integration that exists, which simplifies many of these tasks, but that solution lacks documentation and the advanced options are hard to get at.</p>
</div>
<h3>Setting up Web Deploy for remote access </h3>
<p>To be able to access a server remotely, Web Deploy must be given access to the server. Several <a href="http://technet.microsoft.com/en-us/library/ee461175(WS.10).aspx">options are available</a>, but I’ll focus on the <a href="http://technet.microsoft.com/en-us/library/dd569087(WS.10).aspx">Web Deployment Agent Service</a>, which requires administrator privileges to use.</p>
<p>The Agent Service requires Web Deploy to be installed on the target server. You can find the detailed installation instructions here: <a href="http://technet.microsoft.com/en-us/library/dd569030(WS.10).aspx">http://technet.microsoft.com/en-us/library/dd569030(WS.10).aspx</a></p>
<h3>Basic Usage </h3>
<p>Let’s look at some vanilla examples for deploying web stuff remotely:</p>
<p><font face="Courier New">msdeploy<br />
    <br />&#160; -verb:sync </p>
<p>&#160; -source:contentpath=c:\data, </p>
<p>&#160; -dest:contentpath=c:\data, </p>
<p>&#160;&#160;&#160;&#160;&#160; computerName=Server2, </p>
<p>&#160;&#160;&#160;&#160;&#160; username=admin, </p>
<p>&#160;&#160;&#160;&#160;&#160; password=pass</font></p>
<p>This copies your local <font face="Courier New">C:\data</font> directory to the server Server2, and provide a username and password to get access to the remote server. This is done by using the <strong>sync</strong> verb and the <strong>contentpath</strong> provider. So we can push files, which is nice cause we don’t have to use FTP, BITS or similar. </p>
<h3><strong>Deployment Requirements</strong>&#160;</h3>
<p>We want to do a lot more than just copy files. Here’s a list extracted from my previous post of what I want to deploy to remote servers:</p>
<ul>
<li>File content </li>
<li>Virtual Directories and Applications settings </li>
<li>AppPools settings </li>
<li>Certificates </li>
<li>Bindings </li>
<li>Log location settings </li>
<li>Virtual Directory file location settings </li>
</ul>
<h3>Packaging structure</h3>
<p>My commands can be used to produce one package per web site multiplied by the number of environments you have (e.g. Dev, Test and Prod). So if you have 4 web sites and 3 environments, you create 12 packages.</p>
<p>To better understand why this is, here’s a list of the settings that are specific for each environment and common across all servers in one specific environment:</p>
<ul>
<li>File content </li>
<li>SSL Certificate password </li>
<li>Certificate hash/thumbprint </li>
<li>Web site log directory location </li>
<li>Virtual directory root locations </li>
</ul>
<p>For server specific differences we create the package so that it accepts parameters for:</p>
<ul>
<li>User and password for the service account under which the worker process of the Application Pools runs </li>
<li>The https binding (if used) </li>
<li>The http binding (if used) </li>
</ul>
<p>If we did not define the last three parameters, we would have to multiply the packages with the amount of servers in the different environments as well. 4 web sites, 3 environments and 2 servers in each environment = 24 packages. You don’t want to go there…</p>
<p>Another option would be to define all possible changes as parameters, leaving you with only one package. I tried that. I could not figure out how to accomplish all of these using params, so I analyzed what I needed and used a little of both. It works, but could be better.</p>
<p>As an example of the above, a package for the web site blog.torresdal.net could be created for e.g. Dev with these settings:</p>
<ul>
<li>File content = E:\MyBuildOutput\blog.torresdal.net </li>
<li>Certificate password = MySecureSSLPassword </li>
<li>Certificate hash=08bf3e051bd10cd8d89ac1a3ac431887886ed343 </li>
<li>Web site log dir = E:\Logs\blog.torresdal.net </li>
<li>Virtual Directory locations = E:\Web </li>
</ul>
<p>…and used these parameters when deploying:</p>
<ul>
<li>Username for AppPool = MyDomain\AppPoolServiceAccount </li>
<li>Password for AppPool = MySecureAppPoolPassword </li>
<li>Https binding = 10.0.0.21:443: </li>
<li>Http binding = 10.0.0.21:80: </li>
</ul>
<div style="padding-bottom: 7px; background-color: #efefef; padding-left: 7px; width: 500px; padding-right: 7px; margin-left: 10px; margin-right: 10px; padding-top: 7px">
<h4>Notes on Application Pool</h4>
<p>  <strong></strong></p>
<p><strong>Note on bindings:</strong> You have to use either http or https or both. If you want to use hostname you could do: *:80:blog.torresdal.net </p>
<p>Note that host names are not supported on SSL in IIS 7, even though it’s technically possible to do.</p>
<p><strong>Note on the service account for the application pool:</strong> On Windows Server 2008, IIS support <a href="http://learn.iis.net/page.aspx/624/application-pool-identities/">Application Pool Identities</a>. These are Windows virtual accounts that are assigned to the application pool effectively isolating it from other services. If you want to use these, then you don’t have to declare the parameters for the app pool identities as long as your source is using App Pool Id’s.</p>
</div>
<h3>Dissecting The Create Package Command</h3>
<p><strong></strong>I believe you now have an idea of what the commands above do, but lets pull it apart and describe each piece by itself. </p>
<p><strong>The package manifest file<br />
    <br /></strong>First we’re going to look at the manifest file which contains all source providers used to create the package:</p>
<pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 530px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px">
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"><span style="color: #0000ff">&lt;</span><span style="color: #800000">sitemanifest</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">appHostConfig</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;blog.torresdal.net&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">cert</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;my\08bf3e051bd10cd8d89ac1a3ac431887886ed343 &quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">dirPath</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;E:\MyBuildDrop\LatestVersion\Dev\blog.torresdal.net&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">sitemanifest</span><span style="color: #0000ff">&gt;</span></pre>
</pre>
<p>This is the way that Web Deploy allows you to use more than one provider. Here’s a short description of each provider and what it does:</p>
<table style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-top: #ccc 1px solid; border-right: #ccc 1px solid" border="0" cellspacing="0" cellpadding="5" width="540">
<tbody>
<tr>
<td valign="top" width="260">appHostConfig</td>
<td valign="top" width="260">Gets all IIS specific settings from a web site.</td>
</tr>
<tr>
<td valign="top" width="260">cert</td>
<td valign="top" width="260">Gets the certificate with the given thumbprint/hash.</td>
</tr>
<tr>
<td valign="top" width="260">dirPath</td>
<td valign="top" width="260">Gets the content from the given path.</td>
</tr>
</tbody>
</table>
<p><strong>The create Package command<br />
    <br /></strong>Now lets look at each section of the command:</p>
<table style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-top: #ccc 1px solid; border-right: #ccc 1px solid" border="0" cellspacing="0" cellpadding="5" width="540">
<tbody>
<tr>
<td valign="top" width="260">-verb:sync</td>
<td valign="top" width="260">Tells Web Deploy to do a sync</td>
</tr>
<tr>
<td valign="top" width="260">-source:manifest=PackageManifest.xml</td>
<td valign="top" width="260">Points to the manifest file showed above containing all providers to use as source. </td>
</tr>
<tr>
<td valign="top" width="260">-dest:package=Package.zip,<br />
        <br />encryptPassword=&quot;certificatePassword&quot;</td>
<td valign="top" width="260">Use the <strong>package</strong> provider as destination for creating a package (zip) containing all content and information needed to deploy a package to a server. Since we’re using the <strong>cert</strong> provider (in the manifest) we need to provide the password to get access to the certificate.</td>
</tr>
<tr>
<td valign="top" width="260">-enableLink:AppPoolExtension</td>
<td valign="top" width="260">I want the application pool to be synced as well.</td>
</tr>
<tr>
<td valign="top" width="260">-disableLink:CertificateExtension</td>
<td valign="top" width="260">The <strong>appHostConfig</strong> provider include certificate and content by default. I want to control which certificate and what content to include, so I use –disableLink to disable these extensions. That is why I’ve added the <strong>cert</strong> and <strong>dirPath</strong> providers in the manifest so that I can be explicit about these.</td>
</tr>
<tr>
<td valign="top" width="260">-disableLink:ContentExtension</td>
<td valign="top" width="260">See previous…</td>
</tr>
<tr>
<td valign="top" width="260">-replace:objectName=httpCert,<br />
        <br />targetAttributeName=hash, </p>
<p>replace=08bf3e051bd10cd…</td>
<td valign="top" width="260">The <strong>appHostProvider</strong> and the <strong>cert</strong> provider are unaware of each others actions, so the appHostProvider outputs the thumbprint from the certificate found in IIS. I need to replace the httpCert hash property with the same hash used in the manifest file or else the web site would be bounded to the wrong certificate.</td>
</tr>
<tr>
<td valign="top" width="260">-replace:objectName=logFile,<br />
        <br />targetAttributeName=directory, </p>
<p>replace=C:\Web\Logs </td>
<td valign="top" width="260">I want to replace the IIS log directory to a different path than the IIS I’m exporting from.</td>
</tr>
<tr>
<td valign="top" width="260">-replace:objectName=virtualDirectory,<br />
        <br />targetAttributeName=physicalPath, </p>
<p>match=&quot;C:\\WebDeployMasterWebSites&quot;, </p>
<p>replace=&quot;C:\Web&quot; </td>
<td valign="top" width="260">The web site I’m exporting from reside in C:\WebDeployMasterWebSites\{webSiteName}, and all Virtual Directories are located below this path. I want to control the root path, so I replace it. </p>
<p>Note: This would be a natural candidate for a parameter, but with params you can only replace the complete value, not just part of it.</td>
</tr>
</tbody>
</table>
<p>Here’s a description of the parameter declarations allowing us to pass in params when deployment the package (these are also part of the same command):</p>
<table style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-top: #ccc 1px solid; border-right: #ccc 1px solid" border="0" cellspacing="0" cellpadding="5" width="540">
<tbody>
<tr>
<td valign="top" width="260">-declareParam:name=HttpsBinding,<br />
        <br />kind=DestinationBinding, </p>
<p>scope=webSiteName, </p>
<p>match=.*:443: </td>
<td valign="top" width="260">I want to control the SSL binding for the web site.</td>
</tr>
<tr>
<td valign="top" width="260">-declareParam:name=HttpBinding,<br />
        <br />kind=DestinationBinding, </p>
<p>scope=webSiteName, </p>
<p>match=.*:80:</td>
<td valign="top" width="260">Same as above only for HTTP.</td>
</tr>
<tr>
<td valign="top" width="260">-declareParam:name=AppPoolUsername,<br />
        <br />kind=DeploymentObjectAttribute, </p>
<p>scope=processModel, </p>
<p>match=processModel/@userName</td>
<td valign="top" width="260">I want to set the user name of the account under which the worker process of the Application Pools runs</td>
</tr>
<tr>
<td valign="top" width="260">-declareParam:name=AppPoolPassword,<br />
        <br />kind=DeploymentObjectAttribute, </p>
<p>scope=processModel, </p>
<p>match=processModel/@password</td>
<td valign="top" width="260">Same as above only for the password.</td>
</tr>
</tbody>
</table>
<p>To shorten the above command a tiny bit you can define the parameters in an xml file instead, like this:</p>
<pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 530px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px">
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameters</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;HttpsBinding&quot;</span> <span style="color: #ff0000">description</span>=<span style="color: #0000ff">&quot;Web Site Binding for SSL&quot;</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">      <span style="color: #0000ff">&lt;</span><span style="color: #800000">parameterEntry</span> <span style="color: #ff0000">kind</span>=<span style="color: #0000ff">&quot;DestinationBinding&quot;</span> <span style="color: #ff0000">scope</span>=<span style="color: #0000ff">&quot;sikker.frende.no&quot;</span> <span style="color: #ff0000">match</span>=<span style="color: #0000ff">&quot;.*:443:&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"></pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;HttpBinding&quot;</span> <span style="color: #ff0000">description</span>=<span style="color: #0000ff">&quot;Web Site Binding for http&quot;</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">      <span style="color: #0000ff">&lt;</span><span style="color: #800000">parameterEntry</span> <span style="color: #ff0000">kind</span>=<span style="color: #0000ff">&quot;DestinationBinding&quot;</span> <span style="color: #ff0000">scope</span>=<span style="color: #0000ff">&quot;sikker.frende.no&quot;</span> <span style="color: #ff0000">match</span>=<span style="color: #0000ff">&quot;.*:443:&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"></pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;AppPoolUsername&quot;</span> <span style="color: #ff0000">description</span>=<span style="color: #0000ff">&quot;Account username for this application pool&quot;</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">      <span style="color: #0000ff">&lt;</span><span style="color: #800000">parameterEntry</span> <span style="color: #ff0000">kind</span>=<span style="color: #0000ff">&quot;DeploymentObjectAttribute&quot;</span> <span style="color: #ff0000">scope</span>=<span style="color: #0000ff">&quot;processModel&quot;</span> <span style="color: #ff0000">match</span>=<span style="color: #0000ff">&quot;processModel/@userName&quot;</span><span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"></pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;AppPoolPassword&quot;</span> <span style="color: #ff0000">description</span>=<span style="color: #0000ff">&quot;Account password for this application pool&quot;</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">      <span style="color: #0000ff">&lt;</span><span style="color: #800000">parameterEntry</span> <span style="color: #ff0000">kind</span>=<span style="color: #0000ff">&quot;DeploymentObjectAttribute&quot;</span> <span style="color: #ff0000">scope</span>=<span style="color: #0000ff">&quot;processModel&quot;</span> <span style="color: #ff0000">match</span>=<span style="color: #0000ff">&quot;processModel/@password&quot;</span><span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameters</span><span style="color: #0000ff">&gt;</span></pre>
</pre>
<p>You will then replace the –declareParam operation settings above with this:</p>
<blockquote>
<p><font face="Courier New">-declareParamFile:MyParamFile.xml</font></p>
</blockquote>
<p>However, if you’re going to execute this command from TFS or some other build tool, you’re better off leaving them inside the command. Less moving parts.</p>
<h3>Dissecting The Deploy Package Command</h3>
<p>We also need a manifest file when installing the package. This is ALMOST identical to the manifest we used when creating the package:</p>
<pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 530px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px">
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"><span style="color: #0000ff">&lt;</span><span style="color: #800000">sitemanifest</span><span style="color: #0000ff">&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">appHostConfig</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;blog.torresdal.net&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">cert</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;my\08bf3e051bd10cd8d89ac1a3ac431887886ed343 &quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: yellow; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">dirPath</span> <span style="color: #ff0000">path</span>=<span style="color: #0000ff">&quot;E:\Web&quot;</span> <span style="color: #0000ff">/&gt;</span>
</pre>
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">sitemanifest</span><span style="color: #0000ff">&gt;</span></pre>
</pre>
<p>The only difference between the two is in the dirPath provider. For the package we used files from <font face="Courier New">E:\MyBuildDrop\LatestVersion\Dev\blog.torresdal.net</font>, but when deploying we PUT files to <font face="Courier New">E:\Web</font>. </p>
<p><strong>The deployment package command</strong> </p>
<p>Each section in detail:</p>
<table style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-top: #ccc 1px solid; border-right: #ccc 1px solid" border="0" cellspacing="0" cellpadding="5" width="540">
<tbody>
<tr>
<td valign="top" width="260">-verb:sync </td>
<td valign="top" width="260">Tells Web Deploy to do a sync</td>
</tr>
<tr>
<td valign="top" width="260">-source:package=Package.zip,<br />
        <br />encryptPassword=&quot;certificatePassword&quot; </td>
<td valign="top" width="260">Uses the earlier created package as source. Since this package contains a certificate, you need to provide the certificate password in order to get access to it.</td>
</tr>
<tr>
<td valign="top" width="260">-dest:manifest=InstallManifest.xml,<br />
        <br />computerName=FQCN, </p>
<p>username=&quot;domain\user&quot;, </p>
<p>password=&quot;domainUserPassword&quot;</td>
<td valign="top" width="260">Points to the manifest file to use for deployment, and to which server we are deploying to with the username/password.</td>
</tr>
<tr>
<td valign="top" width="260">-setParam:name=HttpsBinding,<br />
        <br />value=10.0.0.21:443:</td>
<td valign="top" width="260">Set the SSL binding for the web site. Using IP 10.0.0.21 on port 443 (SSL).</td>
</tr>
<tr>
<td valign="top" width="260">-setParam:name=HttpBinding,<br />
        <br />value=10.0.0.21:80:</td>
<td valign="top" width="260">Same as above only for HTTP.</td>
</tr>
<tr>
<td valign="top" width="260">-setParam:name=AppPoolUsername,<br />
        <br />value=MyDomain\AppPoolServiceAccount</td>
<td valign="top" width="260">Set the user name for the account under which the worker process of the Application Pools runs</td>
</tr>
<tr>
<td valign="top" width="260">-setParam:name=AppPoolPassword,<br />
        <br />value=MySecureAppPoolPassword </td>
<td valign="top" width="260">Same as above, only for the password</td>
</tr>
</tbody>
</table>
<h3>The Build/Deploy Process Using Web Deploy</h3>
<p>Here’s the exact same deployment process overview as in my previous post, only now with Web Deploy. As a result the process got two steps shorter :-)</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.torresdal.net/content/binary/WindowsLiveWriter/NoClickWebDeploymentPart2WebDeployMSDepl_E1DA/image_4.png" width="540" height="1230" /> </p>
<h3>What’s Next?</h3>
<p>In my next post I’ll either show you how to control the load balancer during deployment or integration with TFS. Both will be covered in the end.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2010/08/16/no-click-web-deployment-part-2-web-deploy-a-k-a-msdeploy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>No-Click Web Deployment – Part 1</title>
		<link>http://blog.torresdal.net/2010/08/05/no-click-web-deployment-part-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=no-click-web-deployment-part-1</link>
		<comments>http://blog.torresdal.net/2010/08/05/no-click-web-deployment-part-1/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 06:30:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/2010/08/05/NoClickWebDeploymentPart1.aspx</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/agile/" title="Agile">Agile</a><a href="http://blog.torresdal.net/category/asp-net/" title="ASP.NET">ASP.NET</a><a href="http://blog.torresdal.net/category/deployment/" title="Deployment">Deployment</a><a href="http://blog.torresdal.net/category/iis/" title="IIS">IIS</a><a href="http://blog.torresdal.net/category/lean/" title="Lean">Lean</a><a href="http://blog.torresdal.net/category/tools/" title="Tools">Tools</a></p>Update: Part 2 is now available, covering Web Deploy (a.k.a. msdeploy) Getting code deployed should be as easy as open up a web site (only taking slightly longer :-)). Devs or IT people should not spend manual labor (with the possibility of mishaps) on getting files from one place to another, making changes to IIS [...]]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/agile/" title="Agile">Agile</a><a href="http://blog.torresdal.net/category/asp-net/" title="ASP.NET">ASP.NET</a><a href="http://blog.torresdal.net/category/deployment/" title="Deployment">Deployment</a><a href="http://blog.torresdal.net/category/iis/" title="IIS">IIS</a><a href="http://blog.torresdal.net/category/lean/" title="Lean">Lean</a><a href="http://blog.torresdal.net/category/tools/" title="Tools">Tools</a></p><p><strong>Update: Part 2 is now available, covering</strong><a href="http://blog.torresdal.net/2010/08/16/NoClickWebDeploymentPart2WebDeployAkaMsdeploy.aspx"><strong> Web Deploy (a.k.a. msdeploy)</strong></a></p>
<p>Getting code deployed should be as easy as open up a web site (only taking slightly longer :-)). Devs or IT people should not spend manual labor (with the possibility of mishaps) on getting files from one place to another, making changes to IIS (or whatever you’re using), restarting servers, copy/changing web.config files etc. That’s the job for scripts and automation tools. Not to mention the cost savings of not needing IT people to do deployment. I bet you there’s no one manual step in the process of deployment that cannot be automated. Saying that, you have to consider how many times you deploy per day/week/month or year before going for full automation. However, if you’re serious about being Agile/Lean, you can’t do without a auto deployment scheme.</p>
<p>In the coming blog posts I’ll walk you through the steps I went through to automate our deployment, and hopefully you’ll find it interesting and even suggest improvements.</p>
<p><strong>Overview      <br /></strong>Below is an overview of the environments we’re deploying to:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.torresdal.net/content/binary/WindowsLiveWriter/OneClickWebDeploymentUsingPowerShellRemo_1257B/image_28.png" width="535" height="235" /> </p>
<p>One Load Balancer (LB) in each environment, two web servers in Dev and Test, and 3 in Prod. The actual numbers might or might not be true ;-), but that doesn’t really matter. In addition there’s SQL Servers, but I will not cover that here. </p>
<p>Why have a LB in Dev? Reason number one is to catch any possible LB issues in Dev before going to Test and Prod, and have the exact same environment in Dev as in Prod. It’s also useful to try out new stuff, like having the LB do caching etc.</p>
<p><strong>Deployment Frequency      <br /></strong>For Dev we auto deploy every night (part of nightly build) and at will during day. For Test, 2-4 times per week and to Prod 1-2 times every 2nd week. That was yesterday! :-) Today we can do it when the sun comes out of the clouds (not often in Bergen), every time I refill my coffee cup or whenever we feel like. The point being: <strong>we are no longer constrained by how often we can deploy.</strong> </p>
<p><strong>Why All These Environments?      <br /></strong>You can read about that <a href="http://www.google.com/search?q=development+test+production+environments">here</a>, but for us:</p>
<ul>
<li>Dev is where we try out things without physically hurting users, but still being in a real server environment avoiding the “works on my machine” issue. </li>
<li>Test is as close to Prod as we can get (at external hosting provider, different network, firewalls etc) and where we make sure things run smoothly before going to Prod. </li>
<li>Prod is Prod </li>
</ul>
<p><strong>Tech Details      <br /></strong>Here’s the tech stuff we use which might be relevant:</p>
<ul>
<li>All servers are running Windows Server 2008 R2 </li>
<li>Web servers are running on IIS 7.5 (since we’re on R2) </li>
<li>Application Request Routing in IIS is used as Load Balancer and runs on 2008 R2 Server Core (if you like, check out <a href="http://blog.torresdal.net/2010/02/15/UsingIIS7AndApplicationRequestRoutingAsLoadBalancerPart2.aspx">my previous post</a> about setting up and configuring ARR) </li>
<li>TFS 2010 for builds </li>
<li>Team City for CI </li>
</ul>
<p>Also note that <strong>we</strong> <strong>have access to the actual subnet where Test and Prod lives. </strong>This does however not mean we have access to all servers and features in all environments, it just means we can be given access to certain things not recommended through external firewalls, like PowerShell Remoting. This is where your environments might be different from ours.</p>
<div style="padding-bottom: 7px; background-color: #efefef; padding-left: 7px; padding-right: 7px; margin-left: 10px; margin-right: 10px; padding-top: 7px">
<h4>Some General Advice</h4>
<p><strong>Consider Using a LB Even If You Don’t Need One For Performance Reasons        <br /></strong>Load Balancers are useful for other things than load balancing. The biggest benefit (except from its core task), is that you can do upgrades and maintenance on servers without taking the whole site offline, by always leaving at least one server online.</p>
<p>   <strong>Consider Turning Off IIS Recycling      <br /></strong>Do you know that IIS automatically recycle your applications every 1740 minute, effectively restarting them? Are your web sites free from memory leaks or do you want to know if you have memory leaks? Why not turn off recycling? This is too big of a topic to cover here, but go Google: IIS7 recycle.
<p><strong>Consider Using Windows Server 2008 R2 Server CORE&#160; <br /></strong>This should get you slightly better performance, but for me it’s more about scripting. Most of the things that needs to be done on server core, must be performed from command line, forcing you to create scripts.</p>
</p></div>
<p><strong>Why Is Deployment Difficult?      <br /></strong>First of all because every environment is different and there are no really good tools to automate the <strong>whole</strong> process. The challenge is to find the right tools to solve the problems your organization is facing, and have the tools work for you to get to the final goal. </p>
<p><strong>What’s The Challenges?      <br /></strong>For us it was about:</p>
<ol>
<li>How can we safely move files from a build server to Dev, Test and Prod? </li>
<li>How can we automate the process of taking a node out of an LB cluster? </li>
<li>How can we safely execute an upgrade on a server in Dev, Test or Prod and get feedback of progress, errors, and abort and roll back on failure? </li>
<li>How can we remotely make changes to IIS? </li>
<li>How can we avoid all manual tasks? (like adding a virtual directory in IIS or copy a web.config file) </li>
</ol>
<p><em>Safety</em> and <em>automation</em> is two keywords that sticks out. Where safe means no-one else than the intended persons or services should be able to perform the specified tasks. Automation meaning no manual operations should ever be needed in either Dev, Test or Prod except from IT maintenance like hardware upgrades, windows update etc.</p>
<p><strong>What tool options have we?</strong></p>
<blockquote><p><strong>Copy files:</strong></p>
<ul>
<li>Secure FTP in IIS 7 on a non public/available IP </li>
<li>or PowerShell with BITS </li>
<li>or <a href="http://www.iis.net/download/webdeploy">WebDeploy</a> </li>
</ul>
<p><strong>Taking LB nodes offline/online:</strong></p>
<ul>
<li>Use PowerShell Remoting to execute PowerShell scripts on ARR server </li>
<li>or the <a href="http://www.iis.net/download/webfarmframework">Web Farm Framework</a> </li>
</ul>
<p><strong>Safely execute an upgrade:</strong></p>
<ul>
<li>Use PowerShell Remoting to execute PowerShell scripts on web servers </li>
<li>or WebDeploy </li>
</ul>
<p><strong>Avoid manual tasks:</strong></p>
<ul>
<li>Script all tasks, so they can be repeated </li>
</ul>
</blockquote>
<p><strong>The Build/Deploy Process&#160;&#160;&#160;&#160;&#160; <br /><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.torresdal.net/content/binary/WindowsLiveWriter/OneClickWebDeploymentUsingPowerShellRemo_1257B/image_4.png" width="546" height="1228" />       <br /></strong></p>
<p><strong>What About MSI’s?      <br /></strong>If you read my blog you know I’ve done quite a bit of MS Installer stuff and WiX in particular. MSI’s are perfect for deploying to multiple places where you have no control. The drawback is that most developers don’t know how to customize MSI’s and often end up with a versioning problem and leaving lots of old stuff behind on the server after upgrades. If you have people skilled in Windows Installer, please feel free to use MSI, but I personally find XCopy to be very easy and is what I recommend if you’re not an ISV. With MSI’s you still have to install them remotely, which could be done with WMI or PowerShell.</p>
<p><strong>Notes on WebDeploy</strong>     <br />I’m currently looking at using Web Deploy to simplify/reduce the amount of scripts needed. WebDeploy would replace the FTP and deploy steps, but first impression is that it’s too generic, making it really hard to do simple things without spending quite a bit of time learning the tool, it’s underlying package schema and IIS schemas. Hopefully one day Web Deploy will be the only tool I’ll need to execute the whole deployment process.</p>
<p><strong>What’s Coming?</strong>     <br />In future blog posts I’ll walk you through step-by-step how to accomplish the above solution. While I’m writing this I’m not 100% sure if it will be a solution using PowerShell (which I have in production) or a slightly modified version using Web Deploy. It all depends on which one is easiest and which has the potential of being maintained by other people than me in the long run.</p>
<p>Hopefully this will give you the input you need to fully automate your deployment process as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2010/08/05/no-click-web-deployment-part-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Udi Dahan on NServiceBus Now Available for Download</title>
		<link>http://blog.torresdal.net/2010/06/15/udi-dahan-on-nservicebus-now-available-for-download/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=udi-dahan-on-nservicebus-now-available-for-download</link>
		<comments>http://blog.torresdal.net/2010/06/15/udi-dahan-on-nservicebus-now-available-for-download/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 21:07:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.torresdal.net/2010/06/15/UdiDahanOnNServiceBusNowAvailableForDownload.aspx</guid>
		<description><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/uncategorized/" title="Uncategorized">Uncategorized</a></p>Many have asked for a downloadable version of Udi’s presentation, so here it is :-) Udi Dahan on NServiceBus – Part 1.wmv (640&#215;480, BitRate=815, ~400MB) Udi Dahan on NServiceBus – Part 1.wmv (560&#215;416, BitRate=643, ~300MB) Udi Dahan on NServiceBus – Part 1.wmv (464&#215;352, BitRate=507, ~240MB) Udi Dahan on NServiceBus – Part 1.wmv (384&#215;288, BitRate=400, ~220MB) [...]]]></description>
			<content:encoded><![CDATA[<p>Posted in <a href="http://blog.torresdal.net/category/uncategorized/" title="Uncategorized">Uncategorized</a></p><p>Many have asked for a downloadable version of Udi’s presentation, so here it is :-)</p>
<ul>
<li>Udi Dahan on NServiceBus – Part 1.wmv (<a href="http://media.torresdal.net/Udi/Download/Udi_NServiceBus_Part1_815.zip">640&#215;480, BitRate=815, ~400MB</a>) </li>
<li>Udi Dahan on NServiceBus – Part 1.wmv (<a href="http://media.torresdal.net/Udi/Download/Udi_NServiceBus_Part1_643.zip">560&#215;416, BitRate=643, ~300MB</a>) </li>
<li>Udi Dahan on NServiceBus – Part 1.wmv (<a href="http://media.torresdal.net/Udi/Download/Udi_NServiceBus_Part1_507.zip">464&#215;352, BitRate=507, ~240MB</a>) </li>
<li>Udi Dahan on NServiceBus – Part 1.wmv (<a href="http://media.torresdal.net/Udi/Download/Udi_NServiceBus_Part1_400.zip">384&#215;288, BitRate=400, ~220MB</a>) </li>
</ul>
<ul>
<li>Udi Dahan on NServiceBus – Part 2.wmv (<a href="http://media.torresdal.net/Udi/Download/Udi_NServiceBus_Part2_727.zip">1024&#215;768, BitRate=727, ~240MB</a>) </li>
<li>Udi Dahan on NServiceBus – Part 2.wmv (<a href="http://media.torresdal.net/Udi/Download/Udi_NServiceBus_Part2_473.zip">768&#215;576, BitRate=473, ~175MB</a>) </li>
<li>Udi Dahan on NServiceBus – Part 2.wmv (<a href="http://media.torresdal.net/Udi/Download/Udi_NServiceBus_Part2_308.zip">560&#215;416, BitRate=308, ~150MB</a>) </li>
</ul>
<p>If you rather want to stream it you can still do that from here: <a title="http://blog.torresdal.net/2010/06/08/NNUGPresentationUdiDahanOnNServiceBus.aspx" href="http://blog.torresdal.net/2010/06/08/NNUGPresentationUdiDahanOnNServiceBus.aspx">http://blog.torresdal.net/2010/06/08/NNUGPresentationUdiDahanOnNServiceBus.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.torresdal.net/2010/06/15/udi-dahan-on-nservicebus-now-available-for-download/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
