7/2/2009 4:20:12 PM

Как-то нужно стало стандартизировать работу с бранчами. Ну, чтобы не кто как хочет, а чтобы была какая-то общая стратегия. Которая, впрочем, оставляла бы и достаточно свободы разработчику.

Пока думаю о следующем:

  1. Development Branch (Trunk/Main).
    Основная, с точки зрения разработчика, ветка. В эту ветку допускаются… check ins, commits, как это по-русски… “чекины” буду говорить. Так вот, в эту ветку допускаются чекины изменений, который с точки зрения разработчика готовы к тестированию. Кроме того, здесь фиксятся баги, найденные тестерами.
    Поэтому с точки зрения тестера эта ветка – самая нестабильная в проекте, первый этап.
  2. Feature Branches (Trunk/<FeatureName>).
    Это ветки (“песочницы”, как любил говорить мой бывший коллега) разработчиков. Каждый разработчик, или группа товарищей, могут создавать себе таких веток столько, отпочковывая их от Trunk/Main, сколько им нужно. Предполагается, что в такой ветке идёт разработка какой-то фичи, новой функциональности. Когда разработчики считают, что фича готова, прошли тесты и код-ревью (у кого есть, завидую) и всё такое – они сливают свою ветку обратно с Trunk/Main, отмечают работу как “готова к тестированию” и фича переходит в руки тестеров.
  3. UAT (User Acceptance Test) Branch.
    Бета, так сказать. Стабильная, уже с точки зрения тестеров, ветка. Как туда попадают фичи – отдельный разговор. Ну, например. В случае “классического” итерационного процесса (любой Agile) завершение итерации знаменуется достижением поставленных для данной итерации задач. “Достижение” – это когда фичи сделаны и тестеры довольны. И вот тут мы можем слить изменения из DEV в UAT.
    Либо же изменения вливаются “пофичево”. Фичу оттестировали на DEV – слили в UAT. Это требует больше усилий, правда. И иногда может оказаться не совсем возможным.
    Предмет разговоров, короче. Самое интересное место.
  4. Release Branches (Release/<ReleaseName>).
    Стабильные, релизные ветки. Здесь всё просто: то, что прошло UAT время от времени назначается релизом. Например, когда достигнуты все цели, поставленные перед релизом, то есть, сделаны и оттестированы все необходимые фичи.
    Делается ветка для этого релиза, которая никогда больше не будет ни с чем сливаться, ни в одну, ни в другую сторону.
    Зачем тогда ветка? А просто потому, что там тоже могут оказаться баги :) Которые может быть нужно срочно пофиксить. И тогда это фиксится прямо в ветке текущего релиза. И никуда не сливается. Просто потому, что разработка идёт дальше и как сам баг, так и его фикс уже могут просто не иметь смысла в контексте текущей разработки.
    К тому же фикс в релизе может означать просто какую-то заглушку, какой-то, скажем прямо, хак. В то время, как в дивелоперской ветке этот баг, если он там имеет смысл, фиксится уже со всеми необходимыми рефакторингами и т.д.

С точки зрения “сливания” тоже получается, вроде, неплохо, однонаправленно.
Ветки разработчиков вливаются в DEV (хотя они могут и DEV в свою ветку слить, почему нет, это их право). Дальше всё строже: DEV сливается на UAT только в одну сторону. Поэтому с конфликтами тут всё очень и очень просто – их не должно быть, ибо никакой разработки в UAT не ведётся.

С релизными же ветками вообще никаких конфликтов, ибо они только бранчатся и никогда ни с кем не сливаются.

А как с этим у вас? Какие подходы применяются?

Comments

7/2/2009 6:16:33 PM

Vadim

За DSVC будущее, там не нужно думать о бранчах, они очень просто создаются и так же просто сливаются.

Vadim

7/3/2009 12:42:45 PM

Alexey Raga

Что это такое?
Впрочем, вопрос ведь не в том, насколько просто создать и слить. В той же TFS это делается ничуть не сложнее - два клика мышкой.
Задача, как ты понимаешь, глубже: иметь актуальный и в то же время стабильный срез, а точнее срезы, предназначенные для разных целей. И вот тут уже нужно думать, как это организовать. Процесс я имею в виду, а не тулзу.

Alexey Raga Australia

7/3/2009 2:50:28 PM

Vadim

В том-то и дело, что не нужно. DSVC - это распределенная система контроля версий, когда каждый разработчик по сути работает в своем бранче и нет единого сервера. git или Mercurial например. Вся пределесть в том, что процесс абсолютно не нужен, каждый разработчик имеет столько бранчей, сколько ему нужно, каждая команда может иметь свои бранчи и свои собственные сервера, каждый разработчик может взять патч или набор патчей с любого другого разработчика. Свобода в общем Smile Правда, мышкой уже ничего сделать не получится, они слишком молодые для нормального GUI Smile
А, кстати, вообще никаких конфликтов при сливании как самый большой бонус.

Vadim

7/3/2009 3:01:35 PM

Ilya Smirnov

Скорее всего, ключевое слово в DSVC - distributed. Но тут речь только о способе хранения репозитория (централизовано - нецентрализовано), а процесс, действительно не трогает.

Наш подход аналогичен..
/trunk - текущая разработака
/branches/<name> - релизы
/user/<name> - "песочницы".

На каждую серьезную фичу/баг программист из trunk (branches/name) создает ветку в /user/ и правит ее.
После делает merge в trunk (фича), или branches/name (баг в каком то релизе) и в trunk, решая конфликты.

Билд-сервер с тестами натравлен на trunk и на поддерживаемые релизы. Тестеры берут оттуда прошедшие тесты артифакты и тестируют.

Ilya Smirnov Russia

7/4/2009 5:42:06 AM

Alexey Raga

Вадим, даваааайте разберёёёмся!
Что значит "не нужно"? Да, каждый разработчик имеет свои ветки, столько, сколько хочет. Но я не понял из твоих слов, почему их не надо сливать? Релиз-то один Smile

Для простоты: имеем FooBar LTD с 20-ю разработчиками. Это, скажем, 4 команды. К 1-му января FooBar LTD, согласна контракта, обязана поставить продукт "Super Foo And Bar" с определенным набором функциональности.

20 разработчиков в 4-х командах плодят бранчи, делают фичи.
Вопрос: что тестируют тестеры?
Вопрос: как собирается, собственно, единый релиз из этих всех толп бранчей и фич БЕЗ необходимости сливания веток хоть куда-то?
Пясните на моём примере, либо на примере собственного опыта.

Теперь дальше.
Я поэтому и спросил тебя - что такое DSVG? Ты ответил - "это распределенная система контроля версий, когда каждый разработчик по сути работает в своем бранче и нет единого сервера".
Хорошо. Но как это помогает в процессе с точки зрения тестирования и выпуска продукта?
Возьмём FooBar LTD с его "нераспределённой" системой. Скажем, SVN или TFS. Что мешает разработчикам иметь бранчи? ДЛЯ ЧЕГО им нужна именно распределённая система в рамках компании? Какие задачи она поможет решить и, главное, как?
Поясни, пожалуйста, ибо это очень интересно Smile

Alexey Raga Australia

7/4/2009 9:43:59 AM

Vadim

Смотри, продукт же один? Значит и релиз у него один. Есть одна машина, на которой хранится и собирается продукт. Каждая команда, когда созреет, пихает туда свои изменения, их тестеры и тестируют. Вот и все, весь процесс. Зачем ветки для тестеров и разработчиков? Разработчик всегда может взять набор патчей, которые ему нужны, а тестеры должны тестировать то, что пойдет клиенту, то есть релиз.

Vadim

7/5/2009 4:38:48 PM

Alexey Raga

Вадим, ага, ага!
То есть, слияние все же есть, получается. Как раз тогда, когда "каждая команда, когда созреет, пихает" ;) Там и конфликты могут быть, и все что угодно. Это нормально. Это DEV и  Trunk/Main в моей модели.

Теперь "зачем ветки для тестеров и разработчиков".
Ветка для тестеров - это тот самый бранч, куда пихают свои бранчи разработчики.  Trunk/Main в моей модели. Как ты и сказал, тестеры ее и тестируют.
Однако, процесс тестирования фичи и пинания ее от разработчиков к тестерам и обратно - он занимает какое-то время. И, с точки зрения продукта, срез не является стабильным в каждый текущий момент в этом бранче. Поэтому "релизным" ты его зря назвал. Там прямо сейчас, в этот самый момент, могут находиться фичи, которые были отфутболены тестерами как недоделанные.
Этот бранч НЕЛЬЗЯ передавать клиенту до тех пор, пока определенный набор фич не будет реализован и оттестирован полностью.
После того, как это свершится, срез передается в  UAT. Это может быть публичная бета, с которой работает всего пара-тройка сотен пользователей, это может быть релиз кандидат, назови как хочешь. Его тестируют реальные пользователи.
И вот только после этого этапа получается релиз. Который тоже живет, а в идеальном случае замораживается, в отдельной ветке. В ветке потому, чтобы для нее можно было фиксить баги.

Распределенная система или нет - это вопрос терминологии.
Жизненный цикл-то тот же самый: разработчики в своих "песочнях" делают фичи, сливают их в одну кучу, откуда собирается тестируемая тестерами версия. После удовлетворения написания фич и удовлетворения тестеров версия продукта переходит в состояние "баг фикс только", передается клиенту в качестве релиз кандидата и обкатывается клиентом. В это время команда работает уже над следующей версией продукта и т.д.
То есть, в рамках цикла нам надо иметь:
1) версию, в которую разработчики сливают фичи и которая тестируется тестерами
2) версию, которая в данный момент находится в состоянии релиз-кандидата (обкатки)
3) версию текущего релиза.

От этого-то мы никуда не уходим Smile

Извиняюсь, если сумбурно написал, полночь у нас..

Alexey Raga Australia

7/6/2009 7:07:02 AM

Vadim

Во первых, конфликтов в DSVC почти нет. То есть если два человека строчку одну исправили, конфликт будет. А если они два одинаковых патча накатили, а потом сливают свои ветки - конфликтов нет. А это в общем-то самая большая проблема при сливании.

По веткам - ты же говорил, что по контракту к 1 января продукт должен быть. До этого им никто пользоваться не будет, он же еще не готов. Следовательно, стабильные фичи там или нет, это особо без разницы, дальше тестеров это не пойдет. Ветки для публичных бет и релиз кандидатов тоже не нужны, баги в них правиться не будут, значит достаточно продукт один раз собрать, ну пометить версию для будущих поколений может быть.

Ну ладно, ветку для выпущенного релиза можно сделать, а можно пометить и сделать когда понадобится, чтобы не плодить лишних сущностей.

Распределенность просто помогает решить вопросы с перекидыванием кода от разработчика к разработчику и им не нужно для этого плодить ветки на сервере. При этом веток всего станет больше, но на процесс они уже не влияют Smile

То есть, в рамках цикла нам надо иметь:
1) версию в которую каждая команда сливает свои фичи - например сервер или ветка на нем у лидера команды, хотя это от команды зависит.
2) версию текущего релиза.

Vadim

7/6/2009 12:28:10 PM

Alexey Raga

Про конфликты - то же самое и с не-распределенной системой Smile
Конфликт - это когда одно и то же поменяли в двух разных местах, а потом сливают в одно. Распределенность тут погоды не делает.

Ветка для публичной беты (релиз-кандидата) нужна в том случае, когда версия продукта 1.0 с точки зрения дивелоперов и тестеров готов к релизу, а с точки зрения клиента - непонятно.
Тогда в основной ветке продолжается разработка, делается версия 1.1. Ну, там, глобальный рефакторинг, добавляются новые фичи, уничтожаются старые Smile Все это тестируется тестерами и код 1.1 уже совершенно не похож на код 1.0.
Однако, проходит месяц и клиент говорит: ОК, я релиз-кандидат обкатал. Нужно пофиксить малость вот тут, здесь для меня критично, чтобы было не так, а вот так и вооон там кнопка должна быть синяя. А, еще. Такая-то фича работает медленно уже при тысяче пользователей. Надо оптимизировать - у нас их четыреста тысяч. И через неделю мы ставим это в Release To World, официально заменяем предыдущий продукт.
Вот тут пригождается ветка.

Конечно, если staging'а у вас нет, то из четырех уровней, описанных мною, остается всего три, описанные тобою: дивелоперские песочницы, основная ветка и релизные ветки (всех релизов все же, ибо баг могут найти и в релизе прошлогодней давности, который все еще на саппорте).

Alexey Raga Australia

7/6/2009 1:48:24 PM

Vadim

Не, для релиз-кандидатов ветки все равно не нужны, сам же говоришь, версия 1.0 готова с точки зрения девелоперов - в бранч ее или пометить и потом попозже в бранч, версия 1.1 разрабатывается. Приходит запрос на смену цвета кнопочки - ну меняешь его в релизной ветке.

Vadim

7/7/2009 9:27:04 AM

Alexey Raga

Вадим, подходим к истине ;)
Бранч для релиз-кандидата, не "релиз-кандидатов". Он удобен и вот почему:

1) Релиз-кандидат может появляться не "единовременно", а "постепенно". Например, в нашем случае - это некий staging, на котором и нашим маркетинговым персоналом, и клиентами проводятся демонстрации, с которым работают администраторы продукта - настраивают проекты, подготавливая к релизу и т.д.
То есть, это в идеальном случае в один прекрасный день дивелоперы и тестеры вдруг встанут и скажут: "Фух! Всё! Готово! Отправляем на UAT". В реальной жизни в UAT код попадает тоже постепенно. Не фича за фичей, гораздо реже, конечно. Скажем, пакет за пакетом.

2) На UAT-бранче, так же, как и на Main, "висят" различные задачи: периодический билд, прогон юнит и прочих тестов, и, главное, деплоймент в UAT-среду.
Если мы не будем делать бранч для UAT, обходясь Main, то это придется делать вручную. Плюс следить, чтобы туда не попало то, что не положено.
Если же мы станем обходиться релизным бранчем, то каждый раз придется все это дело перенастраивать на другую (релизную) ветку... В то время, как релизной-то ветке это и не нужно.

Alexey Raga Australia

Comments are closed

Powered by BlogEngine.NET 1.6.0.0

About the author

Alexey Raga Alexey Raga
.NET software developer.

E-mail me Send mail

Twitter


Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010

Sign in