SVN продвигает изменения для тестирования и производства

Итак, я реализую репозиторий SVN для отслеживания разработки проекта Dot Net. Я определил каталог репозитория в соответствии со следующей структурой:

\project  
   \trunk  
   \branches  
      \systest  
      \production
   \tags  
      \production_yyyymmdd

Основная разработка связана с основной частью проекта, а разработка выполняется на основе запросов на изменение (CR) от клиента. На данный момент я рад исключить проблему перекрывающихся CR (т.е. файл, который изменяется больше, чем на CR). Моя проблема заключается в том, как управлять процессом переноса только изменений файлов, связанных с одним CR, из магистрали в systest и из systest в рабочую среду. Процесс продвижения на данный момент у меня такой (в качестве примера возьмем переход с systest на prod):

  1. Создайте тег «production_yyyymmdd» на основе текущей производственной ветки (это используется для получения определенной «версии», если хотите)
  2. «Обновление» из рабочей среды в локальное место «миграции» (например, C:\Build\ProjectName)
  3. «Объединить» выбранные меняются с «systest» на локальную «миграцию»
  4. «Зафиксировать» изменения обратно в производство

У меня проблема с шагом 3. Как сообщить SVN, какие файлы нужно объединить в место миграции. Я не хочу объединять все изменения из systest в prod (и я, возможно, даже не хочу объединять все изменения в конкретной версии из systest в prod), а только изменения в определенных файлах.

Изменить: я также должен уточнить, что весь доступ к репозиторию осуществляется из клиента Windows. Я не запускаю команды на сервере SVN. (Ради интереса сервер SVN работает на Linux, но я считаю, что это не имеет значения для проблемного пространства)

С уважением
Ричард


person plancake    schedule 02.07.2009    source источник


Ответы (3)


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

Что касается отслеживания вещей, самый простой ответ, который у меня есть, — это обеспечить соблюдение определенной дисциплины разработчика, то есть включать только 1 CR на каждый коммит.

В Tortoise есть поддержка свойств bugtraq, которые могут вам здесь помочь гарантируя, что каждый комментарий к коммиту включает по крайней мере один номер CR - это может быть полезной подсказкой, чтобы сообщить разработчикам, что если они включают > 1 номер отслеживания для коммита, то они, вероятно, делают это неправильно (если только одно исправление действительно не делает несколько вещей).

Таким образом, это позволит вам объединиться из транка в системный тест только с нужными вам CR. Вы даже можете использовать пользовательский интерфейс слияния черепахи, чтобы увидеть, какие ревизии в магистрали еще не были объединены в системный тест. Но, конечно же, теперь вы захотите перейти от системного тестирования к производству с аналогичной степенью детализации — вот о чем вопрос.

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

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

Итак, чтобы внести ясность, вы продвигаете ревизию из магистрали в systemtest, тестируете ее, затем, если все в порядке, продвигаете ревизию из магистрали в рабочую среду (возможно, вам придется снова запустить чистую производственную ветку).

Вы должны быть в состоянии написать несколько инструментов, которые используют mergeinfo для подтверждения того, какие версии находятся в системном тесте, а какие нет в рабочей среде. И, используя свойства bugtraq, вы также должны быть в состоянии сказать, какие CR полностью объединены в ту или иную ветку, а у каких еще есть ревизии.

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

Однако имейте в виду, что при этом существует очень реальный риск дрейфа кода между системным тестированием и производством. Я бы рекомендовал регулярно проводить различия между ветвями и следить за тем, чтобы вы могли учитывать все различия. Если две ветки имеют одни и те же ревизии, объединенные из основной ветки, они должны быть идентичными, любые различия должны быть связаны с ревизиями в тесте, которые еще не запущены в производство, и, конечно же, в рабочей среде никогда не должно быть ревизий, которые не в тесте.

person Jim T    schedule 02.07.2009
comment
Хм, это приближается, я думаю. Однако у меня все еще есть проблема, если мне нужно продвигать 1 CR для тестирования, но не другой. Если в магистрали зафиксировано 2 CR (предположим, что CR НЕ ссылаются на одни и те же файлы — если они ссылаются, тогда дело «все или ничего»), и я хочу продвигать 2-й, но не первый, мне нужен способ примените к systest только различия между магистральными линиями r:CR1 и r:CR2. Мне также нравится концепция продвижения изменений от dev к prod, но мне нужно подумать об этом подробнее. Спасибо за ваш вклад, Джим. - person plancake; 03.07.2009

Вот классная библиотека/инструмент, который мы используем: Savana. Для каждого тикета разработчик создаст ветку с помощью Savana и, когда она будет готова, вернет эту пользовательскую ветку в магистраль. Аналогичный подход может решить проблему, которую вы представили: вы создаете ветку для любой заданной задачи и объединяете ее обратно с вашим основным магистральным путем, когда придет время.

person joeslice    schedule 02.07.2009
comment
Я предполагаю, что ваш ствол является базой производственного кода, из которого вы строите. У вас есть аналогичный процесс для тестирования? Из какой базы кода вы строите для тестирования? багажник? - person plancake; 02.07.2009
comment
Просто комментарий (на самом деле не критика - хорошо, ну, вроде так)... моя проблема связана не с разветвлением путей разработки, а с управлением отдельными тестовыми и производственными базами кода для развертывания в тестовых и производственных средах. - person plancake; 02.07.2009

«Нормальный» процесс (то есть тот, которому следует мой магазин) заключается в создании ветки релиза и копии тега для каждого релиза продукта. Любые критические проблемы, возникающие в рабочей среде, исправляются в рабочей ветке, объединяются обратно в основную ветку, продукт перевыпускается и создается новая копия тега.

Между тем, некритические проблемы разрабатываются в отношении магистрали и объединяются в периодический выпуск. Повторный выпуск после завершения каждой некритической проблемы (CR в вашем случае) не является стандартной практикой.

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

Вы также можете рассмотреть возможность сокращения цикла выпуска. Частые выпуски уменьшают необходимость внесения изменений в выпущенный код. Бизнес часто может ждать 6-8 недель для внедрения изменений, но не 6-8 месяцев.

person Jamie Ide    schedule 02.07.2009
comment
Спасибо, Джейми. Во-первых, наш цикл релизов обычно довольно быстрый... 2-3 недели между релизами... Во-вторых, это обычно устаревшие системы с достаточно стабильной кодовой базой, которая существенно не улучшается, поэтому накладные расходы на создание релиза ветвь для следующей версии немного излишняя (для нас)... обычно не происходит параллельной разработки основных функций с небольшими CR и исправлениями ошибок (большая часть того, что мы делаем, это просто небольшие CR и исправления ошибок), поэтому кодирование для ствола нормально нормально. Я также пытаюсь автоматизировать это, чтобы упростить нашим разработчикам. Спасибо за ваши предложения. - person plancake; 02.07.2009
comment
Если вы делаете 2-3-недельные циклы выпуска, то мне трудно увидеть необходимость продвигать выпуски с таким уровнем детализации. Кроме того, релизная ветвь не подразумевает параллельной разработки — разработка выполняется против релизной ветки для критических проблем, которые не могут ждать до следующего запланированного релиза. Для большинства выпусков ветвь выпуска никогда не затрагивается. - person Jamie Ide; 02.07.2009