<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Continuous Integration On A Real, Big Project</title>
	<atom:link href="http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/feed/" rel="self" type="application/rss+xml" />
	<link>http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/</link>
	<description>Trying to walk that thin line between intelligence and ignorance</description>
	<lastBuildDate>Tue, 16 Mar 2010 21:33:15 +0100</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Drew</title>
		<link>http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/comment-page-1/#comment-16972</link>
		<dc:creator>Drew</dc:creator>
		<pubDate>Tue, 26 May 2009 23:44:54 +0000</pubDate>
		<guid isPermaLink="false">http://davybrion.com/blog/?p=1393#comment-16972</guid>
		<description>Ah. Nightmarish. On the bright side, the problems you&#039;re running into might be justification for a future refactor.

I can&#039;t wait to see how things progress. Thanks for posting all of this.</description>
		<content:encoded><![CDATA[<p>Ah. Nightmarish. On the bright side, the problems you&#8217;re running into might be justification for a future refactor.</p>
<p>I can&#8217;t wait to see how things progress. Thanks for posting all of this.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Andreas Grabner</title>
		<link>http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/comment-page-1/#comment-16937</link>
		<dc:creator>Andreas Grabner</dc:creator>
		<pubDate>Tue, 26 May 2009 15:52:53 +0000</pubDate>
		<guid isPermaLink="false">http://davybrion.com/blog/?p=1393#comment-16937</guid>
		<description>Thanks for sharing that post with us.

Analyzing build process performance can be done by using the appropriate tools when executing your unit or integration tests. Profilers, Coverage Tools or diagnostics solution can identify which methods take how long and how often those methods are executed by your unit tests. This helps you to identify methods that already have a very good coverage - and also lets you find the impact a single method has on the overall test execution.

Another interesting aspect is optimizing compile time. I&#039;ve recently worked with a client that is running a build for every single check-in that is done by the developers. Here it is very critical to optimize compile times and unit test execution times. They use &lt;a href=&quot;http://www.dynatrace.com&quot; rel=&quot;nofollow&quot;&gt;dynatrace&lt;/a&gt; to analyze test execution and are now also looking into diagnostics of their compile times.
Alois - a colleague of mine - wrote an interesting article about &lt;a href=&quot;http://blog.dynatrace.com/2009/05/04/performance-management-in-continuous-integration/&quot;Performance Management in CI&lt;/a&gt;.

Hope my comment helps</description>
		<content:encoded><![CDATA[<p>Thanks for sharing that post with us.</p>
<p>Analyzing build process performance can be done by using the appropriate tools when executing your unit or integration tests. Profilers, Coverage Tools or diagnostics solution can identify which methods take how long and how often those methods are executed by your unit tests. This helps you to identify methods that already have a very good coverage &#8211; and also lets you find the impact a single method has on the overall test execution.</p>
<p>Another interesting aspect is optimizing compile time. I&#8217;ve recently worked with a client that is running a build for every single check-in that is done by the developers. Here it is very critical to optimize compile times and unit test execution times. They use <a href="http://www.dynatrace.com" rel="nofollow">dynatrace</a> to analyze test execution and are now also looking into diagnostics of their compile times.<br />
Alois &#8211; a colleague of mine &#8211; wrote an interesting article about &lt;a href=&#8221;http://blog.dynatrace.com/2009/05/04/performance-management-in-continuous-integration/&#8221;Performance Management in CI.</p>
<p>Hope my comment helps</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Davy Brion</title>
		<link>http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/comment-page-1/#comment-16876</link>
		<dc:creator>Davy Brion</dc:creator>
		<pubDate>Tue, 26 May 2009 06:17:41 +0000</pubDate>
		<guid isPermaLink="false">http://davybrion.com/blog/?p=1393#comment-16876</guid>
		<description>@Drew

i think we&#039;re averaging around 8 builds a day... it would be more if we allowed concurrent builds of the same project on our buildserver but we&#039;ve disabled that so the builds for this project won&#039;t prevent other projects&#039; builds from running frequently

as for performance bottlenecks in the old tests... we did that once, there was one part that was executed before every test which caused a lot of slowdown.  We modified that last year, which actually took the build time from 90 minutes to around 40 minutes back then.  Other than that, there aren&#039;t really any specific performance issues we can easily fix for those tests. Going with several instances of the CI server is unfortunately not an option.

We&#039;re not writing unit tests for the generated code... the codegenerator actually generates a whole bunch of tests for the actual code it generates.  I seriously dislike that (IMO the codegen should have its own tests to make sure it generates correct code) but there&#039;s really not that much we can change about the whole thing at this point.  The whole codegen process is way too complicated for what it originally should&#039;ve been and we&#039;re kind of stuck with it for parts that haven&#039;t been rewritten yet.

Generating stubbed code purely for testing would make a lot of those old tests useless as well... the generated code is basically an extensive datalayer (and a pretty bad one at that) and a lot of those tests use parts that are generated, and parts that were added to it (such as custom SQL queries).  If we were to generate stubbed code, the tests would fail the moment they would execute any custom query which happens very frequently.

Making changes to the codegen is something we try to avoid as much as possible. Every time we try to make a change there, it causes problems and we end up reverting to the way it was before.  It&#039;s also hard to convince management to spend time on the codegen since the idea is to phase it out and basically rewrite everything eventually.</description>
		<content:encoded><![CDATA[<p>@Drew</p>
<p>i think we&#8217;re averaging around 8 builds a day&#8230; it would be more if we allowed concurrent builds of the same project on our buildserver but we&#8217;ve disabled that so the builds for this project won&#8217;t prevent other projects&#8217; builds from running frequently</p>
<p>as for performance bottlenecks in the old tests&#8230; we did that once, there was one part that was executed before every test which caused a lot of slowdown.  We modified that last year, which actually took the build time from 90 minutes to around 40 minutes back then.  Other than that, there aren&#8217;t really any specific performance issues we can easily fix for those tests. Going with several instances of the CI server is unfortunately not an option.</p>
<p>We&#8217;re not writing unit tests for the generated code&#8230; the codegenerator actually generates a whole bunch of tests for the actual code it generates.  I seriously dislike that (IMO the codegen should have its own tests to make sure it generates correct code) but there&#8217;s really not that much we can change about the whole thing at this point.  The whole codegen process is way too complicated for what it originally should&#8217;ve been and we&#8217;re kind of stuck with it for parts that haven&#8217;t been rewritten yet.</p>
<p>Generating stubbed code purely for testing would make a lot of those old tests useless as well&#8230; the generated code is basically an extensive datalayer (and a pretty bad one at that) and a lot of those tests use parts that are generated, and parts that were added to it (such as custom SQL queries).  If we were to generate stubbed code, the tests would fail the moment they would execute any custom query which happens very frequently.</p>
<p>Making changes to the codegen is something we try to avoid as much as possible. Every time we try to make a change there, it causes problems and we end up reverting to the way it was before.  It&#8217;s also hard to convince management to spend time on the codegen since the idea is to phase it out and basically rewrite everything eventually.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Drew</title>
		<link>http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/comment-page-1/#comment-16848</link>
		<dc:creator>Drew</dc:creator>
		<pubDate>Tue, 26 May 2009 01:17:54 +0000</pubDate>
		<guid isPermaLink="false">http://davybrion.com/blog/?p=1393#comment-16848</guid>
		<description>IMHO, the purpose of CI is short feedback time for breaking code changes. Maybe tests running once an hour is good enough. Maybe not. I don&#039;t know how frequent your checkins are or what your other constraints/requirements are. You know all of that better than I possibly can.

If you&#039;re trying to cut running time, though, here are some things I&#039;d look into:
- Have you profiled the test run to find the perf bottleneck(s)?
- Can any of the tests be parallelized?
- Assuming the tests have to run serially, is splitting the CI server into several instances (virtual servers or whatever), each running different subsets of the tests an option?
- Is there a better way to test your generated code than hand-crafting unit tests for it? Maybe that&#039;s not what you&#039;re doing and I misunderstood you. If so, I apologize.
- Alternately, is there a subset of those tests that give you the biggest test bang for the time it takes to run them (80/20 rule)? If a big bunch of tests always passes, it&#039;s probably not helping you to find new problems to run everything as frequently as tests for problem areas. Yes, this is similar to Whaley&#039;s suggestion. I like his suggestion, too, though.
- Again, maybe I misunderstood you, but if you&#039;re having problems stubbing db accesses in the generated code, why not create a &quot;test build&quot; wherein the generator creates stubbed code? Sure, that&#039;s not exactly the same as release code and it&#039;s a good idea to run against your &quot;real&quot; code, too, but if you ran against a test build frequently and a real build less frequently I bet you could speed up the feedback.</description>
		<content:encoded><![CDATA[<p>IMHO, the purpose of CI is short feedback time for breaking code changes. Maybe tests running once an hour is good enough. Maybe not. I don&#8217;t know how frequent your checkins are or what your other constraints/requirements are. You know all of that better than I possibly can.</p>
<p>If you&#8217;re trying to cut running time, though, here are some things I&#8217;d look into:<br />
- Have you profiled the test run to find the perf bottleneck(s)?<br />
- Can any of the tests be parallelized?<br />
- Assuming the tests have to run serially, is splitting the CI server into several instances (virtual servers or whatever), each running different subsets of the tests an option?<br />
- Is there a better way to test your generated code than hand-crafting unit tests for it? Maybe that&#8217;s not what you&#8217;re doing and I misunderstood you. If so, I apologize.<br />
- Alternately, is there a subset of those tests that give you the biggest test bang for the time it takes to run them (80/20 rule)? If a big bunch of tests always passes, it&#8217;s probably not helping you to find new problems to run everything as frequently as tests for problem areas. Yes, this is similar to Whaley&#8217;s suggestion. I like his suggestion, too, though.<br />
- Again, maybe I misunderstood you, but if you&#8217;re having problems stubbing db accesses in the generated code, why not create a &#8220;test build&#8221; wherein the generator creates stubbed code? Sure, that&#8217;s not exactly the same as release code and it&#8217;s a good idea to run against your &#8220;real&#8221; code, too, but if you ran against a test build frequently and a real build less frequently I bet you could speed up the feedback.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Arjan`s World &#187; LINKBLOG for May 25, 2009</title>
		<link>http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/comment-page-1/#comment-16822</link>
		<dc:creator>Arjan`s World &#187; LINKBLOG for May 25, 2009</dc:creator>
		<pubDate>Mon, 25 May 2009 20:50:47 +0000</pubDate>
		<guid isPermaLink="false">http://davybrion.com/blog/?p=1393#comment-16822</guid>
		<description>[...] Continuous Integration On A Real, Big Project - Davy Brion [...]</description>
		<content:encoded><![CDATA[<p>[...] Continuous Integration On A Real, Big Project &#8211; Davy Brion [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Davy Brion</title>
		<link>http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/comment-page-1/#comment-16800</link>
		<dc:creator>Davy Brion</dc:creator>
		<pubDate>Mon, 25 May 2009 17:25:08 +0000</pubDate>
		<guid isPermaLink="false">http://davybrion.com/blog/?p=1393#comment-16800</guid>
		<description>well, as i mentioned in the post, there are about 13000 legacy tests that all use the database... only running them once or twice a day would sorta defeat the whole purpose of CI.

Also, the build server itself is plenty beefy... most of the time is wasted on running those old tests, during which the CPU activity of the build server isn&#039;t really high (around 30%) so upgrading the buildserver isn&#039;t going to make a huge difference</description>
		<content:encoded><![CDATA[<p>well, as i mentioned in the post, there are about 13000 legacy tests that all use the database&#8230; only running them once or twice a day would sorta defeat the whole purpose of CI.</p>
<p>Also, the build server itself is plenty beefy&#8230; most of the time is wasted on running those old tests, during which the CPU activity of the build server isn&#8217;t really high (around 30%) so upgrading the buildserver isn&#8217;t going to make a huge difference</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: whaley</title>
		<link>http://davybrion.com/blog/2009/05/continuous-integration-on-a-real-big-project/comment-page-1/#comment-16793</link>
		<dc:creator>whaley</dc:creator>
		<pubDate>Mon, 25 May 2009 16:03:02 +0000</pubDate>
		<guid isPermaLink="false">http://davybrion.com/blog/?p=1393#comment-16793</guid>
		<description>&lt;q&gt;The build time is about 48 minutes on average now, which is obviously way above the recommended 10 minutes. I’d love to see this go down to about 20 minutes (which i’d find very acceptable considering the size of the project) but that’s gonna take a long while.&lt;/q&gt;

I have no clue how modular your system is but perhaps keep your builds on commits strictly relegated to compiling and running *unit tests* for a particular module/library and do a nightly/twice a day/four times a day &quot;full&quot; build that compiles and unit+integration test of everything.  

Also, how beefy is your build box/cluster?  It never hurts to upgrade that thing.  Hardware is cheap compared to developer time.</description>
		<content:encoded><![CDATA[<p><q>The build time is about 48 minutes on average now, which is obviously way above the recommended 10 minutes. I’d love to see this go down to about 20 minutes (which i’d find very acceptable considering the size of the project) but that’s gonna take a long while.</q></p>
<p>I have no clue how modular your system is but perhaps keep your builds on commits strictly relegated to compiling and running *unit tests* for a particular module/library and do a nightly/twice a day/four times a day &#8220;full&#8221; build that compiles and unit+integration test of everything.  </p>
<p>Also, how beefy is your build box/cluster?  It never hurts to upgrade that thing.  Hardware is cheap compared to developer time.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
