On Fri, 2011-04-08 at 12:13 +0200, Vincent Massol wrote:
> On Apr 8, 2011, at 12:05 PM, Luca Anca wrote:
> 
> > On Fri, 2011-04-08 at 09:17 +0200, Vincent Massol wrote:
> >> On Apr 2, 2011, at 7:31 PM, Sergiu Dumitriu wrote:
> >> 
> >>> Hi devs,
> >>> 
> >>> Since we're moving to git / GitHub, it's time to re-evaluate the 
> >>> development / git usage strategy.
> >>> 
> >>> = Short version:
> >>> 
> >>> 1/ Where do developers commit:
> >>> A. Always in the master branch
> >>> B. In feature branches in the official repo, merged into the master 
> >>> branch when ready
> >>> C. In their personal forks, requesting pulls in the official repo with a 
> >>> mandatory code review from another developer
> >> 
> >> I've heard people do C but I don't like too much for the following reasons:
> >> * It means finding a developer to review every time which IMO is going to 
> >> either be very hard to do or that developer will simply approve it without 
> >> really reviewing the code
> >> * It means the master branch will be slow to have the latest changes which 
> >> means our CI tests won't run as often on them (only close to release 
> >> dates) which is bad and will make code integration harder
> >> * Side note: Even though Git encourages developers to keep their work 
> >> locally without sharing them we should **NOT** do this and developers 
> >> should continue to commit every day and not keep code on their machines. 
> >> This prevents code integration and code reviews. It's easy to casually 
> >> review 15 lines of code, it's very hard to review 300 lines of code!
> >> * Since mails (and diff mails) will continue to be sent code reviews will 
> >> still be done as before. This is lazy code reviewing and is IMO much 
> >> better than forced code reviews which I don't see working. It would be a 
> >> good strategy if we were building a software to send man to Mars for 
> >> example but for XWiki I favor a lazy code reviewing approach (what we've 
> >> been  doing).
> >> 
> >>> 2/ How to move code from development to release:
> >>> A. Commit and release from the master branch
> >>> B. Develop in feature branches, merge them in the master when ready, 
> >>> release from master
> >>> C. Develop in feature branches, merge them in a development branch 
> >>> (master) for polishing, merge them in a release branch when done-done
> >>> D. Develop in feature branches, merge them often in the development 
> >>> branch (master) for snapshot testing, move into the stabilization 
> >>> (pre-release) branch for polishing, move into the release branch when 
> >>> done-done.
> >>> E. Develop in feature branches, merge them in a development branch for 
> >>> snapshot testing, move into a stabilization branch for the Next release, 
> >>> which becomes the Current release branch after the previous release is 
> >>> done, and which becomes a Maintenance branch after the new release is 
> >>> performed. Only bugfixes go in the Current release branch.
> >>> 
> >>> I vote 1C and 2D.
> >> 
> >> I vote for doing http://nvie.com/posts/a-successful-git-branching-model/
> > 
> > There's a limitation of this model, I explained in my mail. Here it
> > goes:
> > 
> > We release 3.0, merge it in master and tag
> > We release 3.1, merge it in master and tag
> > We release 3.0.1 (from a hotfix branch created from the 3.0 tag), merge
> > and tag where?
> 
> We need to create a 3.0 branch for this, which is ok I think.

And keep it forever? I mean all the releases will have their branch
forever?

That is, if I understand how branches work. If you delete a branch you
also delete all tags on it?

Thanks,
Anca

> 
> Thanks
> -Vincent
> 
> > I'm fine with this model as long as we find a solution for this.
> > 
> >> 
> >>> = Long version
> >>> 
> >>> The common practice with Subversion is to have as few branches as 
> >>> possible, usually a trunk and a few maintenance branches, or 
> >>> development+stable+maintenance. This is a consequence of the perceived 
> >>> difficulty of merging changes between branches in svn, and the high cost 
> >>> of keeping multiple branches checked out.
> >>> 
> >>> On the other hand, the git philosophy is to use branches as much as 
> >>> possible. Two core elements are "feature branches" and "forks".
> >>> 
> >>> A feature branch is a branch where one feature is being developed, 
> >>> separated from the trunk and all the other features. While working on 
> >>> it, the developer "rebases" the branch on top of the trunk to keep his 
> >>> branch up to date with the trunk, and at the end "merges" the feature 
> >>> branch into the trunk. This way in-development features are kept out of 
> >>> the main trunk, but still allowing changes to be committed someplace 
> >>> public (no local uncommitted code anymore).
> >>> 
> >>> A central element of GitHub is the ability to "fork" a repository. This 
> >>> means that a user clones a project in a personal repository where he can 
> >>> commit changes. He can later ask the maintainer of the original to 
> >>> "pull" those changes back into the original repository. This is the 
> >>> preferred way of contributing patches on GitHub.
> >>> 
> >>> 
> >>> 
> >>> == Commit/Development-related strategies
> >>> 
> >>> A. One central repository, one trunk (subversion-like)
> >>> 
> >>> Developers clone the official trunks repository, prepare commits 
> >>> locally, then push back to the official repository. It's the same 
> >>> strategy that we're using now, except that we can also have an offline 
> >>> local repository.
> >>> 
> >>> 
> >>> B. One central repository, feature branches
> >>> 
> >>> Developers clone the official trunks repository, prepare commits locally 
> >>> in feature branches, then push back to the official repository in 
> >>> feature branches as well. When a feature is considered stable, it is 
> >>> merged into the master branch. Small bugfixes and improvements go 
> >>> directly in the master branch.
> >>> 
> >>> B1. Also use specific helper branches
> >>> 
> >>> Security fixes also go into a "security" branch so that users can 
> >>> cherry-pick them into older tags to build a custom patched version.
> >>> 
> >>> Retired features can go into a "retired" branch so that users can 
> >>> re-include that feature in a custom build if they need it.
> >>> 
> >>> 
> >>> C. One aggregated repository, pulling from developers
> >>> 
> >>> Developers fork the official repositories, work on their fork (in 
> >>> feature branches as well), then make pull requests for integrating their 
> >>> work into the trunk. The rule would be that another developer has to do 
> >>> the pull after a code review (mandatory code reviews). This means more 
> >>> bugs spotted before committing, but also more work/time needed from the 
> >>> committers.
> >>> 
> >>> We can relax the rule so that obvious bugfixes can be pulled by the same 
> >>> developer making the pull request.
> >>> 
> >>> 
> >>> Personally, I prefer C, since it ensures better quality since at least 
> >>> two eyes see each line of code.
> >> 
> >> I don't like it much because it means less integration and integration at 
> >> the last minute. I prefer 15 pair of eyes than 2 pair of eyes.
> >> 
> >> I like the idea of having a "develop" branch which is for the future 
> >> release where all do developer push to it. They can have temporary feature 
> >> branches but these need to be as temporary as possible and push asap to 
> >> the "develop" branch. The idea is that of CI which has to be done ASAP. 
> >> This is really really key. 
> >> 
> >>> == Integration/Release-related strategies
> >>> 
> >>> Currently, we're developing on the trunk, and we're releasing from it 
> >>> during short breaks from live development.
> >> 
> >> Except for RCs
> >> 
> >>> This is highly dangerous, and 
> >>> imposes a certain rhythm, with fast bursts of development right after a 
> >>> release, and imposed slowdown as the next release approaches (no work on 
> >>> new features after the last milestone).
> >> 
> >> Actually it's highly dangerous only if developers don't provide tests 
> >> (which is what is happening right now in lots of cases for different 
> >> reasons). This is what we need to fight. Providing isolation has never 
> >> been a solution. It's quite the opposite. It's bad and cost way more when 
> >> you need to integrate your work.
> >> 
> >> It's funny how with git we seem to forget all the development best 
> >> practices we've learnt over the years. I find myself going back to 2000, 
> >> that was the last time I've had this kind of discussion ;)
> >> 
> >>> Short releases from a development branch is inline with agile 
> >>> development, but personally I find it too dangerous.
> >>> 
> >>> Most big projects always keep the main development at least one branch 
> >>> away from the release branch.
> >>> 
> >>> One example is the Linux kernel. While a kernel release lasts about 3 
> >>> months, like our own releases, almost all of the code that goes into a 
> >>> release has been developed before the merge window opens. This means 
> >>> that after a kernel version is released, Linus opens a two-weeks merge 
> >>> window during which he accepts pull requests for existing, working, 
> >>> complete code. The next ~10 weeks are spent testing the new kernel and 
> >>> integrating bugfixes, while developers prepare the features for the next 
> >>> kernel version. This ensures that a released kernel has as few bugs as 
> >>> possible. They can afford to do that since there are hundreds or 
> >>> thousands of contributors. Still, this is entirely opposite to our way 
> >>> of working: after a release we barely start writing the code to go in 
> >>> the new release, and we get code in at the last minute (especially me).
> >> 
> >> I definitely don't like to be compared to the linux kernel and wouldn't 
> >> like to be like them. I also think the comparison is not correct.
> >> 
> >> I really dislike this way of working, pushing integration to the end. I'm 
> >> against working in this manner.
> >> 
> >>> Another example that I'd like to present is the new proposed strategy 
> >>> for Mozilla Firefox:
> >>> http://mozilla.github.com/process-releases/draft/development_overview/
> >>> Basically, the propose using 4 branches, from development to release, 
> >>> where code enters on the lowest branch, and moves up towards a release 
> >>> as it stabilizes and becomes release-ready. They use 6-weeks release 
> >>> cycles, and only stable-enough features get promoted from one branch to 
> >>> the next when a new cycle starts. This process ensures quality as well.
> >> 
> >> IMO we only need 1 develop branch + very temporary feature branches (only 
> >> when needed for complex features).
> >> 
> >> What we do need to work on is more testable code and more tests.
> >> 
> >>> I'd like to move closer to one of these two strategies, so that our 
> >>> releases are more polished. The mechanism for ensuring quality that 
> >>> we're currently using is to have an "investigation" phase during the 
> >>> previous release, which is supposed to help define the exact goals, so 
> >>> that during the current release the development should go smoothly 
> >>> towards that "idea goal". Unfortunately, this doesn't work that well. 
> >>> Without the code in place, investigations may miss important 
> >>> details/limitations that will shift the development in another 
> >>> direction. Or it can happen that the time is too short to fully 
> >>> implement something, so we can either release a very "in progress" 
> >>> feature, or decide near the end that it's not enough time to implement 
> >>> everything and focus on polishing what's already available to have a 
> >>> "partial" feature, but polished enough not to reek of low quality.
> >>> 
> >>> The main problem here is that we're mixing feature- and time-based 
> >>> releases, with mandatory features that must find their way into a 
> >>> release, and a fixed deadline to make the release. This means that 
> >>> features have 8-10 weeks to be fully implemented, polished, tested, 
> >>> validated. And that doesn't always happen.
> >>> 
> >>> So, here are some possible integration strategies:
> >>> 
> >>> A. Master development (like now)
> >>> 
> >>> All development is done in the master branch, from which we branch a few 
> >>> hours/days before the release, so that the master remains clear for 
> >>> development.
> >>> 
> >>> B. Feature branches
> >>> 
> >>> All new feature development is done in a separate branch for each 
> >>> feature, and we merge it in the trunk once it's considered done (or very 
> >>> close). When a release date comes, we release with the completed 
> >>> features, whatever those are. We don't force a merge of an incomplete 
> >>> feature just because it's in the roadmap if it's not stable enough.
> >>> 
> >>> C. Feature+Development+Release branches
> >>> 
> >>> All development is done in feature branches, but they get merged on the 
> >>> master branch more often to have test builds; the release branch is 
> >>> separate and it integrates features when they are considered ready. This 
> >>> has the advantage over B. that automated builds expose all the 
> >>> development features.
> >>> 
> >>> D. Feature+Development+Stable+Release branches
> >>> 
> >>> This is similar to the new Mozilla strategy. Developers merge their work 
> >>> in the Development branch very often. Users and other developers can 
> >>> contribute here as well, and preview the upcoming features. When they 
> >>> are close to finalization, they are also merged to the stable branch, 
> >>> where UX, QA and feature owners can test and improve the feature, 
> >>> preparing it for release. Once it's considered ready, it is merged into 
> >>> the release branch, where QA does a final thorough test. Releases happen 
> >>> from this branch.
> >>> 
> >>> E. Feature+Development+Next+Release
> >>> 
> >>> This is similar to D, with the exception that done features go into the 
> >>> next release, while the current release is staging. When the release is 
> >>> done, Release moves into Bugfix, Next becomes Release, and we create a 
> >>> new Next branch and start pulling in it. This would work well if we had 
> >>> very short release cycles (2 weeks), but it's not worth the effort for 
> >>> our current 3-month releases, since a feature would stagnate too much 
> >>> before being released. And it would also work if we had more beta testers.
> >>> 
> >>> 
> >>> We can also impose windows, like 2-4 weeks for a feature to move into 
> >>> the next branch.
> >>> 
> >>> We could also make faster releases, skipping milestones. and going to 6 
> >>> week releases.
> >>> 
> >>> This means that it would take longer for a feature to make its way from 
> >>> idea to release. One release for investigation, one or more for the main 
> >>> development, and one for integration and stabilization.
> >>> 
> >>> But this also means that releases will be more solid, polished, with 
> >>> less bugs, and closer to the user needs.
> >>> 
> >>> 
> >>> Personally I prefer option D, although it's a bit too much overkill with 
> >>> our current limited manpower. We need more contributors and committers!
> >> 
> >> This I agree :)
> >> 
> >>> As for a change strategy, we can continue the way we're doing now, 
> >>> gradually switching to feature branches and release/pre-release branches 
> >>> during the following release.
> >> 
> >> http://nvie.com/posts/a-successful-git-branching-model/ sounds like a 
> >> reasonable, in-between, strategy.
> >> 
> >> WDYT?
> >> 
> >> Thanks
> >> -Vincent
> >> 
> >> PS: It seems my worry about using git is starting to materialize: it's 
> >> that developers develop stuff on their own repo locally without pushing 
> >> fast enough every day (several times per day), thus delaying integration 
> >> to the last moment. If this happens then the whole git move would have 
> >> been very bad for xwiki. I hope we're not going there.
> 
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs


_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to