стратегии пакетов и версий в среде с несколькими хранилищами

13

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

У каждой команды есть мастер ветвь, где они занимаются повседневной разработкой. Члены группы обеспечения качества хотят, чтобы артефакты от изменений их команды были развернуты на испытательном стенде, где все компоненты объединяются шеф-поваром. Артефакты - это архивы, но я бы хотел преобразовать их в RPM, чтобы мы могли правильно продумать и продумать версии.

Процесс выпуска включает в себя отключение ветви выпуска от ветви разработки (в большинстве случаев master) каждого репозитория git. Это затем дается гарантии качества, которые проводят тесты и подписывают набор артефактов.

Например, это типичный git-репозиторий со связанными ветками релиза:

 0-0-0-0-0-0-0-0-0-0 (master)
   |           |
   0           0
 (rel-1)       |
               0
            (rel-2)

Я застрял, пытаясь выяснить схему выполнения версий пакетов из веток разработки. Мы не хотим чрезмерно маркировать основную ветвь каждого репо и ограничивать теги только выпусками ветвей. Но мы должны иметь возможность запрашивать развернутые пакеты на тестовых машинах, используя стандартную семантику yum / rpm. Как будут выглядеть версии для разработки, если в основной ветке нет тегов? Я понимаю, что это git describeможет дать мне полезное представление о версии сборки, но это хорошо работает, когда отмечены различные точки выпуска в ветви.

РЕДАКТИРОВАТЬ1: В ответ на ответ @ Urban48

Я подумал, что должен объяснить наш процесс выпуска немного подробнее. Для целей этого обсуждения давайте предположим, что у нас есть ветка masterво всех репозиториях. masterОтрасль считается веткой разработки и развертыванием на автоматизированный CI-CD включена среда QA. Именно здесь выполняется подмножество ночных тестов для обеспечения стабильности мастера. Мы смотрим на этот список работ, прежде чем вырезать ветку релиза. Наши ветки выпуска недолговечны. Скажем, после вырезания ветки выпуска (из стабильного мастера) выполняется полная регрессия, исправления вносятся и внедряются в производство. Это займет около недели, чтобы сделать. Мы выпускаем почти каждые две недели для производства.

Наши ветви функций всегда вырезаны из master и проходят определенное тестирование разработчиками перед слиянием с master, после чего они проходят проверку стабильности CI-CD.

Исправления производятся в ветвях исправлений (вырезанных из веток релиза) и внедряются с минимальным влиянием тестирования в производство.

Наша стратегия управления версиями для веток релиза и исправления следует принципам semver. Отпустить ветви во ходе цикла QA через версии , как v2.0.0-rc1, v2.0.0-rc2и , наконец , после QA знака-офф стала v2.0.0.

Мы иногда делаем точечные выпуски для небольших функций, которые объединяются, чтобы выпустить ветки (а затем освоить), где становятся версии v2.1.0. И исправления предполагают v2.1.1шаблон.

Вопрос, однако, не в версии этих веток. Я бы предпочел не менять эту схему управления версиями вообще. Единственное изменение происходит для развития отрасли, т.е. мастер. Как я могу надежно указать в среде CI-CD, какая версия существует по сравнению с предыдущим выпуском в производство. В идеале это можно сделать с помощью смарт-тегов git, но предпочтение отдается тому, что не чрезмерно помечает главную ветвь.

чайные ложки
источник
почему бы не добавить -rc. <build_number> в сборки из ветвей разработки, а после выпуска из ветки master / release просто использовать xyz?
Urban48
Что будет предшествовать rcсуффиксу? Это будет диктовать major.minorверсию для разработки. rcи номер сборки может быть получен только на основании этого. Также rcна мастере нет смысла, потому что мы никогда не отпускаем от мастера. Мы помечаем наших кандидатов на выпуск сегодня в ветвях релиза как часть цикла
релизов
я вижу, тогда как насчет того, чтобы не выпускать из нескольких веток, а завершить черчение полных функций в одной ветке релиза, где вы можете использовать теги. Пакеты управления версиями (rpm или deb) станут проще, все, что отсутствует в ветке релиза, будет иметь rcсуффикс.
Urban48

Ответы:

3

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

Я просто сделаю краткое резюме.

  • git-репо для каждого компонента с помощью стратегии ветвления gitflow

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

  • В сборке teamcity добавлена ​​версия с дополнительным руководством вручную + номер сборки в AssemblyInfo.cs, т. е. 1.1.hotfix.build.

  • teamcity запускает упаковку nuget, используя тот же номер версии для опубликованных библиотек nuget

  • осьминог развертывает готовую сборку в qa для ручного тестирования (при условии, что все тесты пройдены)

  • если все хорошо, вручную разверните версию в производство через осьминога.

Теперь это означает, что вы получите много версионных пакетов. Мы поэкспериментировали с использованием флага -prerelease, но для этого потребовался дальнейший перенос пакета вручную с пре-релиза на «нормальный» шаг и требование перестроения компонентов, которые зависели от них.

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

Тогда вы находитесь в ситуации «хм, какие версии я хочу», а не «о боже, какую версию я получил?»

Редактировать: повторные комментарии.

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

Однако я считаю, что вам необходимо рассмотреть свою стратегию ветвления.

  • не версия функции (или любой dev) ветки.
  • сделать мастер версии
  • использовать только пакеты от мастера
Ewan
источник
1
В прошлом я много раз изучал git-flow и, к сожалению, не смог его протолкнуть. Изменение стратегии ветвления и любых рабочих процессов разработчиков Git - сложная задача. Мы хотим изменить стратегию управления версиями, чтобы цифры имели смысл при развертывании на стадии разработки, тестирования и производства.
ЦПС
Кроме того, сегодня у нас есть версии в ветках разработки. Просто мы должны пометить каждый коммит, иногда дважды для версии таким образом. Я хотел бы предоставить более четкое представление о разработке, указав, что текущая версия v next+ buildsпохожа на то, какgit describe
tsps
ну, вы все еще можете построить, и версия фиксирует мастер. они даже не используют функциональные ветви?
Эван
если вы не хотите, чтобы мастер версии. затем вы должны вручную обновить минорную версию в ветке релиза. что означает ручную настройку ваших сборок каждый раз, когда вы делаете новый выпуск,
Ewan
Функциональные ветки существуют, и мне нужно применять версии к ним тоже. Не против добавления тегов / версий на мастер, просто это делается чрезмерно сегодня. Любая стратегия, которая указывает на точку, в которой я могу пометить основную ветку и указать, что это версия для разработки, а не версии в ветках выпуска, полезна
tsps
1

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

Сначала немного философии ..
(Я делаю несколько предположений о вашем рабочем процессе, пожалуйста, поправьте меня, если я ошибаюсь)

  1. Тесты проводятся задним числом :

    Разветвитесь, maserчтобы перейти к функции, затем превратите ее в артефакт для тестирования QA.
    проблема в том, что если тесты не пройдены, masterвозможно, они сломаны!

    побочные эффекты:

    • Это заставляет разработчиков не доверять master

    • Так как вы переходите от главного к выпускному, что произойдет, если предыдущий выпуск будет поврежден? он останавливает интеграцию вашей новой функции, пока мастер не будет снова зафиксирован.

    • Когда ошибка исправлена ​​в ветке релиза, объединение masterможет привести к конфликтам слияния. (а нам не нравятся конфликты)

  2. Небольшой код сливается и исправляется :

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

    побочные эффекты:

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

    • Должен ли я версия этого нового небольшого исправления, а?

    • В любой момент времени не ясно, в каком состоянии находится masterветвь, и какой код там находится

    • что-то сломало сборку, что не является частью новой функции. и его действительно трудно отследить, откуда он

Моя идея для рабочего процесса Git заключается в следующем:

введите описание изображения здесь

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

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

Вы можете продолжать создавать артефакты из этих ветвей функций для обеспечения качества.
Если все в порядке, объедините эту функцию masterи вставьте эту функцию / bug-fix / hot-fix в ветку релиза.


Управление версиями версии веток может использовать некоторые соглашения об именах, такие как1.2.3-rc.12345

версии в releaseветке будут использовать только 1.2.3 ( 1.2.3> 1.2.3-rc.12345и еще одну вещь, о которой нужно беспокоиться)

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

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

PS:
я прошу прощения за мой английский, это не мой основной язык.

Urban48
источник
Спасибо за ваш подробный ответ. Я отвечу в исходном сообщении как РЕДАКТИРОВАТЬ, так как панель комментариев не позволяет достаточно текста.
tsps
0

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

На ум приходят две идеи:

  1. Вы рассматриваете ветвь "master" как то, что мы обычно имеем в ветке "development". Это сильно загрязняет ветку сообщений.

  2. Когда QA закончит свою работу, у вас может быть сервер build / CI для создания отчета (например, текстового файла) с тегами всех используемых репозиториев. Теперь у вас будет файл с версиями, которые можно разместить в репо. Затем вы помечаете ветку только версией выпуска, и если вы хотите проверить версии отдельных компонентов, вы можете проверить отчет.

Джон Кураклис
источник