Як позбутися розгалуження для спрощеного потоку Git


20

У веб-проекті, що постійно розробляється (не продукт), в даний час ми маємо таку стратегію розгалуження, грунтуючись на потоці git :

  • розробити галузь: остання робоча версія
  • головна гілка: версія для випуску / версія
  • особливості галузей: особливості розвитку
  • гілки виправлення: термінові виправлення у випущеній версії

Майстер читається тільки, оновлюється за допомогою запитів на витяг з гілок розробки або виправлення . Кожне оновлення призводить до того, що кандидат на випуск будується та розгортається до системи постановки. Кандидати на випуск передаються у виробництво після затвердження вручну.

Гілки функцій створюються на основі нерозвинених або з останнього комітету, об'єднаного в головний. Побудований запит із розгалуженої функції, який розробляється, розгортається до безкоштовної тестової системи, де виконуються інтеграційні тести та тести прийняття (автоматичні та інструкції). Після успішного тестування та перегляду, PR об'єднується, так що він стане частиною наступного випуску (тобто злиття від розробки до головного).

Моя мета

Я хотів би спростити це та позбутися галузі розвитку. Гілка, що розвивається, має здебільшого історичні причини, і оскільки це завжди успішно перевірена версія, я вважаю, що зайвим залишати її відокремленою від головного. Видалення його також спростить процес випуску, оскільки додаткового злиття більше немає.

У мене є такі обмеження:

  • випуски заплановані і не повинні бути повністю автоматизованими
  • хоча гілки функцій, як правило, недовговічні, деякі залишаються незруйнованими протягом декількох тижнів (наприклад, перепроектування), але їх також потрібно протестувати (наразі як відкриті запити на виведення)
  • іноді одна функція повинна бути випущена поза звичайним випуском, фактично перетворюючи її на виправлення. За допомогою поточної стратегії я можу відновити гілку функції та об'єднати її безпосередньо в головну
  • трапляється також, що нам потрібно стримувати функції після того, як тести прийняття із зовнішніми системами на етапі постановки не вдалися

Де я не впевнений у переході:

  • На даний момент я будую запити на тестування та об'єдную комісії для випусків. Чи можу я це об'єднати?
  • як поводитися з виправленнями, коли майстер випереджає останню версію. Чи слід створювати та розгортати випуски безпосередньо з гілок виправлення?
  • чи є розумний спосіб поводжуватися з функціями, які слід виключити з випуску після їх об'єднання? Чи справді окрема галузь розвитку є перевагою для цих випадків? Більшу частину часу я закінчую поверненням та ревертуванням в будь-якому разі.

4
Здається, що, з одного боку, ви говорите, що вам не потрібна гілка DEV, але потім продовжуйте пояснювати, чому ви насправді це потребуєте. Особливі гілки, які живуть тижнями, було б дуже важко об'єднатись для освоєння після того, як вони розійдуться надовго. Ви впевнені, що хочете покінчити з DEV?
Дейв Сверський

@DaveSwersky гарне запитання! Я не впевнений, ось чому я запитую тут :) Про довгоживучі особливості гілок: труднощі злитись - це проблема, яка вже існує і її просто перенесуть в інше місце. І при регулярних злиттях від основної гілки це можливо. Як би було складніше, якщо головна галузь є господарем?
Фабіан Шменглер

Довгоживучі гілки завжди будуть викликом, хоча, можливо, більшим завданням буде злиття для освоєння, ніж галузь DEV. Рішенням цієї проблеми може бути розрив роботи краще, щоб зберегти ці гілки недовговічними. Якщо ви можете перешкоджати тим, що гілки тематики / зображень живуть більше 24-48 годин, вам, можливо, пощастить усунути DEV.
Дейв Сверський

1
@FabianSchmengler Яка реальна причина ви хочете видалити гілку розробників? Це справді звучить так, як вам це потрібно для випадків, коли справи йдуть не так, як планували.
аві

називайте його майстром або розробкою, або будь-що, що ви хочете, вам знадобиться гілка інтеграції, якщо ви хочете мати справжній CI, або якщо ви делегуєте її до гілок функцій, це буде лише зовнішня інтеграція їх проти поточного випуску ізольовано.
ᴳᵁᴵᴰᴼ

Відповіді:


6

ІМХА проблема ви зіткнулися лише побічний ефект поганий стратегії розгалуження ви почали: ви ефективні оранку нового розвитку на develop(тобто те , що сходиться по напрямку до майбутньої коді виробництва) через в поточному виробництві коди на master. Це призводить до суперечливих вимог та проблем, оскільки типово майбутній код відрізняється від поточного:

  • нова розробка дестабілізує виробництво - регресії, що спостерігаються після об'єднання developвmaster
  • стабілізація виробництва уповільнює майбутній розвиток - вам потрібно стабілізуватися, developщоб зробити його достатньо хорошим для злиттяmaster

Скасування developне допоможе (багато) - ви не усунете проблему, ви просто переносите в-конкретну developчастину проблеми в master.

Кращим підходом було б перемістити виробництво за поточним / майбутнім розвитком, щоб запобігти втручанню в розробку для майбутніх випусків, як показано на цьому зображенні з " Що є вашою моделлю розгалуження"? :

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

Зауважте, що я маю на увазі лише гілки випуску на наведеному вище зображенні, а не на те, що відбувається в магістралі.

Як би це працювало для вас:

  • в developгалузі пропадає, як ви хотіли, вбирається вmaster
  • masterгілка ваш стовбур, це де розвиток відбувається без будь - яких обмежень швидкості (вона ніколи і НЕ зливалася в виробництво).
  • виробництво / є одна або декілька releaseгалузей, витягнутих з masterетикетки / тегів, які вважаються досить близькими до якості виробництва (короткий перелік решти предметів Todo може бути адресований у цій галузі за потреби). Ці гілки можуть отримувати лише прямі виправлення та / або виправлені вишневі виправлення master, вони ніколи не об'єднуються з masterіншими гілками
  • виправлення - це прямий вкладення у releaseгілки

Якщо виправлення застосовується лише до виробничої версії, але не до неї, masterвона безпосередньо привласнюється до releaseфілії. Якщо він стосується обох, він, як правило, прихильний до masterпершого, а також вишневий / подвійний прихильний до releaseгілки.

Тепер, дивлячись на те, що відбувається master(що минуло момент, коли поточна releaseгілка витягнута), у вас є два варіанти:

  • продовжуйте працювати з гілками функцій так само, як ви робите сьогодні, за винятком того, що вони будуть вимкнені master, не develop. Перетворення їх у гарячі виправлення залишається можливим - вам доведеться просто перезавантажити їх у відповідну releaseгілку замістьmaster
  • перейти до безперервної інтеграції та скористатися її вигодами (це можна зробити в будь-який час вперед), в тому числі прогресивно - поступово витягувати все менше і менше функціональних гілок.

Якщо вам подобається такий підхід, ось як дістатися туди, де ви сьогодні є:

  • встановити стратегію іменування випусків:
    • у вас не може бути відділення з випуском, що триває з тим самим іменем
    • ви не можете (не слід насправді) перезавантажувати чи синхронізувати гілку виробництва
  • негайно витягніть releaseXгілку master, дотримуючись цієї стратегії іменування
  • перестаньте developбрати участь у заході, вони незабаром перейдуть прямо до master.
  • зливатися developвmaster
  • доручити розробникам перезавантажувати робочі області masterзамість них develop.
  • відкритий masterдля комісій
  • видаліть, developякщо бажаєте (або залиште його постійно заблокованим / лише для читання для довідки)

Дякую за детальні пропозиції. Я ще не впевнений, що галузеві випуски є гарною ідеєю поза розробкою продукту, але я перегляну його, це може мати сенс для цього проекту
Fabian Schmengler

Також у вас є альтернатива безперервного розгортання, яка ставить розробку на одне місце з виробництвом (на відміну від просування або попередження), але для цього вам потрібен зміна культури (оскільки це передбачає відмінювання всіх галузей інтеграції та функцій).
Дан Корнілеску

Я розпізнаю цю схему :)
paul_h

11

Скажімо, ви виймаєте головну гілку (ви можете перейменувати розробку на майстер, щоб плутати вашу команду, якщо вам згодом подобається) і просто використовувати теги для випусків або на гілках розробки, і з виправленнями. Ви вийняли гілку, але різниця - це лише зміна синтаксису. Зміни заради змін.

Тепер скажімо, що ви фактично виймаєте розробку, зберігаючи заблоковану головну гілку. Що відбудеться, що інтеграція коду сповільниться, він буде довше відокремлюватися у функціональних гілках, особливо близько до дати випуску. Це збільшить труднощі злиття кожного разу та уповільнить процес.

В рамках обмежень, які ви встановили, я не бачу жодних позитивних ефектів від таких змін. Це вимагатиме розслаблення обмежень, особливо першого.


5

Ви вже будуєте та тестуєте код на кожній із гілок "pull-request" та "hot-fix". Це означає, що в сукупності сума всіх гілок, що очікують на запит на виклик, - це ваша віртуальна developгілка.

Ви можете створити систему, коли в тестовому середовищі кілька витяг-запитів вишні вибираються у тимчасову гілку, яка не публікується в головному сховищі. Ця гілка використовується для інтеграції тестового середовища, що включає masterдекілька додаткових запитів на виклик, але після тестування ця гілка більше нікуди не доступна.

Коли ви створюєте реліз master, ви зазвичай створюєте тег для цього випуску. Пізніші виправлення можуть використовувати цей тег для створення нової гілки виправлень, з якої буде зроблено розгортання, навіть якщо край masterуже попереду. На цій гілці виправлень ви, ймовірно, також позначите незначний випуск та переконайтеся, що зміни були об'єднані в master.

Видалення об'єднаних функцій з випуску досить важко зробити з git. Найкращим механізмом для цього було б використання git revertпід час об'єднання. Але це майже неможливо повернути ці особливості / зміни, і історія заплутається.

Набагато кращим способом обробки розділення для розгортання коду та випуску функцій є прапори функцій . Якщо ваші розробники можуть приховати свої функції за деякими умовами в самому коді, ви можете розгорнути їх код, але вимкнути функцію. Це окрема тема, але багато інформації про це існує (включаючи запитання і відповіді на devops.SE).


2

Well @ dan-cornilescu каже, що це добре для вашої конкретної проблеми, але більш загальний випадок розвитку на основі магістралей (згаданий у Постійній доставці, Lean Enterprise та посібнику DevOps) зроблений тут: https://trunkbaseddevelopment.com/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.