Я думаю, что эта статья, «Успешная модель ветвления Git» , очень хорошо известна среди опытных пользователей DVCS.
Я использую в hg
основном, но я бы сказал, что это обсуждение хорошо для любой DVCS.
Наш текущий рабочий процесс заключается в том, что каждый разработчик клонирует мастер репо. Мы пишем код для нашего собственного локального репо, запускаем тесты и, если все идет хорошо, толкают мастера.
Поэтому мы хотим настроить CI-серверы, такие как Jenkins, и улучшить наш рабочий процесс с помощью будущей системы обеспечения (chef, puppet, ansible и т. Д.).
Реальная часть
Хорошо, модель, представленная выше, работает хорошо, но ветви могут сломать CI. Ветвь объекта должна синхронизироваться с источником (согласно статье, это будет development
ветвь), чтобы сделать CI и слияние плавным, верно?
Скажем, Алиса и Боб работают над двумя функциями. Но Алиса закончила на следующий день. Особенность Боба занимает неделю. К тому времени, как Боб закончил, его изменения устарели (возможно, Алиса реорганизовала / переименовала некоторые классы).
Одно из решений - каждое утро разработчики должны master/origin
проверять наличие изменений. Если Алиса зафиксировала, Боб должен вытащить и слиться со своим рабочим пространством, чтобы его ветвь функций была актуальной.
- Это хороший способ?
- Должны ли эти ветви существовать в главном репо (а не в локальном клоне?). Значение, что каждый разработчик должен иметь право коммитировать для главного репо в GitHub / Bitbucket, чтобы они могли создать новую ветку? Или это делается локально?
- Наконец, модель, представленная в статье, должна нарушать CI, если ветви не синхронизированы с
origin/master
. Так как мы хотим делать ночные сборки, должны ли разработчики собирать и объединять данные до того, как они уйдут с работы, и будет ли CI работать в каждой ветви функций?
В ответ на 1)
Любой способ, который работает, является хорошим способом. Тем не менее, вся предпосылка непрерывной интеграции заключается в непрерывной интеграции . Идея состоит в том, чтобы выявлять ошибки интеграции не только как можно раньше, но и в рамках цикла обратной связи при разработке, то есть пока все детали тестируемого кода находятся в кратковременной памяти разработчика, вносящего изменения. Это означает, что в нормальных, повседневных обстоятельствах работа должна быть интегрирована между ветвями функций в каждом коммите - может быть, каждые 15 минут или около того. Повторим: Основная цель непрерывной интеграции - выявить ошибки интеграции, пока все детали находятся в кратковременной памяти разработчика (-ов), вносящих изменения.
2)
В основном, ветки создаются в Mercurial путем клонирования репозиториев, поэтому вам не нужно предоставлять каждому разработчику привилегии коммитов для главного репозитория. Однако, возможно, вы захотите дать разработчикам возможность создавать клонированные репозитории на сервере непрерывной интеграции, поскольку не всегда возможно запускать тесты локально. (У меня когда-то была система CI, в которой модульные тесты выполнялись на 128-ядерном кластере в течение 8 часов). Разумеется, разработчики не могли выполнять локальные тесты.
3)
Если у вас есть вычислительные ресурсы для этого, да, разработчики должны быть всегда в курсе основных направлений разработки, особенно до того, как они уйдут с работы, и вам следует запускать ночные тесты на всех этапах разработки (хотя большинство систем CI не делай так легко).
источник
Вот как вы можете это сделать: функция ветвления.
Важным здесь является то, что вы будете иметь 0 конфликтов в ветви по умолчанию при объединении вашей функции филиала в него, и все тесты делают проход .
С этим простым рабочим процессом у вас всегда будет нетронутая и стабильная ветка по умолчанию, теперь делайте то же самое для веток релиза, но интегрируя по умолчанию . Если вам нужно интегрировать исправления непосредственно в ветки выпуска, вы все равно можете сделать это, пропустив ветку по умолчанию, но опять же, выбирая только ветки, которые только что обновились из целевой ветки и не имеют конфликтов, и их модульные тесты пройдены.
источник