On 4 Mar 2009, at 11:25, Dan North wrote:

2009/2/24 aslak hellesoy <aslak.helle...@gmail.com>
On Tue, Feb 24, 2009 at 10:30 AM, Rob Holland <rob.holl...@gmail.com> wrote: > On Tue, Feb 24, 2009 at 9:17 AM, Matt Wynne <m...@mattwynne.net> wrote:
>
>> You can even use git commit --amend to commit on red (e.g at the end of the
>> day) and then change that commit later.
>
> While I think commit --amend is very useful, I'm not sure why you'd
> bother to commit at the end of the day, knowing full well you were
> going to amend it first thing tomorrow morning.
>

Because the longer you wait, the more your code will diverge from your
teammates'. If you don't commit often you rob them of the opportunity
to reduce merge hell.

This is the money line for me.

There's a lovely CI pattern I've seen in the centralised SCM world (with Java, but that's less important) that I'm surprised hasn't been mentioned. Before I describe it I'd like to take this back to first principles.

The point of continuous integration is to keep each individual integration small and avoid less frequent big integrations, because that's where the pain happens. Syncing up once per story or feature, which could easily be several days work, strikes me as a retrograde step. The fact that DSCMs like git or hg allow you to do this doesn't make it a good thing. There are many fantastic reasons to use DSCM - modelling IBM Rational ClearCase "best practice" usage patterns shouldn't be one of them.

Anyhoo, it seems to me the problem we are discussing is the coupling between checking in an unfinished scenario and failing the build. The solution I've seen - scaling to projects with tens of developers and thousands of scenarios - is to separate in-progress features from finished ones, and build everything.

If an in-progress scenario fails then the build carries on. If a completed scenario fails it causes the build to fail. There is a nice corollary to this whereby you fail the build if an in-progress scenario accidentally passes. This is because you usually want a human to find out why. In cuke-land you would do this at a feature level rather than a scenario level since the convention is to have one feature (with multiple scenarios) per file.

Marking a feature as done can be as simple as moving it between two directories (called in-progress and done), renaming the feature (from openid_login.in-progress to openid_login.feature) or having an :in_progress tag on a feature until it's done.

In Java-land I prefer the first model because I can point the same junit task at either the in-progress or done directories and just change the failOnError flag.

Thanks for your thoughts, Dan. Cucumber 0.2 tags are ideal for this sort of filtering. I'm going to look at adding a 'two tier' feature run to our build.


Matt Wynne
http://blog.mattwynne.net
http://www.songkick.com

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to