Розбивши наш код на біти для багаторазового використання, як ми тестуємо та розгортаємо?


9

Ми розпочали роботу з одним розробником і одним svn repo, що містить весь наш код:

^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1

(на той час це було велике поліпшення). Після цього отримали шанс трохи збільшитися, у нас виникли проблеми з круговими залежностями, повільними тестуваннями та загальними труднощами з повторним використанням коду (оскільки, наприклад, набір функцій website1 проник у загальний модуль-a).

Бажаючи модулювати кодову базу і очікуючи, що незабаром ми перейдемо до git (і прочитавши десь, що git не любить svn mega-repos), ми перейшли до набагато більш детальної структури:

^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)

Це було концептуально чудово. Більш модульний код, набагато швидші тестові набори, легше документувати і т. Д. Ми відкрили джерело деяких наших більш загальних компонентів і зробили всі модулі pip інстальованими (використовуючи їх pip install -e .для встановлення у developmentvirtualenv).

Ми створили ^/srv/trunkсховище, що містить структуру папок середовища виконання, тобто. ^/srv/trunk/libдля модулів, /srv/trunk/srcдля залишків ^/foo/trunk, ^/srv/trunk/wwwдля веб-сайтів тощо.

І нарешті (взявши ідею від perforce, з якою я працював дуже давно [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ) ми створили "vcs- отримати "текстовий файл, у якому перераховані всі відповідні репозиції та де їх слід перевірити у середовищі розробників, та відповідну команду для цього. Наприклад рядок vcs-fetc:

svn srv/lib/module-a ^/module-a/trunk

спричинить або (вперше)

cd /srv/lib && svn co ^/module-a/trunk module-a

або (згодом)

cd /srv/lib/module-a && svn up

і аналогічно для github repos (як наш власний, так і змінений / незмінний пакет постачальників).

Ми використовували той же процес vcs-fetch для створення виробничого середовища, але ми швидко з'ясовуємо, що ми не можемо знати, яку версію використовували в prod після виконання vcs-fetch.

За допомогою мега-репо ми могли просто відзначити номер редакції перед оновленням продукту з магістралі, а повернення назад було просто svn -r nnn up .. З кодом і svn, і git (і одного модуля в hg) - і ~ 120 repos, не очевидно, як це зробити ..

Я читаю http://12factor.net/ сьогодні, і перший фактор - "Одна кодова база", тому мені також цікаво, чи я тут відправився від правильного шляху?

Однією з моїх ідей було створити сценарій розгортання, який створив би встановлені в pip "розгортання" колеса і "зв'язав" їх разом у requirements.txtфайл. Потім розгортання передбачає створення нового virtualenv, встановлення на pip-файл вимоги.txt, в якому перераховуються колеса розгортання, та переключення активних virtualenv. Повернення до попереднього означало б просто переключення virtualenv назад (але якщо ми не хотіли зберегти virtualenvs назавжди, це не дозволило б нам повернутися в будь-який момент часу - на мій досвід, який ніколи не був потрібний).

У цей момент мені цікаво, чи я йду в неправильному напрямку, чи просто не пройшов достатньо далеко по правильному шляху ..? (усе, що я читаю, продовжує говорити про "ваш додаток", і я не знаю, як це перекладається на запуску 14 веб-сайтів з тієї ж бази коду ...)


Чи можу я припустити, що окремі компоненти зараз розробляються різними командами з різними циклами розвитку? Якщо так, то розірвати сховище окремо не можна. Незважаючи на те, що з git, ви розміщуєте теги синхронізованого випуску для основних, стабільних конфігурацій. Погляньте на інструмент репо Google. Спроба співставити версії розробки за допомогою інтегрованих метаданих є досить безрезультатною. Зв'язок програми разом через pip також ідеально законним.
Ext3h

Якщо ви, будь ласка, включіть оцінки KLOC (1000 рядків коду) та міри байтів коду, ми можемо легко зрозуміти розмір, наприклад, "2000 рядків коду. 50 кілобайт вихідного коду". або "40 KLOC, 2 ГБ XML". . Здається, те, що потрібно просто перейти на git і git, має функції імпорту. Почати можна з читання книги про git .
Ніклас

1
@ Programmer400 кодова база: .py 670 kloc, .js: 135kloc, .less: 25kloc, .html: 130kloc. Настільки великий, але не величезний. З того, що я читав, git насправді не любить репости такого розміру, тому я думаю, що нам доведеться розділитись на менші репозиції, перш ніж перейти на git ..?
thebjorn

Відповіді:


2

Це здається, що у вас відсутні гілки (а точніше - "теги" або "відпустіть" гілки).

Замість того, щоб використовувати свій SVN revnum в якості посилання, щоб визначити, яку версію ви встановлюєте, вам слід створити гілку при випущеній версії. Потім ви розгортаєте цю гілку.

Це спрощує розгалуження, навіть якщо немає змін, тому кожен модуль зберігає однаковий номер випуску, однак ваші пакети OSS можуть не любити розгалуження без змін, тому наступне найкраще - зберігати скрипт залежностей - тому версія 5 вашого продукту вимагає модуль OSS X v2 тощо.

Ви можете змінити свій скрипт, щоб перестати посилатися на версії, а замість цього працювати з іменами гілок (хоча вони можуть бути будь-якими, найкраще визначитися з фіксованою умовою іменування, наприклад, Release_1_2_3)

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


1

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

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

Оскільки я не впевнений, наскільки окремі ваші модулі чи наскільки детально ви хочете, щоб ваша версія була запропонована, я запропоную кілька варіантів.


Використовуйте підмодулі git. За допомогою підмодулів ви можете зберігати кожен модуль в окремому git repo, подібному до вашої установки svn, а також до того, що ви думаєте. Потім ви зв'язуєте ці модулі з кореневим проектом, який буде містити посилання на відповідний коміт кожного підмодуля для кожного його власного зобов'язання.

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

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

Однак я широко не використовував цю схему, тому не знаю, яка проблема може бути для великого проекту, такого як ваш.


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

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

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

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