<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2555990933155856800</id><updated>2011-11-27T18:37:12.782-05:00</updated><category term='Threading'/><category term='Redstone'/><category term='Visual Studio'/><category term='Continuous Integration'/><category term='VMWare'/><category term='Team Build'/><category term='XSL'/><category term='CruiseControl.NET Continuous Integration'/><category term='TFS'/><category term='intro'/><category term='Localization'/><category term='OSX'/><category term='C# VersionString'/><category term='API'/><category term='Best Practices'/><category term='MsTest'/><category term='C#'/><category term='CruiseControl.NET'/><category term='Lab Manager'/><category term='PowerShell'/><category term='welcome'/><category term='srcsrv'/><category term='Code Coverage'/><category term='Eggplant'/><category term='FTP PowerShell dmg StreamReader BinaryReader'/><category term='Mac'/><category term='Debugging'/><category term='Build Automation'/><category term='Mono'/><category term='Source Server'/><title type='text'>Don't Break The Build</title><subtitle type='html'>random musings on continuous integration</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-4969154808124511862</id><published>2011-11-08T12:30:00.000-05:00</published><updated>2011-11-08T12:30:00.732-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C# VersionString'/><title type='text'>Environment OSVersion.VersionString's Expected Values</title><content type='html'>Because I couldn't find a resource for these on the internet. Hopefully Someone will&amp;nbsp;find this useful.&lt;br /&gt;&lt;br /&gt;XP Sp2 - Microsoft Windows NT 5.1.2600.0 Service Pack 2&lt;br /&gt;XP Sp3 - Microsoft Windows NT 5.1.2600 Service Pack 3&lt;br /&gt;Vista - Microsoft Windows NT 6.0.6000.0&lt;br /&gt;Vista Sp1 - Microsoft Windows NT 6.0.6001 Service Pack 1&lt;br /&gt;Vista Sp2 - Microsoft Windows NT 6.0.6002 Service Pack 2&lt;br /&gt;7 - Microsoft Windows NT 6.1.7600.0&lt;br /&gt;7 Sp1 - Microsoft Windows NT 6.1.7601 Service Pack 1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-4969154808124511862?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/4969154808124511862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=4969154808124511862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/4969154808124511862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/4969154808124511862'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2011/11/environment-osversionversionstrings.html' title='Environment OSVersion.VersionString&apos;s Expected Values'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-2525677825719531912</id><published>2011-03-17T10:21:00.003-04:00</published><updated>2011-11-08T12:30:45.652-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Best Practices'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Best Practices</title><content type='html'>&lt;div class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;1.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;All of the below refer to any compiled piece that will end up on a customer’s computer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;2.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;They should come from a controlled build server&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;a.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Ensures a clean environment&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;b.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Ensures an agreed upon and documented set of 3&lt;sup&gt;&lt;span style="font-size: x-small;"&gt;rd&lt;/span&gt;&lt;/sup&gt; party SDKs and Libraries&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;c.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Build servers should be the only place where official signing files live&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;3.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;They should be under some form of Continuous Integration&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;a.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Team Build Options&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;i.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Gated&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ii.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Rolling&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;iii.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Continuous Integration&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;b.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Hudson Options&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;i.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Polling SCM (CI)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ii.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Timed for every specified period of time ( Minimum Frequency of hourly )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;c.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;CruiseControl.NET&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;i.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Interval Timer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;4.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;A Build Should happen in a pristine environment&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;a.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Every single build should have a clean workspace&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;i.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Deletes out the entire file system, to just build with clean or rebuild set is not good enough.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ii.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Server should only have a single version of any single SDK installed. We can make new servers. Multiple SDKs, of course, are expected.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;iii.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Make sure each build definition has its’ own top level unique folder&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 2in; mso-add-space: auto; mso-list: l0 level4 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;1.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Limits exposure to linking against wrong library due to an incorrect path&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 2in; mso-add-space: auto; mso-list: l0 level4 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;2.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Makes deleting file system easier&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 2in; mso-add-space: auto; mso-list: l0 level4 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;3.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;When top levels are named well it gives an easy view to all projects built on the server&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;5.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;A Build shouldn’t store any artifacts locally, and it should delete out its file system at the end&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;a.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Maximizes our ability to build many different definitions on a single server&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;b.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Allows for faster pulls times as the hard drive has more free space&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;6.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Should be as efficient as possible&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;a.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Only compile something once.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;b.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Post Build Steps should be a last resort. Use Output Directory value to determine where build artifacts end up.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;c.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Pulls down minimum amount of code from source control&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;d.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Builds should be broken up into the smallest of pieces that make sense&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;e.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Process should be controlled by as few calls as possible&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;i.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Lots of sub files holding build steps obfuscates the process and ensures others will have a hard time working on their project&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ii.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Reporting Clarity gets harder and harder as you pass output back up the chain&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;7.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;The Solution should have Level 4 Warnings and Treat Warnings as Errors Enabled and enforced by the build&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;8.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;The Solution Should be clean of any Static Analysis warnings and enforced by the build&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;9.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;If it is a windows product it should pass any BinScope Analyzer checks&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;10.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;If it is an Windows product with unmanaged code, that code should pass the hard-coded string checker check and be enforced by the build&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;11.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;The build should also run any Unit Tests available&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;12.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;The builds results should be available from reporting system with historical tracking&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;a.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Every check and log should be clearly and effectively available&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;b.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Historical data should have graphs for ease of understanding&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;13.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;The builds should be able to self-report to selected individuals&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;a.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Teams should determine recipients and frequency and method&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;i.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Email&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ii.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Monitoring tool&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;iii.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Rejected check-in&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1.5in; mso-add-space: auto; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;iv.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;IM or Text&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;14.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;If an installer, it should conform to our installers best practices document&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;15.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;All installers should be always be available with a simple action&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;a.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Button on Web Site&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l0 level2 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;b.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Signal from monitoring app&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; mso-list: l0 level1 lfo1; text-indent: -0.25in;"&gt;&lt;span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="font-family: Calibri;"&gt;16.&lt;/span&gt;&lt;span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;All builds should always be “Green” 24/7/26&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-2525677825719531912?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/2525677825719531912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=2525677825719531912' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/2525677825719531912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/2525677825719531912'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2011/03/best-practices.html' title='Best Practices'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-4091694118482186046</id><published>2011-01-28T08:27:00.001-05:00</published><updated>2011-11-08T12:32:10.051-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Build'/><title type='text'>How to Set up a Custom Activity on Team Build</title><content type='html'>You can find lots of refrences on how to actually code your activity all over the net. I am just going to give you&amp;nbsp;a better and more scalable way to use it. All of those involve copying your template from its normal place and putting it into the solution with your custom activity and then copying it back to the build templates folder when you are done. Hardly scalable if you have dozens of templetes. I am going to tell you how to do it without making your template part of the solution and just leving them where they are.The key&amp;nbsp;step is after compiling your dll, is&amp;nbsp;open your visual studio command line window. Browse to the your local sandbox copy of the dll created by your activity and execute: gacutil /i "dllnamehere". This puts the dll in the gac on your local machine. Now add a new tab to your toolbox window in visual studio and&amp;nbsp; label it. Now right click on the blank area under that tab and select "choose items" browse to the dll on your machine&amp;nbsp;and choose it. Now you should see your tasks in the toolbox. Because it is in the GAC you should now just be able to drag your activity onto your template and BOOM your done. The GAC here is the key part, without GACing it you have to go through all of the steps mentioned everywhere else online that are a pain, and were the main reason I was reluctant to go to custom tasks. One &lt;br /&gt;note, when you check in the dll, the build controller will try to load it up, if a build is currently running it will take itself off line until that build(s) finish so that it can load in the new dll and bring &lt;br /&gt;itself back online. Feel free to ask any questions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-4091694118482186046?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/4091694118482186046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=4091694118482186046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/4091694118482186046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/4091694118482186046'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2011/01/how-to-set-up-custom-activity-on-team.html' title='How to Set up a Custom Activity on Team Build'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-5504174555364163163</id><published>2011-01-06T14:13:00.001-05:00</published><updated>2011-11-08T12:33:40.247-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Build'/><title type='text'>Visual Studio 2010 and viewing Team Build Logs</title><content type='html'>So we are moving away from cruise control.net from handling our compiles and moving to Team Build. I must say analyzing what went wrong in team build is next to impossible. The new WPF log display in VSTS is the worst software I have ever heard about. It's not so bad if your logging verbosity is normal or lower, but if you have an issue and actually need valuable info write off your day. This is consistent across dozens of users from dozens of builds, so this is an issue. Today, I loaded up a log file, tried searching for my term. Crashed. Tried using Next Error and Next Warning, both Crashed. So I set about scrolling through the log. After 10 minutes I gave up holding the mouse button down to scroll and taped it. It has been scrolling for 4 hours now. Thanks for that awesome WPF Micorosft. You are making it easy for our executives to not&amp;nbsp;authorize rewriting our apps in WPF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-5504174555364163163?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/5504174555364163163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=5504174555364163163' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/5504174555364163163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/5504174555364163163'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2011/01/visual-studio-2010-and-viwing-team.html' title='Visual Studio 2010 and viewing Team Build Logs'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-2176720893210616393</id><published>2010-04-02T08:57:00.001-04:00</published><updated>2011-11-08T12:32:42.053-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Build'/><title type='text'>TFS2010 and Team Build. Finally a true CI solution?</title><content type='html'>So over the next few weeks, we will be running a test TFS server through its paces. I am pretty excited to see what the new team build brings to the table. If the implementation lives up to half of the hype, we will be leaving CruiseControl.NET on our products, and leave our only CC.NET instances for specialized things like our Lab Manager set-up. I will try to post reviews and notes as I actually test stuff, so if any of you non-existent readers want me to look at anything specifically sent me a comment and I'll try to work it into my testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-2176720893210616393?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/2176720893210616393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=2176720893210616393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/2176720893210616393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/2176720893210616393'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2010/04/tfs2010-and-team-build-finally-true-ci.html' title='TFS2010 and Team Build. Finally a true CI solution?'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-7089522738974970842</id><published>2010-02-19T10:38:00.002-05:00</published><updated>2010-02-19T10:53:00.893-05:00</updated><title type='text'>How not to do an ESX w/ Lab Manager Upgrade</title><content type='html'>Somedays you just go home feeling like an idiot, wondering how you could have commited such a rookie mistake. Yesterday was one of those days. For the record, no matter how much testing you do, doing an upgrade with no notice in the middle of the week is a terrible idea. TERRIBLE. No matter how much you and your IT Guy hate working on the weekend. srsly, trust me on this. But anyways, here are some pointers on things to check off when doing an upgrade.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make sure all of your VM's are undeployed with no state saved. They will not be able to redploy without deleting the saved state. It will confuse your users.&lt;/li&gt;&lt;li&gt;Make sure you and your IT guy have a clearly defined listing of all changes that will occur.&lt;/li&gt;&lt;li&gt;Make sure you have tested in an environment with those changes implemented FULLY.&lt;/li&gt;&lt;li&gt;Make sure you test the system by hand, and if you have automation make sure you test that&lt;/li&gt;&lt;li&gt;Make sure the system is not needed in the morning, prepare contigency plans&lt;/li&gt;&lt;li&gt;Don't make changes to your automation code on the same day&lt;/li&gt;&lt;li&gt;Don't make changes to your VM's or make new VM's on the same day&lt;/li&gt;&lt;li&gt;Don't change compilers during the week you will be rolling out new automation code&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-7089522738974970842?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/7089522738974970842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=7089522738974970842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/7089522738974970842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/7089522738974970842'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2010/02/how-not-to-do-esx-w-lab-manager-upgrade.html' title='How not to do an ESX w/ Lab Manager Upgrade'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-5014582521386144982</id><published>2010-01-21T08:20:00.001-05:00</published><updated>2010-01-21T08:21:39.353-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lab Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Two new tasks just added</title><content type='html'>We have added another two tasks to our LabManager Tasks in CruiseControl.NET. We have added create configuration and customize configuration.&lt;br /&gt;&lt;br /&gt;Create Configuration: This allows us to take mutiple library images and create a big single configuration out of them. This will help cut down on the number of VM's in our library as we no longer need 3 or 4 English Vista 32 bits for different configurations. We just maintain one, and create the diffrent configurations it is needed in on the fly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Pb8R9RQVo34/S1hTyCyC0YI/AAAAAAAAADA/WV0jw5oTLus/s1600-h/CreateConfig.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://1.bp.blogspot.com/_Pb8R9RQVo34/S1hTyCyC0YI/AAAAAAAAADA/WV0jw5oTLus/s320/CreateConfig.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Customize Configuration: This takes multipe configurations and iterates through all the machines in those configurations and resets their MAC and IP address, to facilitate unfenced deployments&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Pb8R9RQVo34/S1hUmNaYd3I/AAAAAAAAADI/EoQz3c5_Pn8/s1600-h/customize.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" mt="true" src="http://3.bp.blogspot.com/_Pb8R9RQVo34/S1hUmNaYd3I/AAAAAAAAADI/EoQz3c5_Pn8/s400/customize.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-5014582521386144982?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/5014582521386144982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=5014582521386144982' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/5014582521386144982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/5014582521386144982'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2010/01/two-new-tasks-just-added.html' title='Two new tasks just added'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Pb8R9RQVo34/S1hTyCyC0YI/AAAAAAAAADA/WV0jw5oTLus/s72-c/CreateConfig.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-6715020256914096591</id><published>2010-01-08T11:03:00.001-05:00</published><updated>2010-01-08T11:04:35.258-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Threading'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>WaitHandle's WaitAll Method</title><content type='html'>I already have a workaround, and it doesn't seem so bad. But just out of curiousity, can anyone tell me why the waitall method is limited to taking an array of 64 items or less? Are they trying to force you out of the overhead of creating an array of ManualResetEvents, since instead you use a single integer and single ManualResetEvent? Is there some architectural reason? just wondering...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-6715020256914096591?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/en-us/library/system.threading.waithandle.waitall.aspx' title='WaitHandle&apos;s WaitAll Method'/><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/6715020256914096591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=6715020256914096591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/6715020256914096591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/6715020256914096591'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2010/01/waithandles-waitall-method.html' title='WaitHandle&apos;s WaitAll Method'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-8229817459868733474</id><published>2010-01-06T21:02:00.002-05:00</published><updated>2010-01-07T10:13:47.252-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VMWare'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>How not to do API's</title><content type='html'>So as you can see I have spend a lot of time coding against VMWare's Lab Manager 4.0 API's. I must say after working with them in two versions now, 3 and 4. They really should do a better job of something that they tout as part of the value of the product. &lt;br /&gt;&lt;br /&gt;My first issue is the upgrade from to 3.0 to 4.0 broke code, with no release notes or warnings. They do put out a document which basically just tells you the Methods and Paramaters available. Almost always with no description, I mean seriously it is great to know that you pass a method an array of VMCopyData, it's just it would help if they actually told you ANYWHERE what that object entailed. To make matters worse, after trying to figure it out and finally finding a rough idea what to do online I found out that it seems a VMCopyData object is a an Object that consists of a Machine object and a property of the machine object. Seriously...Why would you create a new poorly documented object that only has the same information as an existing object that has better documentation? And to make matter worse, since any method that you would pass a VMCopyData object to also takes the config ID. And the configuration that the ID points to already has the Machine Objects in it, so why I am even passing them at all? Here is the code I ended up getting working.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Pb8R9RQVo34/S0U7Rim5dhI/AAAAAAAAAC4/XMgANOmAgjc/s1600-h/vmcopydata.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ps="true" src="http://3.bp.blogspot.com/_Pb8R9RQVo34/S0U7Rim5dhI/AAAAAAAAAC4/XMgANOmAgjc/s320/vmcopydata.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center" class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&amp;nbsp; The only thing I can think of for this whole mess would be they were giving you the ability to switch which datastore&amp;nbsp;the Machines are saved on. But&amp;nbsp;dang there has to be an easier way to&amp;nbsp;do that. And even if that was true why not just the Machine Object?&amp;nbsp;Not that anyone's listening but am I wrong here?&lt;br /&gt;&lt;br /&gt;My other big&amp;nbsp;complaint is&amp;nbsp;in 3.0 the configuration object had a property&amp;nbsp;of type which was&amp;nbsp;an int which was either 1 or 2 for workspace&amp;nbsp;or library type. In 4, they decided that&amp;nbsp;depending on the context there would be anywhere from 2&amp;nbsp;- 4 types. The property now has 4 possible values,&amp;nbsp;1-4. However, if you are passing&amp;nbsp;int configurationType to the ListConfigurations() there are only 2 values 1 and 2. &amp;nbsp;And then the worst part is the web site only shows two values, so you cannot just simply look and see which of your configurations are of which type. The only way to truly know is create a small test app to grab all the configurations and iterate through them and spew each name and type out somehow.&lt;br /&gt;&lt;br /&gt;Please VMWare, pay attention to your API forums, actually answer question, get some consistency across your API's and no more breaking changes without some documentation on what will be breaking. Trying to search through 100 pages or so of method signatures and trying to spot the differences is not doable. You convinced us your product was worth the investment so live up to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-8229817459868733474?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/8229817459868733474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=8229817459868733474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/8229817459868733474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/8229817459868733474'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2010/01/how-not-to-do-apis.html' title='How not to do API&apos;s'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Pb8R9RQVo34/S0U7Rim5dhI/AAAAAAAAAC4/XMgANOmAgjc/s72-c/vmcopydata.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-2263285016156366899</id><published>2009-12-15T07:27:00.004-05:00</published><updated>2009-12-15T07:43:50.523-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lab Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>The Execute and Update Task</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next two tasks, and the second to the last group, are Execute and Update. With the Execute task we can run any &lt;a href="http://en.wikipedia.org/wiki/Windows_PowerShell"&gt;PowerShell&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Windows_Installer"&gt;MSI&lt;/a&gt;, or exe on a VM and put the output, both stdErr and stdOut up on the web dashboard. The only real new elements are:&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;files: A list of files to execute tied to each machine&lt;/div&gt;&lt;div&gt;setRevertPoint: a Boolean to determine if we set the revert point before executing our files&lt;/div&gt;&lt;div&gt;waitForExecuteToComplete: A boolean to determine if we should wait for the return codes&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Pb8R9RQVo34/SyeC93h_3HI/AAAAAAAAACw/8ZZabHITUSc/s1600-h/LMExecute.png"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415441076326489202" border="0" alt="" src="http://4.bp.blogspot.com/_Pb8R9RQVo34/SyeC93h_3HI/AAAAAAAAACw/8ZZabHITUSc/s320/LMExecute.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;The Second task is the Updates task. we use this for weekly maintenance to do windows updates, update firefox, and/or update opera. This will check out the library base do all these tasks then check it back in as the new gold master. The old Gold Master gets saved in the local worksapce with a .bak postfix until we have verified the vm changes and can delete the back-up files.&lt;br /&gt; The only two new configuration elements are:&lt;br /&gt;firefoxupdate - a boolean&lt;br /&gt;operaupdate - a boolean&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Pb8R9RQVo34/SyeC2MT1DCI/AAAAAAAAACo/dIZZCj_qj_o/s1600-h/LMUpdates.png"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 239px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5415440944465251362" border="0" alt="" src="http://3.bp.blogspot.com/_Pb8R9RQVo34/SyeC2MT1DCI/AAAAAAAAACo/dIZZCj_qj_o/s320/LMUpdates.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-2263285016156366899?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/2263285016156366899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=2263285016156366899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/2263285016156366899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/2263285016156366899'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2009/12/execute-and-update-task.html' title='The Execute and Update Task'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Pb8R9RQVo34/SyeC93h_3HI/AAAAAAAAACw/8ZZabHITUSc/s72-c/LMExecute.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-890638189711884291</id><published>2009-12-11T08:19:00.005-05:00</published><updated>2009-12-11T08:37:19.821-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lab Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>The Clone and the Delete Tasks</title><content type='html'>The next two tasks I will cover are the clone and delete tasks. The First task is clone, which we use to make copies of a VM while it is in a desired state. Like, for instance, we set a revert point on the VM and install one of our products. I will then clone that VM to pass out to each QA member on that team who has asked for automatic deployments.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Clone Task&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This task again takes the common paramters all the Lab Manager tasks do and these:&lt;br /&gt;fencedmode - do we deploy fenced or not (default is fenced)&lt;br /&gt;users - a list of users scheduled to get a copy of each of the VMs&lt;br /&gt;configurations - a list of VMs to send to everyone&lt;br /&gt;deploy - a boolean, after we clone a VM to a user do we deploy it, or leave it undeployed&lt;br /&gt;then we have the "allowfrom" quartet, described in ealier tasks. We use this to help narrow down where we look for the VMs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Pb8R9RQVo34/SyJJmKSyLZI/AAAAAAAAACY/x6-5A5pTFTk/s1600-h/lmclone.png"&gt;&lt;img style="WIDTH: 404px; HEIGHT: 150px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5413970621999754642" border="0" alt="" src="http://3.bp.blogspot.com/_Pb8R9RQVo34/SyJJmKSyLZI/AAAAAAAAACY/x6-5A5pTFTk/s320/lmclone.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Delete Task&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This task is simply used to clean up the base VM images we create in the process of executing all the other tasks. The last task in each of our projects is the delete task. We are currently also discussing at this as a publisher item instead of a task so that if the project errors out we still try to clean up.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The only extra element in this one is a list of configurations to delete&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Pb8R9RQVo34/SyJKhKT_puI/AAAAAAAAACg/RVWnzXo0pQc/s1600-h/lmdelete.png"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 92px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5413971635617113826" border="0" alt="" src="http://4.bp.blogspot.com/_Pb8R9RQVo34/SyJKhKT_puI/AAAAAAAAACg/RVWnzXo0pQc/s320/lmdelete.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-890638189711884291?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/890638189711884291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=890638189711884291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/890638189711884291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/890638189711884291'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2009/12/clone-and-delete-tasks.html' title='The Clone and the Delete Tasks'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Pb8R9RQVo34/SyJJmKSyLZI/AAAAAAAAACY/x6-5A5pTFTk/s72-c/lmclone.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-4788547036712636745</id><published>2009-12-10T08:08:00.006-05:00</published><updated>2009-12-11T08:37:46.591-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lab Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Next Tasks - Copy and Capture</title><content type='html'>&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Pb8R9RQVo34/SyD4OddmbgI/AAAAAAAAAB4/hH1wlPq9e7I/s1600-h/lmcopy.png"&gt;&lt;/a&gt;&lt;br /&gt;To put any confusion to rest immediately, the copy task is for copying files onto the VM's as part of the process, not to make a copy of the VM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reminder that all tasks accept the following info:&lt;br /&gt;Url - The url for the desired VMWare SOAP API&lt;br /&gt;LabManagerUser - a user account in Lab Manager with permissions to do what you want&lt;br /&gt;LabManagerPassword - that users password&lt;br /&gt;Organization - The organization, in which you want the current task to occur&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lab Manager Copy Task&lt;/strong&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_Pb8R9RQVo34/SyD4g16V1lI/AAAAAAAAACA/SMefV5Rh-ls/s1600-h/lmcopy.png"&gt;&lt;img style="WIDTH: 498px; HEIGHT: 259px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5413599995210618450" border="0" alt="" src="http://3.bp.blogspot.com/_Pb8R9RQVo34/SyD4g16V1lI/AAAAAAAAACA/SMefV5Rh-ls/s400/lmcopy.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;This task accepts a few parameters:&lt;br /&gt;AllowWorspaceBase - If we use a config in the Global\Main workspace(Default:false)&lt;br /&gt;AllowUserWorkspace - If we use a config in the users workspace(Default:false)&lt;br /&gt;AllowLibraryBase - If we can use the Gold Master base images (Default:false)&lt;br /&gt;AllowLibraryDated - If we can use the dated library image that all users can see (Default:false)&lt;br /&gt;&lt;br /&gt;FencedMode - Should we deploy Fenced or Unfenced (Default:fenced)&lt;br /&gt;TimeOut - (Default:600)&lt;br /&gt;Configurations - A list of the machines to use, and the files to copy on them&lt;br /&gt;&lt;br /&gt;The copy task will look for the appropriate VM to copy, if it is using a library image it will deploy it itself. Once the VM is deployed and ready, we get its IP address and copy files onto it's public folder. (C:\Users\Public\ or C:\Documents and Settings\All Users\). Again, this is another set up task as it is useless on its own. As part of the refactoring we will be issuing Power SHell commands remotely to the box, which can then copy to anywhere on the box, not just the public folder like we are constrained to now.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lab Manager Capture Task &lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_Pb8R9RQVo34/SyD4uAHikNI/AAAAAAAAACI/YGVryiXn2Kw/s1600-h/lmcapture.png"&gt;&lt;img style="WIDTH: 485px; HEIGHT: 207px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5413600221288632530" border="0" alt="" src="http://1.bp.blogspot.com/_Pb8R9RQVo34/SyD4uAHikNI/AAAAAAAAACI/YGVryiXn2Kw/s400/lmcapture.png" /&gt;&lt;/a&gt; &lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;This task accepts a few parameters:&lt;br /&gt;&lt;br /&gt;TimeOut - (Default:600)&lt;br /&gt;configurations - A list of the vm's to capture&lt;br /&gt;&lt;br /&gt;The capture task looks for the VM deifned in configurations in the Global\Main workspace and if it finds it there Captures it to the libarary with the current date, in the mmm D format, prepended. This library config is then shared out across organizations. This is what creates the dated library configs our users can see and check out if they do not have daily deployments scheduled&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-4788547036712636745?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/4788547036712636745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=4788547036712636745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/4788547036712636745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/4788547036712636745'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2009/12/next-tasks-copy-and-capture.html' title='Next Tasks - Copy and Capture'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Pb8R9RQVo34/SyD4g16V1lI/AAAAAAAAACA/SMefV5Rh-ls/s72-c/lmcopy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-351957833962148610</id><published>2009-12-08T09:40:00.004-05:00</published><updated>2009-12-10T08:37:23.170-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lab Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>The 6 new Tasks</title><content type='html'>&lt;div&gt;So in order to accomplish the glorious vision. I had to create 6 new tasks in CruiseControl.NET which call the LabManger API's to accomplish all this. Here is the 1st in 6 posts about the tasks&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;All Tasks Accept the Following Info:&lt;/strong&gt;&lt;br /&gt;Url - The url for the desired VMWare SOAP API&lt;br /&gt;LabManagerUser - a user account in Lab Manager with permissions to do what you want&lt;br /&gt;LabManagerPassword - that users password&lt;br /&gt;Organization - The organization, in which you want the current task to occur&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lab Manager Deploy Task&lt;/strong&gt; &lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_Pb8R9RQVo34/SyD5fS-mAaI/AAAAAAAAACQ/073h6YA2l2A/s1600-h/LM_Deploy.png"&gt;&lt;img style="WIDTH: 404px; HEIGHT: 194px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5413601068164972962" border="0" alt="" src="http://2.bp.blogspot.com/_Pb8R9RQVo34/SyD5fS-mAaI/AAAAAAAAACQ/073h6YA2l2A/s400/LM_Deploy.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;This task accepts a few parameters:&lt;br /&gt;AllowLibraryBase - If we can deploy the Gold Master base images (Default:True)&lt;br /&gt;AllowLibraryDated - If we can use the dated library image that all users can see (Default:False)&lt;br /&gt;FencedMode - Should we deploy Fenced or Unfenced (Default:fenced)&lt;br /&gt;TimeOut - (Default:600)&lt;br /&gt;Configurations - A list of the machines to deploy&lt;br /&gt;&lt;br /&gt;The deploy tasks, will check the designated library image into the default workspace for the current organization, and deploy it as configured (fenced/un) which will by itself turn on the machines in the configuration. The will be owned by the User in the config block. Usually this is a prep task for other subsequent tasks which accomplish more of the real work.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-351957833962148610?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/351957833962148610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=351957833962148610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/351957833962148610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/351957833962148610'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2009/12/6-new-tasks.html' title='The 6 new Tasks'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Pb8R9RQVo34/SyD5fS-mAaI/AAAAAAAAACQ/073h6YA2l2A/s72-c/LM_Deploy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-1977783252421691656</id><published>2009-12-04T07:50:00.013-05:00</published><updated>2009-12-15T07:50:22.036-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lab Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='VMWare'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Where we are at</title><content type='html'>So over the next few days, I will try to describe the system as it stands today. I have been kind of heads down for awhile getting this all running.First and most important thing we were able to complete (though we are refactoring it currently ;) )is a set of tasks in &lt;a href="http://sourceforge.net/projects/ccnet/"&gt;CruiseControl.NET &lt;/a&gt;for &lt;a href="http://www.vmware.com/products/labmanager"&gt;LabManager&lt;/a&gt; by &lt;a href="http://www.vmware.com/index.html"&gt;VMWare&lt;/a&gt;. We have 6 basic tasks that are highly configurable. We use these to accomplish a number of things. First a basic description of how we are currently planning on using the system. First is from 7Am to 7PM, this is the time those with access to the system are allowed to use it, most this is for black box testing, but more and more it is being used for lots of odd jobs like remote debugging on configurations we might not have otherwise. From 7PM to 7 AM is when we set aside the system for automated testing. We chose currently to seperate out the acitvities because mostly of resource constraints with the servers.&lt;br /&gt;&lt;br /&gt;OK, so in our library is a set of gold master configurations, we have about 45 gold masters currently. For the desktop configurations we decided on a naming convention of ENU-V32-SP2-OF7-IE8-FF3, all of the desktop configurations are named in this pattern. The example means it is a native english/US Vista 32bit Service Pack 2 OS, with Office 7, Internet Explorer 8, and FireFox 3.0.x on it. All of the configurations also have the latest Flash, Adobe Reader, Safari, Opera, Chrome, PowerShell, and a service on the machine which is currently being obsoleted thanks to Remoting in Powershell. Through &lt;a href="http://blogs.msdn.com/powershell/archive/2009/10/27/windows-management-framework-is-here.aspx"&gt;Remoting&lt;/a&gt;, we will be able to do anything the service would have done, without having to maintain an installed app on the VM's.&lt;br /&gt;&lt;br /&gt;Every Night when the system is shut down, we take all of the libraries, which are not visible to the users because of permissions settings, and check them out to the Global\Main workspace. We then copy all of this nights installers from our various products (those that make sense to be on the desktops) We then shut down the machines and then capture them back to the library with a date prefix in the name. We then set the permssions on these so that they will be visible to the users. We do this for chain management in the VMWare environment.&lt;br /&gt;&lt;br /&gt;After the base nightly configurations have been completed, we go about creating the automatic deployments for QA. We then check out the dated libraries into the product specific local sandbox, if the set revert point flag is set we do that and then install that product, and then make copies for each QA person on that product that needs that configuration, and assign ownership to them. If we set the deploy flag, we also then deploy and power on the machine so it is already for QA in the morning whent they show up.&lt;br /&gt;&lt;br /&gt;After all the nightly deployments and libraries are taken over we have testing. This is the latest and last thing to be fleshed out and completed, so it is not the most utilized. But, from projects in crusiecontrol.net we can spin up a VM, copy files to it, and execute and exe or powershell script on that VM. We do this using that service currently so we are restricted to the normal service rules for the most part. Again, hopefully the PowerShell remoting will replace this and relax some of these restrictions.&lt;br /&gt;&lt;br /&gt;At the end of the night about 7AM, the system goes out and looks for any machine scheduled for automatic deployment and dpeloys and turns them on, so their owner can just come in and get to work. And then, the only other thing is the shut down, at 7PM after people have been testing on their daily deplyments, we go out and delete everything that was created last night, including the libraries. We also then undeploy with the state saved any machine whose owner decided to mark for saving.&lt;br /&gt;&lt;br /&gt;On the weekend we are able to check out any configuration marked for updates, and do all windows updates on it and update FireFox and Opera to their latest versions. Please Please Adobe, Apple, and Google figure out away for an FTP or HTTP download of latest at a static address those three products cause me the msot manual work in maintaining this system as I have to update those by hand. Anyways, once the system has updated the configs it checks them back into the library as the base gold masters.&lt;br /&gt;&lt;br /&gt;Well that is the whole process and what we are able to do, over the next few posts I will get more into the implementation plan, and then lastly how this all fits into out continuous integration on steroids process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-1977783252421691656?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/1977783252421691656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=1977783252421691656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/1977783252421691656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/1977783252421691656'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2009/12/where-we-are-at.html' title='Where we are at'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-8377252623367380256</id><published>2009-03-09T08:10:00.001-04:00</published><updated>2009-03-09T08:27:39.630-04:00</updated><title type='text'>Lab Manager / CruiseControl.NET</title><content type='html'>Lately I have been working on integrating &lt;a href="http://www.vmware.com/products/labmanager/features.html"&gt;Lab Manager&lt;/a&gt; and CruiseControl.NET. It is the next step in my Grand Vision, and one of the most important pieces behind CC.NET itself. The idea with Lab Manager, is that after an installer build I will be able to a number of things. The first, and so far not easiest thing, is instead of publishing an installer internally I will create Virtual Machines with the software already installed, this will save each person in QA the hassle of doing this each morning. The second thing is Lab Manager provides me an environment with all of our supported hosts, to be able to use for EggPlant testing. Now, after an installer we will spin up copies of each of our test targets and then kick off our eggplant suites. This will be one more piece of the continuous integration solution so that by the time we come in, in the morning, we will know that the software has not only passed Static Analysis, Unit Testing, but Automated testing as well. I am very excited about this part. The third thing (which will actually end up running first) that I will work on is installer testing. We will install/uninstall on our targets and not only make sure they work, but provide a report to QA and Release Engineering on what artifacts are left over from the uninstall, like Registry Keys and File System objects. The only sad part about this is once I get all this done, am I resigned to a life of managing the system. Or will my ADD be satisified and I will move on to bigger and better projects. But I tell you what, I burst with anticipation at the thought of our CI vision being fulfilled.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-8377252623367380256?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/8377252623367380256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=8377252623367380256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/8377252623367380256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/8377252623367380256'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2009/03/lab-manager-cruisecontrolnet.html' title='Lab Manager / CruiseControl.NET'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-6004344312651952089</id><published>2009-01-28T08:55:00.004-05:00</published><updated>2009-01-28T09:13:39.287-05:00</updated><title type='text'>Apple? Can you hear me?</title><content type='html'>As a company that is trying to develop for the Mac in addition to our Windows development. It would be very nice if we could create VM's of the apple products we need to support. How can you not allow this? You are creating an imbalance with how much support, automated testing, and general black box testing we can do for the mac in comparison with our windows development. Please Apple allow this, at least for companies trying to develop products for your platform!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-6004344312651952089?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/6004344312651952089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=6004344312651952089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/6004344312651952089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/6004344312651952089'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2009/01/apple-can-you-hear-me.html' title='Apple? Can you hear me?'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-4536315845610222897</id><published>2008-12-24T08:24:00.005-05:00</published><updated>2008-12-24T11:54:44.270-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Build Automation'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>70 builds and counting</title><content type='html'>So as of this week we have crossed the 70 build line. I can honestly say I never thought we would come close to this number. But now I can see 100 being an easy goal that will probably be reached within 3 months, with all the different version numbers, localized versions, and Mac and Windows versions. When I started this CruiseControl.NET system we had one build machine that was really nothing more than a glorified desktop, now we have 6 physical windows server 2003 machines, 3 VM server 2003 machines, and 1 physical OSX 10.5.5 server all churning out compiles, running tests, doing static analysis, running eggplant tests, FTP'ing binaries and a host of other responsibilities 24/7/365. I have my first vacation coming in February since adding all of this responsibility, it will be interesting to see how the system performs in my absence. But the best part is the rewarding feeling that it is becoming an important part of how we do business.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-4536315845610222897?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/4536315845610222897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=4536315845610222897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/4536315845610222897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/4536315845610222897'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/12/70-builds-and-counting.html' title='70 builds and counting'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-6456854292800147085</id><published>2008-11-26T12:38:00.004-05:00</published><updated>2008-11-26T12:52:29.993-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSX'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET Continuous Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='Mono'/><title type='text'>How to run CC.NET on an OSX server</title><content type='html'>First off you will want to install Mono 2.0 and the current MonoDevelop on your OSX server. Then you will want to pull down the source for CC.NET from the subversion repository on &lt;a href="http://sourceforge.net/svn/?group_id=71179"&gt;SourceForge&lt;/a&gt;. Open MonoDevelop then open the ccnet.sln file and compile in release. Then move your binaries out to what will be your working directory. Then using &lt;a href="http://launchd.macosforge.org/"&gt;LaunchD&lt;/a&gt;, which is like the new version of cron only better, schedule it so it is always running your ccnet.exe. In the plist which is the file LaunchD uses to run your app, set it like &lt;a href="http://screencast.com/t/48CFhcCm"&gt;this&lt;/a&gt;. This will then make sure that ccnet.exe is started at boot time, and is restarted anytime it dies. After that, everything is normal CruiseControl.NET configuration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-6456854292800147085?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/6456854292800147085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=6456854292800147085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/6456854292800147085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/6456854292800147085'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/11/how-to-run-ccnet-on-osx-server.html' title='How to run CC.NET on an OSX server'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-8787520371061306932</id><published>2008-11-20T08:03:00.008-05:00</published><updated>2008-11-26T13:06:24.081-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code Coverage'/><category scheme='http://www.blogger.com/atom/ns#' term='MsTest'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET Continuous Integration'/><title type='text'>CodeCoverage and UnitTesting on CC.NET</title><content type='html'>My work was based off of this &lt;a href="http://blogs.msdn.com/ms_joc/articles/406608.aspx"&gt;article&lt;/a&gt;. I set up this Powershell &lt;a href="http://screencast.com/t/1KKNrzha"&gt;script&lt;/a&gt; to run everything.&lt;br /&gt;&lt;br /&gt;I then use XSL to display it on the dashboard&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-8787520371061306932?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/8787520371061306932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=8787520371061306932' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/8787520371061306932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/8787520371061306932'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/11/codecoverage-and-unittesting-on-ccnet.html' title='CodeCoverage and UnitTesting on CC.NET'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-6920180639849068838</id><published>2008-11-14T15:33:00.011-05:00</published><updated>2008-11-26T13:08:45.596-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FTP PowerShell dmg StreamReader BinaryReader'/><title type='text'>How to FTP In PowerShell</title><content type='html'>So I needed to FTP some of the binaries produced by the build process and had been using an ftp client. Now, this means more software installed on the build server and we try not to do that, so I had been wanting to do it all through PowerShell. That's when I ran across &lt;a href="http://stackoverflow.com/questions/265339/whats-the-best-way-to-automate-secure-ftp-in-powershell"&gt;this&lt;/a&gt; on stackoverflow.com. This let me to modifying it to upload, but I ran into some issues. Specifically trying to FTP an Apple dmg file. It seems the streamreader encodes things as they pass through and it did not know how to handle the encoding on a dmf file. After much trial and tribulation I came up with reading it using the BinaryReader object and that was the ticket. So I came up with &lt;a href="http://screencast.com/t/8ctWq0MD"&gt;this&lt;/a&gt;. Hopefully I didn't create any errors while removing internal info.&lt;br /&gt;&lt;br /&gt;Hope this helps someone&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-6920180639849068838?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/6920180639849068838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=6920180639849068838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/6920180639849068838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/6920180639849068838'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/11/how-to-ftp-in-powershell.html' title='How to FTP In PowerShell'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-8234221792876205278</id><published>2008-10-23T07:26:00.002-04:00</published><updated>2008-10-23T07:32:46.255-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Localization'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>CI and How it can help your Localization team</title><content type='html'>So I was reading through &lt;a href="http://stackoverflow.com/"&gt;StackOverflow.com&lt;/a&gt; and ran across a question about what editor people use to examine their resource files, and one of the answers moved on to the topic of how to automate the collection of strings for their localization department. So I have started working on a &lt;a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx"&gt;PowerShell&lt;/a&gt; script which, at every installer creation, create a list of strings added or removed since the last build and then since we started this version of the installer. Our hope is that we will be able to keep on top of the translations and not have to have an engineer going out and diffing files by hand. Not only will this save us manhours but hopefully shorted the gap between our imternational release dates and our English ones. Has anyone else out there had any experience doing these things? Am I on the right track? Were there any gotchas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-8234221792876205278?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/8234221792876205278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=8234221792876205278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/8234221792876205278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/8234221792876205278'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/10/ci-and-how-it-can-help-your.html' title='CI and How it can help your Localization team'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-578703794372432218</id><published>2008-10-06T07:27:00.004-04:00</published><updated>2008-10-13T11:07:56.578-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Mono'/><title type='text'>Update on Mono</title><content type='html'>So it turns out my frustration was mostly in vain. Once I got a hold of them and was able to talk to them, they explained that they thought the fix was already in the 2.0 RC, and sure enough it was. My CruiseControl.NET is now running smoothly on OSX. I wish the Mono guys would take time to update their issue tracking system so that you could get a realistic idea of what is going to be fixed or not. But hell, I am not complaining after all my issue is fixed ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-578703794372432218?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/578703794372432218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=578703794372432218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/578703794372432218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/578703794372432218'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/10/update-on-mono.html' title='Update on Mono'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-3959023826274467071</id><published>2008-10-03T08:08:00.003-04:00</published><updated>2008-10-13T11:08:15.716-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Mono'/><title type='text'>Mono on the Mac</title><content type='html'>Alot of frustration this week. It turns out Mono a .NET implementation that I use on our Mac server has not bothered to properly implement the process class. How in the heck do they bother moving on to Linq and other toys when a process can't even WaitForExit or get the correct response from HasExited? They already have issues logged for it but they are marked with a normal or low priority. What the heck makes something a high prioirity? If something that renders their entire implementation useless is normal, What is high? The worse part is that their forums are next to worthless as hundreds of questions just go unanswered.....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-3959023826274467071?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/3959023826274467071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=3959023826274467071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/3959023826274467071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/3959023826274467071'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/10/mono-on-mac.html' title='Mono on the Mac'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-3333275776677140099</id><published>2008-09-22T08:43:00.004-04:00</published><updated>2008-09-22T08:52:37.144-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='XSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Redstone'/><category scheme='http://www.blogger.com/atom/ns#' term='Eggplant'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Eggplant to the Rescue</title><content type='html'>I was trying to integrated our automated UI tests, for which we use Eggplant by Redstone, into CruiseControl.NET at the end of last week. We had already determined that Eggplant was head and shoulders above other UI automation, because of their cross platform abilities and they are ability to still automate highly customized controls. However, when trying to set up Eggplant to run scheduled tests I ran into a couple of gotchas, and was even more happy with them when their support team, monitoring their forums, gave me workarounds for everything within minutes. Literaly, I do not think a single post I wrote went more than 10 minutes without it being addressed. The two gotchas I ran into were their strange return codes and the lack of XML output from the test runs. Both of which, are pretty much required in order to ingerate it from start to finish with CruiseControl. Once I got past these issues, all that was required was that I create the XSL to transform the XML into a nicely formatted display on the web site and in the emails. So once again, thank you to the team at Redstone YOU GUYS ROCK!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-3333275776677140099?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/3333275776677140099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=3333275776677140099' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/3333275776677140099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/3333275776677140099'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/09/eggplant-to-rescue.html' title='Eggplant to the Rescue'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-682057771334985005</id><published>2008-09-16T10:50:00.007-04:00</published><updated>2008-09-16T11:32:23.431-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='srcsrv'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Source Server'/><title type='text'>How to set up a Source Server</title><content type='html'>The funny part about Microsoft's documentation on the source server stuff that comes with the Visual Studio debug tools is that none of their examples shows how to do with TFS. There are other sites out on the web that show it. And, it is really simple once I got by the gotcha, but I thought I would reiterate here and point out one huge gotcha that I only seem to have found.&lt;br /&gt;&lt;br /&gt;1. Install latest Perl, and Debugging Tools for Windows&lt;br /&gt;2. Modify srcsrv.ini in the debugging/srcsrv folder to have only MYSERVER=http://YOURTFSSERVERHERE:8080/&lt;br /&gt;comment everything else out it is not needed&lt;br /&gt;3. Run command like tfsindex.cmd -source=YOURPATHHERE -symbols=YOURPATHHERE&lt;br /&gt;&lt;br /&gt;Now the gotcha is this. The source folder actually needs to be a tfs created folder. The directions say it searches recursively under the source directory you list, but it creates a list of the files that are in tfs based on some info it gets by querying tfs from the directory you tell it in -source. So for us I create a master directory called Projects_TFS and then pull down my projects into that. So my source path I was setting to Projects_TFS figuring it would then recursively search through all of my project directories. Which, by the way it does do, the problem is when it makes the tfs call from Projects_TFS, I imagine the call is something like give me all the fiels under $Projects_TFS which of course TFS does not know about that folder so it returns no files. Then when we recursively go through all the directories srcsrv has no tfs files to link to the actual files in the source file system, so it does not do anything. So make sure you are actually passing -source a TFS project folder.&lt;br /&gt;&lt;br /&gt;If you need to debug this there are a few options you can pass tfsindex a /debug or a -SHOWCOMMANDS, for more info without actually modifying anything. But in the end, what helped me figure out what was going wrong was to uncomment some debug spew lines that are commented out in the tfs perl script that does the tfs query and subsequent parsing of the pdbs where it tries to replace file system paths that are hard coded with a corresponding TFS call put together with info from the original call in the source directory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-682057771334985005?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/682057771334985005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=682057771334985005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/682057771334985005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/682057771334985005'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/09/how-to-set-up-source-server.html' title='How to set up a Source Server'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-96748884198004178</id><published>2008-09-13T13:06:00.005-04:00</published><updated>2008-09-13T13:17:38.746-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET Continuous Integration'/><category scheme='http://www.blogger.com/atom/ns#' term='Eggplant'/><title type='text'>What is our Goal</title><content type='html'>So the ultimate dream here is a system in which when a file is checked in, it kicks of a build of every affected product in every configuration, while at the same time running all unit tests of the affected product as well as any Static Analysis we might have. Then either through somebody asking for it, or once a night we create an installer for each of these products and automatically run through a series of tests ensuring that the application installs and uninstalls correctly on every operating system and configuration it is supposed to. Then using eggplant we will run a series of autmated tests against the product in question. All of these compiles, Unit Tests, Static Analysis, Installer Tests, Automated Test will then have their results published out on the CruiseControl.NET dashboard for all interested parties to be able to see. In the event of failures all interested parties would be notified by email. Anyways this the hope an dream I will be trying to realize. I have most of it already in operation, now to finish it off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-96748884198004178?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/96748884198004178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=96748884198004178' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/96748884198004178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/96748884198004178'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/09/what-is-our-goal.html' title='What is our Goal'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-3881515647156087853</id><published>2008-09-11T08:15:00.000-04:00</published><updated>2008-09-11T08:25:13.466-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSX'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Mono'/><title type='text'>CruiseControl.NET on OSX</title><content type='html'>We here use CruiseControl.NET as the backbone of our continuous integration process because it is head an shoulders above everything else we tried. It is well supported with an active user community and it's free :) The one part I am having issues with, is that since we have started doing a little cross platfrom development and dipping our toes into the Apple pond, I needed to be able to support our Mac devs in the exact same manner as our Windows devs. However, running .NET apps on OSX requires Mono, which for the most part works very well. However, we seem to have an issue in Mono that I cannot find an answer for anywhere and it is driving me nuts. The calls to subversion seem to not have the threads properly closed at the end, and my cruise control process keeps running out of threads (even though it is supposedly only using 10 at the point it fails) about every 40 minutes. Now Mono has really poor debugging and poor user support, especially when compared to CC.NET so finding my issue has been tricky. In fact, being as I am pushed for time right now getting a whole bunch of other things running I have implemented the hack of hacks, and have launchd spawning a script every 20 minutes that simply kills my CC.NET processes, causing the thread count to go back down to zero. Does anyone out there on the wild wild internet have any good suggestions or tips for chasing this down or a better place to talk to other Mono users? Please Help.....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-3881515647156087853?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/3881515647156087853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=3881515647156087853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/3881515647156087853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/3881515647156087853'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/09/cruisecontrolnet-on-osx.html' title='CruiseControl.NET on OSX'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2555990933155856800.post-7458326519598470099</id><published>2008-09-10T09:08:00.000-04:00</published><updated>2008-09-10T09:12:39.880-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='welcome'/><category scheme='http://www.blogger.com/atom/ns#' term='intro'/><title type='text'>Welcome.....</title><content type='html'>This will be a place where I discuss all things that interest me in my role at work. I help automate a software companies Release Engineering and QA processes. It is a process neatly wrapped up in a buzzword called Continuous Integration. Now kids, I know that is a big and scary phrase but hopefully in the coming months I can show you how useful it can be, and just how far I plan on taking it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2555990933155856800-7458326519598470099?l=dontbreakthebuild.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dontbreakthebuild.blogspot.com/feeds/7458326519598470099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2555990933155856800&amp;postID=7458326519598470099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/7458326519598470099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2555990933155856800/posts/default/7458326519598470099'/><link rel='alternate' type='text/html' href='http://dontbreakthebuild.blogspot.com/2008/09/welcome.html' title='Welcome.....'/><author><name>Alex Hutton</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_Pb8R9RQVo34/SMfI4Ws09rI/AAAAAAAAAAM/f5AY_MKjYZE/S220/AlexHutton.jpg'/></author><thr:total>0</thr:total></entry></feed>
