Hi,

Sorry didn't mean to blame or come off snarky. I just it is important not
to #include our release process from somewhere else. We don't have to do
anything unless it is necessary to meet some requirement of what we are
trying to do.

So the phrase "Trunk is always releasable" definitely has some wiggle room
because you have to define what your release process is.

If your requirement is that at any time you be able to tag trunk and ship
it within minutes then yes staging branches help solve that problem.

The reality is that the release process always takes low single digit days
because you branch trunk, then wait for longer running automated tests to
run against that branch. If there happens to be a failure you may have to
update the branch, but you have bounded how much brokeness sits between you
and release already. We also don't have a requirement to be able to ship
nigh immediately.

We can balance the cost of extra steps and process against the cost of
having to delay some releases some of the time by a few days and pick
whichever is more important. We are stilly reducing the amount of time it
takes to get a working release. Reduced enough that we should be able to
ship every month without difficulty. I have been on a team roughly our size
that shipped every three weeks without having staging branches. Trunk broke
infrequently enough it wasn't an issue and when it did break it wasn't hard
to address. The real pain point was flapping tests and the diffusion of
responsibility that prevented them from getting fixed.

If I were trying to sell staging branches I would work the angle that I
want to be able to bisect trunk without coming across broken revisions.
Then balance the value of that with the cost of the process.

Ariel

On Thu, May 7, 2015 at 10:41 AM, Benedict Elliott Smith <
belliottsm...@datastax.com> wrote:

> It's a bit unfair to characterize Aleksey as subscribing to a cargo cult.
> *We* agreed to define the new release process as "keeping trunk always
> releasable".
>
> Your own words that catalyzed this: "If we release off trunk it is pretty
> much necessary for trunk to be in a releasable state all the time"
>
> It is possible we have been imprecise in our discussions, and people have
> agreed to different things. But it does seem to me we agreed to the
> position Aleksey is taking, and he is not blindly following some other
> process that is not ours.
>
> On Thu, May 7, 2015 at 3:25 PM, Ariel Weisberg <
> ariel.weisb...@datastax.com>
> wrote:
>
> > Hi,
> >
> > Whoah. Our process is our own. We don't have to subscribe to any cargo
> cult
> > book buying seminar giving process.
> >
> > And whatever we do we can iterate and change until it works for us and
> > solves the problems we want solved.
> >
> > Ariel
> >
> > On Thu, May 7, 2015 at 10:13 AM, Aleksey Yeschenko <alek...@apache.org>
> > wrote:
> >
> > > Strictly speaking, the train schedule does demand that trunk, and all
> > > other branches, must be releasable at all times, whether you like it or
> > not
> > > (for the record - I *don’t* like it, but here we are).
> > >
> > > This, and other annoying things, is what be subscribed to tick-tock vs.
> > > supported branches experiment.
> > >
> > > > We still need to run CI before we release. So what does this buy us?
> > >
> > > Ideally (eventually?) we won’t have to run CI, including duration
> tests,
> > > before we release, because we’ll never merge anything that hadn’t
> passed
> > > the full suit, including duration tests.
> > >
> > > That said, perhaps it’s too much change at once. We still have missing
> > > pieces of infrastructure, and TE is busy with what’s already
> back-logged.
> > > So let’s revisit this proposal in a few months, closer to 3.1 or 3.2,
> > maybe?
> > >
> > > --
> > > AY
> > >
> > > On May 7, 2015 at 16:56:07, Ariel Weisberg (
> ariel.weisb...@datastax.com)
> > > wrote:
> > >
> > > Hi,
> > >
> > > I don't think this is necessary. If you merge with trunk, test, and
> > someone
> > > gets in a head of you just merge up and push to trunk anyways. Most of
> > the
> > > time the changes the other person made will be unrelated and they will
> > > compose fine. If you actually conflict then yeah you test again but
> this
> > > doesn't happen often.
> > >
> > > The goal isn't to have trunk passing every single time it's to have it
> > pass
> > > almost all the time so the test history means something and when it
> fails
> > > it fails because it's broken by the latest merge.
> > >
> > > At this size I don't see the need for a staging branch to prevent trunk
> > > from ever breaking. There is a size where it would be helpful I just
> > don't
> > > think we are there yet.
> > >
> > > Ariel
> > >
> > > On Thu, May 7, 2015 at 5:05 AM, Benedict Elliott Smith <
> > > belliottsm...@datastax.com> wrote:
> > >
> > > > A good practice as a committer applying a patch is to build and run
> the
> > > > unit tests before updating the main repository, but to do this for
> > every
> > > > branch is infeasible and impacts local productivity. Alternatively,
> > > > uploading the result to your development tree and waiting a few hours
> > for
> > > > CI to validate it is likely to result in a painful cycle of
> > race-to-merge
> > > > conflicts, rebasing and waiting again for the tests to run.
> > > >
> > > > So I would like to propose a new strategy: staging branches.
> > > >
> > > > Every major branch would have a parallel branch:
> > > >
> > > > cassandra-2.0 <- cassandra-2.0_staging
> > > > cassandra-2.1 <- cassandra-2.1_staging
> > > > trunk <- trunk_staging
> > > >
> > > > On commit, the idea would be to perform the normal merge process on
> the
> > > > _staging branches only. CI would then run on every single git ref,
> and
> > as
> > > > these passed we would fast forward the main branch to the latest
> > > validated
> > > > staging git ref. If one of them breaks, we go and edit the _staging
> > > branch
> > > > in place to correct the problem, and let CI run again.
> > > >
> > > > So, a commit would look something like:
> > > >
> > > > patch -> cassandra-2.0_staging -> cassandra-2.1_staging ->
> > trunk_staging
> > > >
> > > > wait for CI, see 2.0, 2.1 are fine but trunk is failing, so
> > > >
> > > > git rebase -i trunk_staging <ref~1>
> > > > fix the problem
> > > > git rebase --continue
> > > >
> > > > wait for CI; all clear
> > > >
> > > > git checkout cassandra-2.0; git merge cassandra-2.0_staging
> > > > git checkout cassandra-2.1; git merge cassandra-2.1_staging
> > > > git checkout trunk; git merge trunk_staging
> > > >
> > > > This does introduce some extra steps to the merge process, and we
> will
> > > have
> > > > branches we edit the history of, but the amount of edited history
> will
> > be
> > > > limited, and this will remain isolated from the main branches. I'm
> not
> > > sure
> > > > how averse to this people are. An alternative policy might be to
> > enforce
> > > > that we merge locally and push to our development branches then await
> > CI
> > > > approval before merging. We might only require this to be repeated if
> > > there
> > > > was a new merge conflict on final commit that could not automatically
> > be
> > > > resolved (although auto-merge can break stuff too).
> > > >
> > > > Thoughts? It seems if we want an "always releasable" set of branches,
> > we
> > > > need something along these lines. I certainly break tests by mistake,
> > or
> > > > the build itself, with alarming regularity. Fixing with merges
> leaves a
> > > > confusing git history, and leaves the build broken for everyone else
> in
> > > the
> > > > meantime, so patches applied after, and development branches based on
> > > top,
> > > > aren't sure if they broke anything themselves.
> > > >
> > >
> >
>

Reply via email to