Ветвление для выпусков, функций, подфункций и сред - PullRequest
5 голосов
/ 08 октября 2011

Я просмотрел руководства рейнджеров TFS, прежде чем опубликовать это.

У меня есть следующие требования в нашем проекте:

  1. Разработка релиза 1 происходит
  2. Он развернут в среде Dev для проверки интеграции и проверки работоспособности
  3. Если все в порядке, тогда код развертывается в среде QA
  4. Если все в порядке, выпущенный QA-код развертывается на производстве.

В настоящее время у нас есть кодовая база в TFS под CODE, где разработчики кодируют. Выше разветвленная ветвь DEV для зеркалирования кода среды разработки Ветвь DEV разветвляется на ветку QA

Если требуется оперативное исправление, оно фиксируется непосредственно в ветви QA, а затем в обратном порядке объединяется с ветками ниже.

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

Текущие выпуски:

  1. необходимо планировать поддержку будущего выпуска 1.5 разработки
  2. На данный момент есть некоторые функции / исправления, которые могут / не могут быть включены текущий выпуск. Разработчики просто откладывают это на данный момент, чтобы они может быть бездействующим в будущем. Проблема в том, что со временем полки становятся огромная боль слиться, так как у них нет истории
  3. Иногда люди работают над большими функциями на полках до недели. Слияние становится огромной краской, поскольку до тех пор эти десятки файлов также работал много людей.

Имея в виду все вышесказанное, я подумываю переделать нашу структуру ветвления TS, как показано ниже:

Branching to support features and releases

Согласно этому подходу:

  • Разработка может происходить только на ветке разработчика, такой как только ветка DevRel1

  • Если разработчик должен работать над большой функцией, он будет работать над ветвь, такая как ветка Feature 1, разветвленная от ветки Dev. На
    По завершении он слился бы с веткой dev.

  • Для функций, которые могут или не могут быть включены в этот выпуск, В разработке необходимо поработать, вероятно, над ответвлением от основной ветки. В соответствии с окончательным решением, это будет основание меньше объединены в соответствующие ветка разработчика.
  • Код будет развернут в среде Dev из ветви Dev
  • Код будет развернут в ветке QA от Main
  • Для выпуска main будет ветвиться на новую ветку релиза
  • Оперативные исправления в QA происходят в ветви Main, а в Release - в выпуск ветки. RI из релиза случается с основным, а FI с девайсом ветки случаются в этом случае

Это слишком сложно? Можно ли это упростить, выглядит ли это хорошо с точки зрения процесса или нуждается в исправлении?

В настоящее время мы используем TFS 2008.

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

Мой совет - держать вещи как можно проще.ИМХО главные вещи, которых следует избегать:

  • Сложность смущает людей.Чем больше сложностей, тем больше времени требуется для обработки, тем больше слияний вы делаете и тем больше ошибок допускаете.Если вам не нужен процесс , то удалите его.
  • Если вы работаете с кодом в ветке, то в будущем вам обязательно потребуется объединить код.Чем дольше ветки живут до слияния, тем труднее и трудоемче становится объединение.
  • Объединение иерархии ветвей друг с другом приводит к необходимости слияния на нескольких уровнях для возврата кода в ветку devЭто отнимает много времени, чтобы перенести изменение из внешней ветви в основную кодовую базу.

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

Мы используем аналогичный, но более простой подход к вашему.То есть:

  • Мы работаем над веткой Dev.Ежедневные сборки выходят из этой ветки для непрерывного контроля качества.
  • Когда требуется релиз "заморозка кода", создается ветка Release.Исправление может быть сделано в любой ветке, но если требуется для выпуска, оно всегда немедленно объединяется, чтобы синхронизировать dev и release.Мы стараемся не допустить, чтобы выпуски расходились с основной веткой вообще, если это возможно.У нас никогда не бывает более одной активной ветки релиза за один раз.
  • Когда разрабатываются небольшие функции или когда функции можно разрабатывать, не становясь «включенными» в приложении или иным образом влияя на стабильность кода, мы продолжаемразработать код в ветке Dev.Например, мы можем использовать условие #if, чтобы отключить код до тех пор, пока не будет безопасно «активировать» в ежедневных тестовых сборках.Это сводит к минимуму необходимость ветвления.
  • Когда разрабатывается большая функция, которая потенциально может нарушить ветку Dev, мы работаем над отдельной веткой Feature.Мы пытаемся спланировать функцию, чтобы минимизировать время, в течение которого ветвям функции / dev позволено сосуществовать, и, если возможно, прекратить работу разработчиков над смежными областями кода во время разработки функции, чтобы минимизировать проблемы слияния после завершения функции.Если между выпусками разрабатываются возможные функции, чтобы минимизировать перекрытие (число параллельных ветвей).

Наши другие ключевые стратегии:

  • Использовать непрерывную интеграцию,Модульные тесты, регрессионные тесты, закрытые проверки и непрерывное тестирование для обеспечения максимальной стабильности ветки Dev.Наша цель состоит в том, чтобы любая ежедневная сборка «была» достаточно хороша, чтобы доставлять ее непосредственно клиенту.В действительности бывают периодические короткие периоды (несколько дней), когда эта стабильность теряется, но большую часть времени, когда это происходит, мы все еще находимся в течение нескольких дней с выпуском сборки.

  • Отложите создание веток, пока не понадобитсяВ TFS вы можете задним числом создать ветку из любой точки в истории кодовой базы.Поэтому, когда мы готовы запустить ветку релиза, мы фактически не создаем ветку, а просто отправляем текущую сборку релиза в отдел QA для тестирования.Если они довольны качеством этой сборки, она предоставляется покупателям без создания филиала.Только когда нам нужно исправить ошибку для этого релиза, мы фактически создаем ветку (с момента, когда был создан оригинальный релиз-кандидат, поэтому мы знаем, что он начинается с хорошо протестированного кодаснимок) и несут (небольшие) расходы, которые влекут за собой.

В качестве примечания, мы также попробовали ветку Dev с gated checkins для ветки QA с gated checkins для ветки Release, но это работало плохо (в первую очередь мы обнаружили, что это добавило значительные издержки ко всей разработке. Нам нравится проверятьчасто, и два дополнительных шага тестирования и слияния для каждой регистрации дороги. В худших случаях, если вы удаляете, перемещаете или переименовываете файлы в TFS, это становится очень ненадежным, и даже простые слияния заканчиваются неудачей - это трудно и занимает много времени для сортировкиМы решили, что объединение в TFS все еще не является легким и достаточно надежным для поддержки такого подхода, если вы не готовы тратить много времени на управление филиалами. С другой стороны, если разработчики осторожны с их регистрациями,Намного меньше необходимости в таком «строгом» подходе, поэтому мы вернулись к описанному выше легковесному подходу, который увеличивает риски, но сводит к минимуму необходимость объединения - для нас (с небольшой и дисциплинированной / компетентной командой) этот подход работает лучше.

1 голос
/ 11 октября 2011

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

Новый дизайн, как показано ниже (комментарии по-прежнему всегда приветствуются!)

Updated branching design

0 голосов
/ 09 октября 2011

Мои 2 цента ...

Для правильности я бы предложил, чтобы ветвь возможный тип1 сливалась обратно с той же ветвью, откуда она берется, поэтому основной. Говоря о том, не делайте различий между Feature и возможной функцией веткой. Они одинаковые. Функции всегда подвержены задержкам, перераспределению, по любой причине, по которой они не окажутся в запланированном выпуске. Разрешить эту гибкость в принципе для каждой ветки Feature. Поэтому относитесь ко всем функциям одинаково.

Чтобы еще больше упростить вашу модель (и вашу жизнь), подумайте только о наличии основной ветви для разработки и контроля качества. Дополнительные издержки и сложность того и другого не стоят усилий. Развертывание стабильных основных версий в QA с основной линии разработки. Маркируйте отправленные версии.

Так что моя (личная) модель будет иметь основную ветвь разработки. Большие сложные функции помещены в их собственную ветку. Они могут оказаться в выпуске, они могут перейти к следующему, не беспокойтесь. Регулярно объединяйте основные элементы с ветвями функций, чтобы синхронизировать их. Хорошо иметь отдельные ветки Release, если у вас есть несколько версий в поле, которые вам необходимо поддерживать некоторое время. Запустите ветку Release перед этапами стабилизации, альфы и беты. Вы можете рассмотреть возможность развертывания в QA как часть этих веток Release.

...