Стратегии развертывания SVN для нескольких групп разработчиков (не совмещенных), работающих над различными компонентами одного и того же проекта - PullRequest
5 голосов
/ 23 сентября 2010

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

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

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

В попытке исправить это, мы создали отдельный ствол, используемый строго для релизов. Люди будут работать в главном стволе, а затем попросить менеджера проекта или руководителя разработки объединить свои изменения в выпуске.

Это работало некоторое время, пока команда не стала еще больше и более разобщенной. У нас есть команды из 3-5 человек, работающих в 4 географических точках - одни на одних и тех же компонентах, другие на разных компонентах с разными приоритетами и графиками выпуска. Это была в основном работа на полный рабочий день и стала кошмаром для человека, управляющего сборками.

Пытаясь обойти это, мы начали создавать «ветки релиза», независимо от того, какой был последний тег Production. Люди обязуются делать ТОЛЬКО то, что готово для тестирования, и отправляются в производство. Другие будут брать на себя обязательства, пока не настанет их очередь сливаться. Это взяло на себя бремя слияния и разрешения конфликтов от менеджера сборки и до человека, владеющего кодом.

Это работало в течение недели, пока нам не пришлось делать несколько «высокоприоритетных» релизов. Это фактически означало, что мы будем:

  1. Создать ветку с последней меткой производства
  2. Добавить аварийный материал в эту ветку
  3. Отметьте эту ветку и выпустите в Production
  4. Объедините все изменения, которые были внесены в эту ветку, в обычную «ветку релиза», которая находится в QA.

Это каждый день. Иногда два раза в день.

Я пытался связать это немного с проектом с открытым исходным кодом, где повсюду есть разработчики, которые даже не знают друг друга, и им все еще кажется, что ... но это сравнение не работает стабильные, проверенные, достойные производства сборки ожидаются для «общественного» потребления несколько раз в неделю (или день). Например, если ежедневная сборка Firefox содержит ошибки, по крайней мере, пользователи могут вернуться к предыдущей версии или использовать последнюю стабильную версию. Это не так для наших пользователей. Если наш релиз не идеален, они не могут работать.

История завершена, теперь я задаю вопрос:

Учитывая среду, в которой ...

  1. Разработчики повсюду и работают над различными компонентами.
  2. Изменения в некоторых компонентах могут ждать неделю до выпуска, другие не могут ждать даже дня.
  3. Приложение является критически важным, и изменения должны быть проверены и стабильны перед выпуском.

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

Ответы [ 2 ]

7 голосов
/ 29 сентября 2010

Комбинированные ветви обслуживания и выпуска

Я думаю, что у вас такие же требования, как и у наших людей. КИ поможет вам автоматизировать, но не решит основную организационную проблему.

Итак, у вас есть 2 типа чеков:

  • обычный несрочный код (планируется выпускать время от времени)
  • код срочного «исправления» (происходит после выпуска, если что-то проскальзывает без достаточного тестирования или когда клиент Х звонит, потому что он хотел, чтобы кнопка розового цвета не была фиолетовой, и он угрожает расторгнуть контракт: P)

Оба случая различны, и вы должны разделить их. Я думаю, ваш подход уже близок к ответу, но вы делаете «слишком много» * ​​1015 *

Позвольте мне описать вам, что мы делаем:

Структура репозитория

trunk (is our project with components and all)
branches
|
-- 1.0-stable-week-40
|
-- 2.0-stable-week-42
|
-- 3.0-stable-week-44
tags
|
-- 1.0.0
|
-- 1.0.1
|
-- 1.0.2
|
-- 2.0.0
|
-- 2.0.1
|
-- 3.0.0

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

Жизненный цикл выпуска (обобщенно)

После новой версии мы поддерживаем ветвь (например, 1.0) до выхода следующей основной версии. Наша политика заключается в том, что в это время в эту ветку могут быть включены ТОЛЬКО критические исправления. Они проходят только минимальное тестирование и могут быть выпущены в считанные минуты, создав новый тег из нашей ветки обслуживания.

В середине периода обслуживания (1 неделя после выпуска) мы создаем новую ветку из нашего ствола под названием "2.0". Все не так срочно, разработка уже в багажнике будет в этом выпуске автоматически. Другие вещи могут быть добавлены «осторожно», например срочные исправления, которые поступают из текущей активной ветки обслуживания (объединение от 1.0 до 2.0 в транк).

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

Таким образом, мы можем отделить срочные от несрочных изменений и получить относительно безболезненные и стабильные релизы. То, что вы делаете, в значительной степени то же самое, но вы переходите от тега, который, когда вы закончите, снова тегирует. Это немного много :). Ответвление от тегов - это тоже плохой стиль. ветка из веток.


stable branches for release & maintenance

политики филиалов

Это помогает команде, если вы записываете политику для каждого из ваших типов филиалов, позволяя им делать больше самостоятельно, без того, чтобы парень-релизчик постоянно сидел у них на шее и заманивал их коммитами;)

Наши правила можно описать так:

  • Ствол:

    • нет коммитов с синтаксическими ошибками
    • получает слияния от обслуживания
    • прямых выпусков из этой ветки нет
  • филиалы / x.x стабильный * +1064 *

    • может получать только срочные исправления
    • должен быть всегда готов к выпуску
    • разработчик ДОЛЖЕН объединить свой коммит отсюда с любой более молодой стабильной веткой
    • Если нет более молодой стабильной ветки, объединить со стволом
  • / теги *

    • Нет коммитов здесь
    • используется для развертывания

Слияние становится менее тренировкой ума, когда вы пытаетесь слиться только в одно «направление». (Вы могли бы хотеть Google для масштаба тофу, но это становится немного ОТ теперь). Следите за тем, чтобы слияния выполнялись разработчиками постоянно, а не менеджерами релизов, чтобы ограничить узкое место. В то время как один выпуск является активным и активно поддерживается получение исправлений, мы уже начинаем готовить следующий, изолируя его от возможных нестабильных изменений в стволе и давая время «созревать».

У вас могут быть разные требования к продолжительности инкубации кода и тестирования или продолжительности итерации выпуска, конечно. Адаптировать:)

1 голос
/ 23 сентября 2010

Я большой поклонник непрерывной интеграции наряду с разработкой на основе тестирования.

Вот несколько ссылок, которые я бы порекомендовал проверить:

...