Стратегии управления исходным кодом - разветвление, тегирование, разветвление и т. Д. - для веб-приложений - PullRequest
2 голосов
/ 01 октября 2008

Эта публикация здесь ( Как вы управляете ревизиями базы данных в проекте среднего размера с филиалами? ) заставила меня задуматься, как лучше всего работать над веб-проектом с использованием ветвления и развертывания в dev, staging и production (вместе с локальными копиями).

У нас нет «выпусков» как таковых: если функция достаточно велика, чтобы ее можно было заметить, мы запускаем ее (после необходимого тестирования и т. Д.), В противном случае мы собираем несколько версий и, когда она чувствует себя «комфортно» ", дави вживую. Цель состоит в том, чтобы никогда не использовать развертывание более одного или двух раз в месяц или около того, потому что постоянно меняющийся сайт приводит к тому, что пользователям становится немного неловко.

Вот как мы это делаем, и это кажется хрупким (в настоящее время используется svn, но с учетом перехода на git):

  1. Две "ветви" - DEV и STAGE с заданным выпуском STAGE, помеченным как TRUNK
    • Разработчик проверяет копию TRUNK для каждого изменения и создает для него ветку
    • Разработчик работает локально, часто проверяя код (как голосование: рано и часто)
    • Когда разработчику будет удобно, он не сломан полностью, объедините ветку с DEV и разверните его на сайте разработки.
    • Повторяйте 3-4 по мере необходимости, пока изменение не будет «закончено»
    • Объединить ветку изменений с STAGING, развернуть на этапе сайта. Ожидаемое финальное тестирование.
    • Через некоторое время пометьте данную ревизию STAGE как TRUNK и активируйте транк
    • Объединить TRUNK обратно обратно в DEV, чтобы сохранить его в синхронизации

Теперь некоторые из этих шагов имеют значительную сложность, и их очень сложно выполнить на практике (TRUNK -> DEV всегда ломается), поэтому я должен представить, что есть лучший способ.

Мысли

Ответы [ 4 ]

2 голосов
/ 01 октября 2008

Ветвление удобно, если вы ожидаете, что работа НЕ будет выполнена вовремя, и у вас нет достаточного количества тестов для непрерывной интеграции. Я склонен видеть сумасшедшие разработки в магазинах, где задачи программирования слишком велики, чтобы их можно было предсказуемо выполнить, и поэтому руководство хочет дождаться выпуска, чтобы определить, какие функции должны поставляться. Если вы выполняете такую ​​работу, то вы можете рассмотреть возможность использования распределенного управления версиями, где КАЖДЫЙ рабочий каталог является ветвью естественным образом, и вы получаете всю локальную регистрацию и локальную историю, которую вы можете съесть, не причинив никому вреда. Вы можете даже объединиться с другими разработчиками вне ствола.

Я предпочитаю, когда мы работаем в нестабильной магистрали с ветвями для кандидатов на освобождение, которые затем помечаются для выпуска и которые затем становятся потоком для аварийных исправлений. В такой системе у вас очень редко бывает больше трех ветвей (последний выпуск, кандидат на текущий выпуск, нестабильная магистраль). Это работает, если вы делаете TDD и имеете CI на нестабильной магистрали. И если вам требуется разбить все задачи, чтобы вы могли доставлять код так часто, как вам хочется (обычно задача должна занимать всего один-два дня и выполнимо без всех других задач, составляющих ее функцию). Таким образом, программисты берут работу, проверяют транк, выполняют работу, синхронизируют и проверяют в любое время все тесты. Нестабильная магистраль всегда доступна для ветвления в качестве кандидата на выпуск (если все тесты пройдены), и поэтому выпуск становится нештатным.

В целом, лучше означает: меньше веток, более короткие задачи, более короткое время выпуска, больше тестов.

1 голос
/ 16 апреля 2009
1 голос
/ 01 октября 2008

Очевидной мыслью было бы больше «перебазировать» (чаще сливаться обратно из «родительской» среды STAGE в «дочернюю» среду «DEV» в ветку разработчика), чтобы минимизировать конечное влияние TRUNK-> DEV, что больше не нужны.

Т.е. все, что сделано в STAGE, которое должно быть запущено в производство за один раз (TRUNK), должно быть объединено как можно раньше в DEV и ветке приватных разработчиков, в противном случае такие поздние слияния всегда приводят к боли. *

НО, если вышеуказанный рабочий процесс слияния слишком неудобен, я бы предложил ветку REBASE, основанную на последнем DEV сразу после выпуска (новый TRUNK). Перебазировка TRUNK-> DEV станет TRUNK-> REBASE, где все проблемы будут решены, а затем завершит слияние DEV-> REBASE, чтобы проверить, совместим ли любой текущий dev с новой обновленной системой. Окончательное тривиальное слияние с REBASE к DEV (и частным ветвям разработчиков) завершит процесс.
Задача ветви - изолировать усилия по разработке, которые нельзя проводить вместе с другими текущими разработками. Если TRUNK-> DEV слишком сложен, чтобы соответствовать текущим DEV, его необходимо изолировать. Отсюда и ветвление «REBASE».

0 голосов
/ 01 октября 2008

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

Для нас ВСЕ разработки происходят в ветке. Мы разветвляем для каждой ошибки и каждой функции. В идеале, эта ветвь посвящена ТОЛЬКО 1 функции, но иногда это просто не так.

Когда работа завершена, проверена и «готова», мы объединяем изменения в ствол. Наше правило состоит в том, что ни в коем случае в транке не должно быть поврежденного кода. Если сломанный код должен попасть в магистраль, исправление становится приоритетом 1.

Релизы создаются после того, как все функции завершены и объединены: ветвь для релиза создается как тег. Тэг позволяет нам извлекать shapshot, если нам нужно. Ветка позволяет нам поддерживать нашу предыдущую версию. Исправление ошибок в выпущенной версии выполняется путем перехода в ветку этого выпуска, ответвления от нее. Когда все в порядке, изменения объединяются обратно с веткой релиза и, при желании, вплоть до транка.

...