Стратегия модели ветвления Git
Мы пытаемся следовать модели ветвления gitflow , но с изюминкой.
У нас есть четыре серверных среды, где продукт может быть развернут, каждый сервер служит определенной цели: разработка, внутреннее тестирование, внешнее тестирование и производство.
- DevServer , где разработчики тестируют свои различные функции во время разработки. Разработчики не могут тестировать локально на своих машинах, они должны внести свои изменения на DevServer, чтобы иметь возможность тест
- TestServer , где тестировщики QA тестируют несколько функций после того, как разработчики закончили
- ReleaseServer , где релизы тестируются изолированно перед их перемещением в производство
- ProductionServer . Производственный сервер
Мы стараемся сделать слияние / разрешение конфликтов как можно более простым, поэтому мы создали две дополнительные ветви, которые не являются частью модели gitflow.
Нормальный gitflow ветви
- развивать
- master (соответствует 'ProductionServer')
- featureXXX
- releaseXXX (еженедельные релизы развертываются на 'ReleaseServer')
Но также и эти две ветви, которые не являются стандартными и могут нуждаться в изменении...
- dev-release (копия DevServer)
- test-release (копия TestServer)
Тогда процесс происходит следующим образом:
- разработчик создает свои "featureXXX" из "Development" Несколько разработчиков объединяют свои различные "функции" в ветвь "dev-release", и ветвь "dev-release" выпускается на "DevServer", где все разработчики могут затем протестировать свои различные функции. Не все эти функции будут в том же следующем выпуске
- Как только разработчики довольны своим тестированием dev выше, они объединяют свой "featureXXX" в ветку "test-release", и это развертывается в "Тестсервер". Не все функции здесь будут частью того же самого следующего выпуска.
- Как только тестирование на' TestServer 'будет выполнено для featureXXX, разработчик может закрыть свой featureXXX в 'Development'. Затем разработчик либо создает новый "releaseXXX", либо объединяет их "featureXXX" в существующий "releaseXXX".
- ветвь releaseXXX развертывается на сервере ReleaseServer и тестируется.
- Как только тестирование releaseXXX завершается, releaseXXX объединяется в Development и master, и развернут в "ProductionServer"
Мы испортили всю модель gitflow?
2 ответа:
Чтобы ответить на ваш вопрос, нет, вы не путаете модель gitflow - больше расширяете ее для удовлетворения ваших потребностей.
Связывая среды с данной ветвью, вы даете себе гораздо больше гибкости, когда речь заходит о создании релизов. например, у вас есть две независящие функции (функция 1 и 2) в процессе выполнения, обе из которых были объединены в ветку "TestServer". Если функция 1 не проходит тестирование, функция 2 все еще может быть продвинута дальше без функции 1 - это потому что ваше слияние в "TestServer" является односторонним слиянием-ничего не выходит, никакой истории. Вместо этого ваша ветвь Feature 2 объединяется в "Development" и, в конечном счете, "master".
Мы находимся в процессе принятия / разработки подобной стратегии для себя. ключевое требование для нас-приспособиться к неизбежному набору черт . Обратите внимание, что наше решение, хотя и довольно сложное, было разработано для корпоративного приложения, служащего платформой для нескольких сервисов принадлежит нескольким владельцам бизнеса и использует несколько внутренних структур..
Окружающая среда
- QA: для разработчиков, чтобы убедиться, что их функция тестируема.
- этап: для менеджеров проектов / тест-менеджеров, чтобы курить-тест до тестирования UAT различными "владельцами бизнеса"
- UAT: для полного тестирования и регистрации бизнеса "владельцами бизнеса"
- бета-версия: просто тест развертывания / выпуска
- жить: ..
Эти среды сгруппированы в две категории: "in-test" (QA, Stage и UAT) и "production" (BETA и LIVE).
Ветви
Приоритеты функций могут часто меняться, начиная от проблем тестирования и заканчивая нормативными ограничениями / запросами. Чтобы приспособить это, создаются несколько ветвей для представления среды / категорий следующим образом:
- Master: представляет собой последнее производство выпуск
- релиз-кандидат: набор функций для следующего выпуска производство выпуск
- UAT: представляет среду UAT
- стадия: представляет "QA" и "стадию"
- Feature-xxx: для разработки функций
Мы также используем ветвь исправлений от Master по мере необходимости и подготавливаем производственные релизы в ветви "Pre-Production" (исправление пропущенных приращений версий и т. д. - незначительные вещи).
Диаграмма используемых нами ветвей:
Ветвление и слияние / рабочий процесс
Мы всегда филиал новые возможности от релиз-кандидата, так как эта ветка всегда содержит, совершенных за особенностей производства. Ничто не перескакивает с места на место, как только обязательство по производству было принято.
Как только функция готова к тестированию, она объединяется (односторонне) в "стадию". Это запускает сборку CI и развертывается в QA.
Если сервер контроля качества выглядит стабильным, разработчик запускает автоматическое развертывание на этапе.
Если требуются изменения, то сделайте их в особенности и повторяют. Если хорошо для бизнес-тестирования, после слияния с особенностью на ЕСХН. Это развертывается в UAT.
Если функция не прошла бизнес-тестирование, внесите изменения в функцию и повторите. Если функция задерживается, то не предпринимайте никаких действий. Если функция в порядке и отключена, то выполните слияние для выпуска кандидата.
Как только набор (1 или более) функций находится в релиз-кандидате, запускайте производственное развертывание путем слияния из релиза-кандидата в мастер (через Пре-Производство).
Сбой развертывания, затем исправление. Если все в порядке, развернитесь, чтобы жить.
Наш рабочий процесс, использующий TFS, выглядит следующим образом:
Рабочий процесс выпуска
И, наконец, каждое развертывание в среде / категории будет выглядеть следующим образом:
Git-это система управления версиями. Он поддерживает исходный код и их изменения. Развитие останавливается на стадии развития. После этого исходный код не должен меняться.
При переходе проекта на следующий этап (тест, релиз, prod) вы не должны предоставлять исходный код, а двоичные файлы, построенные из помеченной версии, потому что:
- исходный код не изменяется в различных средах,
- две сборки могут содержать два разных двоичных файла (изменить на зависимости)
- поддержание различных версий будет затруднено. Например,
- исправление ошибок. Представьте себе, когда новый релиз на тестовом сервере, и вам нужно сделать исправление из производства. Это исправление должно пройти через тот же поток (test, release, prod). Поэтому вам нужно перезаписать тестовую ветку с исправлением ошибки и после слияния вернуться к новой версии релиза. Что не очевидно, не обязательно и может привести к тому, что изначально предполагалось иметь другой код. На самом деле, с каждым слиянием, после разработки, возникает ненужный риск, что исходный код может отличаться от того, что предполагалось. И вы, возможно, потребуется, чтобы решить конфликт слияния в прод.
- A/B тестирование
Таким образом, это может не мешать модели git-потока, но я думаю, что эти моменты заслуживают рассмотрения. На самом деле, я не большой поклонник стратегии gitflow. Если у вас есть минутка, дайте шанс на эту статью, она описывает почему:
Https://barro.github.io/2016/02/a-succesful-git-branching-model-considered-harmful/