On Apr 8, 2011, at 9:16 AM, 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/
One detail. I think I'd prefer to have master = develop branch and have a stable branch. The reason is to make people discover the latest changes first. Thanks -Vincent >> = 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

