Всем доброго дня!
Наша компания занимается разработкой ПО для госсектора и постоянно сертифицирует свои программы для обработки гос. тайны. А это накладывает определенные ограничения и самое главное из них: мы должны предоставить все исходные коды нашего проекта и если попросят - суметь объяснить, что делает каждая строчка. Проблема в том, что если используешь готовые компоненты, то их исходники тоже нужно предоставлять и уметь все про них рассказать. Поэтому мы решили сделать свой фреймворк, ведь про него мы будем знать все. Фреймворк мы сделали и назвали его "Platform". Он продолжает развиваться и все свои проекты мы делаем на нем. Проблема заключается в том что, после выпуска продукта и его сдачи мы вынуждены его замораживать и не можем в него вносить больших изменений - только исправлять баги, а большинство багов обнаруживается как раз в самом фреймворке и в результате мы вынуждены иметь версии фреймворка для каждого сданного проекта (ну, или для группы одновременно выпущенных продуктов). В итоге, нам пришлось придумать свой набор правил и схему ветвления в GIT для разработки Platform. Схема приведена ниже вместе с примером работы по ней:
Общие правила ветвления проектов:
1. Введены следующие понятия:
a. Мажорная версия программы – версия программы в рамках определенной концепции, меняется при значительных изменениях концепции, обозначается v-m, где m – номер мажорной версии;
b. Минорная версия программы – подверсия в рамках одной концепции, меняется при добавлении нового функционала или незначительной переделке существующего, обозначается v-m-n, где m – номер мажорной версии, n – номер минорной версии;
c. Релиз программы – вариант минорной версии, номер релиза меняется при незначительных изменениях и/или исправлении багов в соответствующей минорной версии программы, обозначается r-m-n-p, где m – номер мажорной версии, n – номер минорной версии, p – номер патча;
2. Разработка нового функционала ведётся в ветке master. Ветка master защищённая, для помещения изменений в неё разработчиками выполняется merge-request. Решение по принятию merge-request принимает технолог на основании просмотра исходного кода вносимых изменений (code review).
3. Для каждой мажорной версии создается ветка разработки нового (дополнительного функционала). Для текущей мажорной версии это ветка master, для прошлых мажорных версий ветки разработки называются по шаблону: dev-v-m, где m – номер мажорной версии. Работа с этой веткой аналогична работе с веткой master. Для каждой ветки dev-v-m создается своя база данных и именуется по шаблону project_name_dev_v_m. Ветка разработки для мажорной версии создается сразу после начала работы над следующей мажорной версии.
4. Каждая задача – это новая тематическая ветка, которую должен создать разработчик перед началом выполнения задачи. Ветки создаются на основании текущего коммита ветки в которой должна быть выполнена задача. Ветки именуются по шаблонам:
a. t-xxxxx, если это задача на разработку нового функционала (xxxxx – номер задачи из корпоративной системы)
b. b-xxxxx, если это задача по исправлению бага (xxxxx – номер задачи из корпоративной системы).
5. После выполнения задачи и помещения коммитов тематической ветки в ветку, для которой выполнялась задача, разработчик удаляет тематическую ветку.
6. При постановке задачи на исправление бага нужно указывать минорную версию, в которую нужно вносить изменения, например, в версию v-1-1 (если ничего не указано, то баг исправляется в тестируемой на данный момент минорной версии). При исправлении бага в ветке master, главный технолог должен принимать решение о необходимости включения этого исправления в ветку с актуальной версией. Задачи по добавлению функционала предполагают помещение их в ветку master по умолчанию, иначе должна быть указана конкретная ветка (ветки) разработки прошлой мажорной версии.
7. Периодически (по мере реализации функционала) формируются минорные версии. Каждая минорная версия – это отдельная ветка. Ветка минорной версии обозначается по шаблону v-m-n, где m – мажорный номер версии, n – минорный номер версии. В рамках версий формируются релизы. Релизы формируются тогда, когда исправлены все обнаруженные баги в тестируемой минорной версии. Релиз обозначается тегом формата r-m-n-p, где m – мажорный номер версии, n – минорный номер версии, p – номер патча (патч выпускается только для исправления багов). После создания ветки минорной версии в ней правятся только баги. Ветка минорной версии создается главным технологом в момент окончания разработки функционала версии, но до начала основного тестирования. При формировании минорной ветки, нужно дополнять в проекте файл с изменениями в этой версии по отношению к предыдущей.
8. После формирования релизного тега, ветка минорной версии должна быть слита с основной веткой разработки.
9. После выпуска релиза следующей минорной версии, поддержка предыдущей минорной версии прекращается.
10. В начале работы над проектом нет смысла в создании минорной версии, в которой исправляются только баги, т.к. данная версия не предоставляется внешнему заказчику. Поэтому до формирования первой минорной версии тестирование происходит на базе ветки master и баги исправляются в ней же. На более поздних этапах проекта, когда еще нет необходимости передавать версии, но уже появилась потребность проводить демонстрации можно начать создавать минорные версии, но в этом режиме обнаруженные и исправленные в минорной версии баги должны обязательно исправляться и в ветке разработки (минорная ветка должна сливаться с веткой разработки). При этом демонстрации всегда выполняются на текущем релизе с протестированным функционалом, а не на последних разработках.
11. Небольшую доработку функционала можно вносить в ветки минорной версии, но это только в крайних случаях.
12. Коммиты именуются по следующему правилу: t-#####-taskname или b-#####-bugname.
![](https://habrastorage.org/getpro/habr/upload_files/f2f/ef8/147/f2fef8147d936ae79ebe2a18aabd373d.png)
На рисунке представлен пример стратегии ветвления для условного проекта, который отражает вышеизложенные правила. Рассмотрим пример подробно:
Проект начался с 01.01.17 с создания нового репозитория и инициирующего коммита C1 в ветке master. Ветка master предназначена для основного процесса разработки и добавления нового функционала. Ветка мастер защищенная и никто, кроме главного технолога или его заместителя (далее под главным технологом так же подразумевается и его заместитель) не имеет права вносить в неё изменения. Для получения первого релиза было запланировано добавить функционал, описанный в задача 1 и 2 в корпоративной системе. Для реализации каждой из задач на основании коммита C1 разработчиками были созданы ветки и названы в соответствии с соглашением о наименовании (t-####) t-1 и t-2. В рамках данных веток были сделаны коммиты (например, в ветке t-1 t-1-C1 и t-1-C2). После создания функционала в своих ветках разработчики хорошо его протестировали самостоятельно, потому что они профессионалы и хорошие люди и им не наплевать на то, что они делают и на остальной коллектив. После этого разработчики выполняют merge request для своих веток, т.е. сигнализируют технологу, что они закончили свою работу и хотят, чтобы их код был внесен в основную ветку разработки. Главный технолог отправляет задачу на code review (поручает это другому программисту или производит самостоятельно). Если код не устраивает, то merge request отклоняется, и программист переделывает работу. Если код успешно проходит стадию code review, то главный технолог принимает merge request и в ветке мастер появляются коммиты C2 и С3. После появления этих коммитов в ветке master задачи начали тестировать тестировщики и аналитики ответственные за за задачу. Если были обнаружены ошибки, то задачи возвращаются на переделку, если нет, то задача закрывается в корпоративной системе.
08.01.17 был готов функционал для версии 1-0 и главный технолог принял решение о создании релизной ветки v-1-0. Релизную ветку v-1-0 начала тестировать команда релизного тестирования. Для ветки v-1-0 создается отдельная база. Команда тестироания обнаружила ряд багов и поставила задачи в корпоративной системе. На основании этих задач были созданы ветки b-1 и b-3 и после исправления багов разработчики сделали merge request’ы в ветку v-1-0. Далее повторяются шаги, описанные выше по обработке merge request и ветке v-1-0 появляются коммиты v-1-0-C1, v-1-0-C2 и v-1-0-C3. Отметим, что в релизной ветке не добавляется новый функционал, а только исправляются ошибки.
Параллельно в ветке master начали разработку нового функционала, который должен войти в версию v-1-1. Далее в ветке master на рис.1 не отражаются ветки задач для добавления функционала, чтобы не засорять схему, коммиты при этом все равно показаны. Обратим внимание, что после коммита C4, был обнаружен баг b-2 и по результатам его исправления разработчик сделал merge-request и в master и в текущую релизную ветку v-1-0, т.к. этот баг встречается в обеих ветках.
01.02.17 релизная ветка v-1-0, была протестирована командой релизного тестирования и главный технолог принял решение, что можно выпустить первый релиз проекта. Был сформирован тег r-1-0-1. И дистрибутив был передан заказчику. Главный технолог принял решения слить ветку v-1-0 с релизной веткой, т.к. баги, которые были в ней исправлены встречаются и в ветке master.
В процессе использования релиза к-1-0-1 заказчик выявил баг b-3 и он был исправлен в ветке v-1-0 и 08.02.17 было выпущено обновление-патч и сформирован тег r-1-0-2. В этот же момент главный технолог принял решение, что функционал для версии v-1-1 наработан и создал следующую релизную ветку v-1-1. В ветке master команда разработчиков начала разрабатывать функционал для мажорного релиза v-2-0. Поддержка ветки v-1-0, продолжалась до момента выпуска нового релиза версии v-1-1. При этом баг b-4, исправленный в ветке v-1-0 главный технолог решил не помещать в ветку master, т.к. в ней он оказался не актуален, в связи с переделкой модуля, в котором встречался.
04.03.17 командой разработки был выпущен релиз версии r-1-1-1. Одновременно с этим руководство приняло решение сменить основную версию продукта с 1 на 2. Поскольку необходимость добавлять функционал в версию v-1 может остаться, то была создана отдельная ветка разработки (dev-v-1) для первой версии (для нее была создана отдельная база данных). Ветка dev-v-1 является аналогом ветки master, но для версии v-1. При этом поддержка версии v-1-0, была прекращена, т.к. ей на смену пришла версия v-1-1.
15.03.17 был накоплен функционал для v-2-0 и была создана ветка v-2-0.
18.03.17 был накоплен функционал для выпуска нового релиза версии v-1 и была создана релизная ветка v-1-2.
01.04.17 были выпущены релизы версии v-1 (r-1-2-1) и версии v-2 (r-2-0-1). В этот момент также была прекращена поддержка v-1-1, т.к. ей на смену пришла версия v-1-2.