Обробка декількох гілок у безперервній інтеграції


85

Я мав справу з проблемою масштабування ІР у своїй компанії і одночасно намагався з’ясувати, який підхід застосовувати, коли справа стосується ІС та декількох відділень. Є подібне питання щодо stackoverflow, декількох гілок функцій та постійної інтеграції . Я розпочав новий, тому що хотів би більше обговорити та провести певний аналіз у питанні.

Наразі я виявив, що є 2 основні підходи, які я можу застосувати (або, можливо, деякі інші ???).

  • Кілька робочих місць (мова про Дженкінса / Хадсона тут) на одну гілку
  • Кілька завдань на 2 гілки (розробник і стабільний)
    • Керуйте двома наборами вручну (якщо ви зміните конфігурацію завдання, то обов’язково змініть в іншій гілці)
      • ПІТА, але принаймні так мало, щоб ними керувати
    • Інші додаткові гілки не отримають повний набір тестів до того, як їх перенесуть на розробник
    • Незадоволені розробники. Чому розробник повинен дбати про проблеми масштабування CI? У нього є просте прохання, коли я відгалужуюсь, я хотів би протестувати свій код. Простий.

Отже, якщо я хочу надати розробникам CI для власних спеціальних гілок, мені потрібні спеціальні інструменти для Jenkins (API або сценарії оболонок чи щось інше?) Та обробляти масштабування. Або я можу сказати їм частіше зливатися з DEV і жити без CI на спеціальних гілках. Який би ви взяли або є інші варіанти?

Відповіді:


69

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

Виконання реального ДІ означає, що всі ваші розробники регулярно приєднуються до основної лінії. Легко сказати, але важка частина робить це, не порушуючи вашу заявку. Я настійно рекомендую вам ознайомитись із Безперервною доставкою , особливо з розділом Зберігання вашої програми доступною у розділі 13: Управління компонентами та залежностями . Основними моментами є:

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

Вони досить зрозумілі, за винятком гілок шляхом абстракції. Це просто вигаданий термін для:

  1. Створіть абстракцію над тією частиною системи, яку потрібно змінити.
  2. Переформатуйте решту системи, щоб використовувати шар абстракції.
  3. Створіть нову реалізацію, яка не буде частиною шляху виробничого коду до завершення.
  4. Оновіть рівень абстракції, щоб делегувати його новій реалізації.
  5. Видаліть стару реалізацію.
  6. Зніміть шар абстракції, якщо він більше не підходить.

Наступний абзац із розділу « Гілки, потоки та безперервна інтеграція» у главі 14: «Розширений контроль версій» узагальнює наслідки.

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

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


4
Томе, це працює добре, лише якщо 1) як випуск, так і оновлення порівняно легкі; 2) більшість змін добре ізольовані. Це справедливо для веб-розробників, але якщо ви робите коробкові випуски продуктів, то стабільні версії повинні залишатися стабільними за будь-яку ціну, оскільки виправлення дійсно дорогі або навіть неможливі у великому корпоративному середовищі.
Євгеній Кабанов,

13
справжній CI - це не лише інтеграція, це ще й зворотній зв'язок
Антон Архіпов,

3
Я вибрав це як відповідь (принаймні дав нагороду, будь ласка, дайте мені знати, якщо мені якось все-таки потрібно позначити це правильно), але я думаю, що це не вирішення моєї проблеми. Я написав повідомлення на zeroturnaround.com/blog/…
toomasr

1
@Jevgeni Kabanov та @toomasr Ви, здається, припускаєте, що справжній CI означає відмову від якості, і це працює лише для веб-розробників, оскільки так легко витіснити виправлення. Я здогадуюсь, що те, що вас турбує, - це хитра фіксація безпосередньо перед звільненням. Так, це може призвести до поганого випуску, який може бути дорогим для виправлення. Однак хитрий коміт у гілці функцій безпосередньо перед його випуском настільки ж поганий. Якщо ви відчуваєте різницю, поділіться своїми міркуваннями. Одним із способів боротьби з цим (якщо коміт був до основної лінії або гілки функції) є використання підходу безперервної доставки.
Том Говард,

1
О, і до речі, протягом останніх 4 років мій основний досвід розвитку був у фінансових установах. Необхідність стабільних випусків і вартість помилки (не кажучи вже про процес управління змінами, який потрібно пройти, щоб виштовхнути виправлення) не набагато більша за це. Виріб у коробці був би для мене розслаблюючою зміною.
Том Говард,

4

Я б встановив окремі робочі місця для кожної галузі. Я робив це раніше, і неважко керувати та налаштовувати, якщо ви правильно налаштували Хадсона / Дженкінса. Швидкий спосіб створити кілька завдань - це скопіювати з існуючого завдання, яке має подібні вимоги, та модифікувати їх за потреби. Я не впевнений, чи хочете ви дозволити кожному розробнику налаштовувати власні робочі місця для власних гілок, але одна особа (тобто менеджер збірки) не має великої роботи для управління. Після об’єднання спеціальних гілок у стабільні гілки, відповідні завдання можна видалити, коли вони більше не потрібні.

Якщо вас турбує навантаження на сервер CI, ви можете налаштувати окремі екземпляри CI або навіть окремі ведені пристрої, щоб допомогти збалансувати навантаження на декількох серверах. Переконайтесь, що сервер, на якому ви працюєте Hudson / Jenkins, адекватний. Я використовував Apache Tomcat і просто повинен був переконатися, що він має достатньо пам'яті та обробної потужності для обробки черги збірки.

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


Я думаю, що відсутність інструментів означає, що в цьому відділі є місце для деяких плагінів / продуктів. Не хотів би писати свої.
toomasr

1
Існує утиліта для Jenkins, яка автоматично створює конфігурацію збірки для кожної гілки: entagen.github.com/jenkins-build-per-branch
kolen

3

Я б вибрав dev + стабільні гілки. І якщо ви все ще хочете користувацькі гілки і боїтеся навантаження, то чому б не перенести ці користувацькі в хмару і не дозволити розробникам керувати ними самостійно, наприклад, http://cloudbees.com/dev.cb Це компанія, де зараз знаходиться Косуке . Існує також Eclipse Tooling, тому, якщо ви використовуєте Eclipse, ви будете мати його щільну інтеграцію прямо в dev env.


Чи буду я торгувати відсутністю інструментів управління кількома гілками, щоб мати одну і ту ж проблему, але в хмарі? Я маю на увазі, що зараз зможу управляти навантаженням, але все ще не гілки?
toomasr

Я мав на увазі забути інструментарій та розподілити управління серед розробників - "якщо ви хочете власну особисту збірку, ось ваш обліковий запис CB". Не впливаючи на продуктивність збірки основного сервера. Незважаючи на те, що їх API досить простий, тому створення утиліт управління буде, мабуть, питанням одного-двох тижнів, і тоді ви будете робити там все, що завгодно. Як це звичайно у житті, якщо ви хочете чогось особливого, краще зробити це самостійно. У той же час вони швидко ростуть і слухають спільноту, тож заповніть запит на функцію, і, можливо, він з’явиться найближчим часом.
Антон Сафонов

О, зрозуміло. Скажіть власнику відділення, щоб вишня вибрала робочі місця, які його цікавлять, і налаштуйте їх для своєї власної філії, як він хоче. Мені ця ідея подобається.
toomasr

1

Насправді, що насправді проблематично, так це побудова ізоляції з гілками функцій. У нашій компанії ми маємо набір окремих проектів maven, і всі вони будуть частиною більшої дистрибуції. Ці проекти підтримуються різними командами, але для кожного розподілу всі проекти повинні виходити. Відділ функцій тепер може перекриватися від одного проекту до іншого, і це коли ізоляція збірки стає болісною. Ми спробували кілька рішень:

  • створити окремі сховища знімків у nexus для кожної гілки об’єкта
  • ділитися місцевими сховищами для виділених рабів
  • використовувати плагін repository-server-plugin з висхідними сховищами
  • будувати все в межах однієї роботи за допомогою одного приватного сховища

Насправді останнє рішення є найбільш перспективним. Всім іншим рішенням так чи інакше бракує. Разом з плагіном job-dsl легко встановити нову гілку функцій. просто скопіюйте та вставте скрипт groovy, адаптуйте гілки і дайте насінню завдання створити нові завдання. Переконайтеся, що завдання насіння видаляє некеровані завдання. Тоді ви можете легко масштабувати за допомогою гілок функцій для різних проектів maven.

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

мої 2 центи

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