DVCS благословив реплікацію репо серед серед географічно розподілених команд


9

Моя компанія досліджує перехід від Perforce до DVCS, і в даний час ми використовуємо багато проксі-серверів Perforce, оскільки команди розробки програмного забезпечення поширюються на Німеччину, Китай, США та Мексику, а іноді пропускна здатність від одного місця до іншого не така вже й велика.

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

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

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

Моє запитання : чи концепція реплікації DVCS є чимось, що використовується на практиці? Хтось зробив це успішно? Якщо так, то як це правильно зробити?


Будь-які члени команд, що розповсюджуються, які використовують контроль розподіленої версії?
герцогство,

Залежно від політики компанії, хостинг на Github або Bitbucket міг би працювати дуже добре. Здається, марно налаштовувати складне рішення ІТ, коли є компанії, які вже мають глобально доступні налаштування за розумною ціною.
captncraig

1
"Залежно від політики компанії" <--- yup
dukeofgaming

Відповіді:


11

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

По-перше, дозвольте мені зазначити декілька ключових моментів щодо роботи репозиторіїв у DVCS. (Я найбільше знайомий з Mercurial, тому саме це я буду використовувати для прикладів, але я вважаю, що все, що я скажу, також стосується git.)

A. У DVCS будь-який клон містить той самий вміст файлу та історію, що й оригінал.

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

B. Нові зміни не потрібно розповсюджувати туди, звідки вони прийшли.

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

C. Зміни можна розповсюджувати за допомогою натискання або витягування.

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

Приклади

Для обговорення скажімо, що ваші команди, що розповсюджуються, використовують системи в доменах duke.de, duke.us, duke.cn і duke.mx, а далі duke.de - це те, де ми хочемо мати "благословенне" репо. Враховуючи ці припущення, дозвольте викласти декілька прикладів різних топологій, які ви могли б створити, маючи на увазі три ключові точки DVCS вище.

0. Централізована модель Push

Зробіть єдине репо на hg.duke.de, і розробники в усіх місцях клонують і тягнуть звідси і натискають зміни тут. Це може спрацювати для людей у ​​Німеччині, але, мабуть, це буде проблемою для людей у ​​решті світу. Усі операції по клонуванню, витягуванню та натисканню проходитимуть через повільні мережеві зв'язки. Для цього використовується DVCS так само, як централізована система. Це проблема, яку ви намагаєтеся вирішити.

1. Централізований поштовх із тиражуванням

Попросіть благословенного репо на hg.duke.de та мати репліки на hg.duke.cn, hg.duke.mx та hg.duke.us. Розробники клонують із своєї локальної репліки і надсилають зміни на hg.duke.de. Щоразу, коли в hg.duke.de з'являються нові зміни, запускається гачок, який поширює їх до реплік. Репліки інакше лише для читання, тому ніколи не буде злиття чи конфлікту.

Наприклад, якщо я розробник в Мексиці, я клоную з hg.duke.mx, але натискаю зміни на hg.duke.de. Якщо інші зміни будуть натиснуті на hg.duke.de, перш ніж я можу внести зміни, мій натискання буде заблоковано. Інші зміни будуть реплікуватись на hg.duke.mx, тому я перетягну ці зміни локально, об'єднаюсь, а потім спробую знову перейти до hg.duke.de.

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

У Mercurial ви можете налаштувати локальне репо, щоб перетягуватися з одного місця та переходити до іншого, додаючи у .hg/hgrcфайл щось на зразок наступного :

[paths]
default = ssh://hg.duke.mx
default-push = ssh://hg.duke.de

2. Проста модель натягування

Продовжуючи hg.duke.de як благословенний репо, а інші як репліки, ми можемо поширювати зміни за допомогою "pull" замість push. Розробники клонують і витягують із своєї локальної репліки як завжди. Коли зміна готова, розробник надсилає запит на тягнення до деякої центральної служби, яка переходить з репо розробника на hg.duke.de. Потрібно розробити політику щодо об'єднань. Наприклад, якщо виникають конфлікти злиття, запит може бути відхилено, вимагаючи від розробника витягнути (з локальної репліки), об'єднати та повторно подати запит на витяг.

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

Варіації

Є купа варіацій, які можна застосувати.

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

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

Тим, хто зручніший з push-моделлю, можливо, захоче налаштувати локальне постановочне репо в кожному місці поряд із репліками, наприклад, hg-stage.duke.mx, hg-stage.duke.cn тощо. Для цього потрібно трохи більше роботи, хоча розробники не тільки повинні зливатися з іншими локальними змінами, але хтось повинен нести відповідальність за злиття змін із постановочних репостів у благословенне репо. Однак це може працювати при правильних обставинах, і їм може допомогти автоматизація.

"Прозорість"

Тепер до питання прозорої реплікації.

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

Якщо ви хочете прозорості, ви можете створити домени пошуку DNS відповідно до їх місцезнаходження. Локальна репліка та постановка репостів просто називатиметься "hg" та "hg-етап", а налаштування DNS вирішить їх hg.duke.cn та hg-stage.duke.cn для розробників в Китаї, і відповідно для розробники в інших місцях. Але це трохи магії і може бентежити, і я дійсно не думаю, що це додає багато чого.

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


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

1
Я дам вам додаткову нагороду після того, як SE дозволить мені (24 години), чудова відповідь
герцогство з обмеженнями

1
На місцевих репортажних постановках ... якщо зміни проводяться локально, поки вони не стабільні, і лише потім інтегруються в основне репо, це збільшує затримку поширення між різними командами. Це може призвести до випадків, коли погана взаємодія між змінами не виявляється протягом днів або тижнів, що ускладнює діагностику. Я рекомендую уникати тимчасової нестабільності за допомогою поступового розвитку і максимально швидко піддавати впливу всіх (стабільних) змін усіх інших.
Стюарт Маркс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.