Ведение версий
Платформа MyBPM состоит из двух разрабатываемых компонентов:
- MyBPM WEB
- MyBPM API
Каждый из этих компонентов имеет свой репозиторий в корпоративном хранилище. Ведение веток разработки у обоих этих компонентов одинаковое. Имеется следующий набор веток:
dev
- главная ветка разработки.dev-freeze
- ветка фиксации текущего разработанного функционала - этап-альфа тестирования.stage
- стабильная тестовая версия - этап бета-тестирования.release
- ветка стабильных релизов.
Процесс разработки
Вся разработка ведётся на ветке dev
. Тут внедряются все новые функции, тестируются и исправляются ошибки. Мелкие
функции вводятся напрямую, а функции по больше разрабатываются в отдельных ветках, ответвлённых от dev
. После
разработки и локального тестирования, ветки сливается в dev
.
Например: разработчику по имени "Marat" получили сделать новую функцию, которую кратко можно назвать "zoo-to-settings".
Он создаёт копию ветки dev
и называет её:
dev-marat-zoo-to-settings
Далее он разрабатывает эту функцию в этой ветке. В процессе разработки он должен сливать изменения сделанные другими
разработчиками из ветки dev
в свою ветку dev-marat-zoo-to-settings
.
После того как он разработал и протестировал новый функционал в этой ветке он сливает данную ветку в ветку dev
. Если
у него нет доступа на push в ветку dev
, то он делает запрос на слияние merge-request
. Обращается к старшему
разработчику с целью проверки разработки, и, если всё нормально, старший разработчик применяет merge-request
и новая
функция попадает в ветку dev
. Если у старшего разработчика есть замечания, то нужно эти замечания исправить и подойти
снова за слиянием в общую ветку dev
. После слияния в dev
ветку dev-marat-zoo-to-settings
необходимо удалить
как локально, так и в репозитории.
Процесс формирования релиза
После того как в ветку dev
слили весь новый функционал текущего этапа разработки, ветка dev
фиксируется тем, что
она сливается в ветку dev-freeze
. Процесс фиксации может затянуться из-за обилия ошибок, и в этот момент могут быть
завершены новые функции, назначены на следующий этап, поэтому нужна новая ветка фиксации разработки. После того как
функционал на ветке dev-freeze
проверен и, в случае необходимости, исправлен, то ветка dev-freeze
сливается в ветку
stage
. На этой ветке платформа начинает распространяться на тестовые среды клиентов. И, если на этом этапе выявляются
ошибки, то они исправляются прямо в ветке stage
- подобные действия называются hot-fix-ами.
Когда ветка stage
окончательно стабилизирована и проверена на всех тестовых средах, то её сливают в ветку release
.
Процесс формирования версий
Версии системы состоят из четырёх чисел (на ветке dev-freeze
- пять чисел), разделённых точкой, например:
4.11.3.117
Первое число (4) обозначает главную версию самой платформы. Главная версия платформы увеличивается не чаще одного раза в год.
Второе число (11) обозначает либо релиз системы, либо состояние тестирования. Если это число НЕЧЁТНОЕ, то данное
число обозначает этап тестирования или разработки (stage
, dev-freeze
, dev
).
Если это число ЧЁТНОЕ, до это - РЕЛИЗ.
Третье число (3) обозначает уровень тестирования. Если оно НЕЧЁТНОЕ, то это альфа-тестирование или разработки
(ветка dev
или dev-freeze
). Если ЧЁТНОЕ, то это бета-тестирование (ветка stage
).
Четвёртое число (117) это номер текущего коммита. После каждого коммита, это число увеличивается на 1.
На ветке dev-freeze
имеется ПЯТЬ уровней ведения версий. Первые четыре - это копия той версии с ветки dev
которая
замораживается. А последняя - это счёт фиксов в ветке для заморозки.
Первые числа нужно менять вручную. А последнее число увеличивается на 1 автоматически системой CI/CD, а уменьшается всегда до нуля в ручную.
Пример состояния версий на ветках:
- dev - 4.11.7.118
- dev-freeze - 4.11.5.121.3 - здесь видно какая прежняя версия в ветки
dev
была заморожена - stage - 4.11.6.3
- release - 4.10.0.2
Во время разработки, изменения сбрасываются в ветку dev
и последнее число автоматически увеличивается на единицу
системой CI/CD.
Исправления на ветке dev
Ветка dev
является основной веткой разработки, поэтому любые изменения в ней не должны приводить к дальнейшим
слияниям. После появления коммита на ветке dev
автоматически запускается система CI/CD, и если нет ни каких ошибок
в модульных тестах, и проходит нормально сборка, то последнее число версии (четвёртое) увеличивается на единицу.
Исправления на ветке dev-freeze
Если исправляется ошибка на ветке dev-freeze
, то она вносится на эту ветку коммитом, и пятое число увеличивается
автоматически системой CI/CD на единицу.
После внесения коммита на ветку dev-freeze
разработчик ОБЯЗАН слить изменения по схеме:
dev-freeze -> dev
ВНИМАНИЕ: При таком слиянии на ветках ВЕРСИИ МЕНЯТЬ НЕЛЬЗЯ - нужно оставлять такими, какие они были.
Например: если версии веток были следующие:
dev=4.11.7.118
dev-freeze=4.11.5.121.3
То сразу же после слияния dev-freeze -> dev
они должны остаться такими же
dev=4.11.7.118
dev-freeze=4.11.5.121.3
После чего на ветке dev
запуститься CI/CD и через некоторое время версия на dev
увеличиться на единицу так:
dev=4.11.7.119
dev-freeze=4.11.5.121.3
Хот-фиксы, или исправления на ветке stage
Если исправляется ошибка на ветке stage
(это называется хот-фикс), то четвёрная цифра версии на ветке stage
автоматически увеличивается на единицу. После этого разработчик ОБЯЗАН слить изменения по схеме:
stage -> dev-freeze
dev-freeze -> dev
При этих слияниях версии на ветках НУЖНО оставить неизменными.
После этих слияний запуститься CI/CD на обеих ветках, и последние числа версий на ветках dev
и dev-freeze
увеличиться на единицу.
Супер-хот-фиксы, или исправления на ветке release
Если исправляется ошибка на ветке release
(это называется супер-хот-фикс), то четвёрная цифра версии на
ветке release
автоматически увеличивается на единицу. После этого разработчик ОБЯЗАН слить изменения по схеме:
release -> stage
stage -> dev-freeze
dev-freeze -> dev
При этих слияниях версии на ветках НУЖНО оставить неизменными.
После этого запуститься CI/CD. По окончанию работы CI/CD последнее число версий на ветках
dev
, dev-freeze
и stage
увеличатся на единицу.
Пример ведения версий
Изменения в ветке dev
должны быть проверены и протестированы. При этом не должен остановиться процесс разработки новых
функций на платформе. Для этого предусмотрен следующий механизм ведения версий:
Заморозка ветки dev
Когда в ветке dev
весь необходимый на данном этапе функционал реализован, то нужно его заморозить. Для этого
необходимо все изменения в ветке dev
слить в ветку dev-freeze
вместе с самой версией.
Например, имеется состояние версий:
- dev - 4.11.7.118
- dev-freeze - 4.11.5.34.40
- stage - 4.11.6.3
- release - 4.10.0.2
Поступила команда от руководителя проекта на заморозку ветки dev
, то изменения сливаем из dev
в dev-freeze
и в ручную устанавливаем следующие версии:
- dev - 4.11.7.118
- dev-freeze - 4.11.7.118.0
- stage - 4.11.6.3
- release - 4.10.0.2
Т.е. на ветку dev-freeze
ПРОСТО копируем версию с ветки dev
и добавляем ПЯТОЕ число равное нулю.
Дальне система CI/CD отрабатывает и увеличивает пятое число до единицы, как показано ниже:
- dev - 4.11.7.118
- dev-freeze - 4.11.7.118.1
- stage - 4.11.6.3
- release - 4.10.0.2
Дальше на dev-freeze-е могут быть найдены ошибки и исправлены прямо на этой ветке. Их может быть несколько. После нескольких исправлений может возникнуть следующая картина:
- dev - 4.11.7.231
- dev-freeze - 4.11.7.118.18
- stage - 4.11.6.3
- release - 4.10.0.2
Т.е. было как минимум 18 коммитов в ветку dev-freeze
о чём свидетельствует пятая цифра в версии.
Так же заметьте, что у ветки dev
, тоже увеличилась четвёртая цифра, так как в неё влили все изменения из
ветки dev-freeze
, да и ещё в ней могли появиться новые функции, предназначенные для следующего релиза.
Стабилизация нового функционала: обновление ветки stage
После того как ветка dev-freeze
стабилизирована, поступает команда от руководителя проекта залить её в ветку stage
.
Исполнив эту команду, должны быть следующие изменения в версиях:
Было:
- dev - 4.11.7.231
- dev-freeze - 4.11.7.118.18
- stage - 4.11.6.3
- release - 4.10.0.2
Стало:
- dev - 4.11.9.0
- dev-freeze - 4.11.7.118.18
- stage - 4.11.8.0
- release - 4.10.0.2
Здесь показано, что в ветке stage
увеличилась третье число на два (с 6 до 8 - должны быть ЧЁТНЫМИ),
а четвёртое занулили.
Так же изменили версию в ветке dev
- тоже увеличили третье число на два (с 7 до 9 - должны быть НЕЧЁТНЫМИ)
После этих коммитов запуститься CI/CD на ветках dev
и stage
и последние версии увеличатся на единицу:
- dev - 4.11.9.1
- dev-freeze - 4.11.7.118.18
- stage - 4.11.8.1
- release - 4.10.0.2
А после нескольких исправлений может быть следующая картина:
- dev - 4.11.9.17
- dev-freeze - 4.11.7.118.18
- stage - 4.11.8.6
- release - 4.10.0.2
Ветка dev-freeze
уже не трогается и она не меняется, а хот-фиксы изменяют последнее число в версии ветки stage
. При
последующем сливании этих хот-фиксов в ветку dev
последнее число на этой ветке тоже увеличивается на единицу. Если
кто-то сольёт изменения в ветку dev-freeze
, то на ней тоже последнее число увеличиться на единицу - это делать не
обязательно, но не возбраняется.
Выпуск релиза: обновление ветки release
После того как ветка stage
стабилизирована и хорошенько оттестирована, то от руководителя проекта поступает команда
на переход изменений в ветке stage
в ветку release
. Должно быть сделано следующее:
Было:
- dev - 4.11.9.2071
- dev-freeze - 4.11.7.118.31
- stage - 4.11.8.11
- release - 4.10.0.2
Стало:
- dev - 4.13.1.0
- dev-freeze - 4.11.7.118.31
- stage - 4.13.2.0
- release - 4.12.0.0
Т.е. вышел новый релиз - 4.12.0.0!!!
Тут увеличилось второе число на ветке release
на два (с 10 до 12 - должно быть ЧЁТНЫМ) - остальные были сброшены до 0.
На ветках dev
и stage
второе число было установлено на единицу БОЛЬШЕ релиза (13 - НЕЧЁТНОЕ).
Третье число на ветке dev
стало единицей (нечётным), а на ветке stage
стало двойкой (чётное).
Четвёрное число на ветках dev
и stage
обнулили.
На ветке dev-freeze
ни каких изменений НЕТ - там лишь указывается какая ветка была когда-то заморожено. Так будет до
тех пор, пока опять не заморозят ветку dev
.
После этих изменений на всех ветках запуститься CI/CD, и когда он везде отработает, то будут такие изменения в версиях:
- dev - 4.13.1.1
- dev-freeze - 4.11.7.118.31
- stage - 4.13.2.1
- release - 4.12.0.1
Инварианты
Инварианты - это условия, которые не должны соблюдаться при каждой операции push.
Терминология ведения версий
Версия на ветке представляет собой набор чисел разделённых точкой. Первое число - это первый уровень, второе - второй, и так далее.
Базовые инварианты
Чётное число - это более стабильная версия чем нечётное число на своём уровне ведения версий. Исключение первый уровень и последний.
Нестабильные ветки всегда больше по версии чем стабильные - так как они впереди разработки.
Основные инварианты
- На ветках
dev
,stage
,release
- четыре уровня версии. - На ветке
dev-freeze
- пять уровней версии. - На ветке
release
второй уровень всегда чётный. - На остальных ветках второй уровень всегда нечётный.
- На ветке
release
второй уровень всегда на 1 меньше, чем на остальных (исключениеdev-freeze
). - На ветке
release
третий уровень всегда равен нулю. - На ветке
stage
всегда третий уровень чётный. - На ветке
dev
всегда третий уровень нечётный. - На ветке
dev
всегда третий уровень на 1 больше, чем на веткеstage
. - На ветке
dev-freeze
всегда пять уровней. Первые четыре - это точная копия некого старогоdev
-а.