Вибачте за цей довгий пост, але я думаю, що воно того варте.
Я тільки почав з невеликого магазину .NET, який працює зовсім інакше в інших місцях, де я працював. На відміну від будь-яких моїх попередніх позицій, програмне забезпечення, написане тут, орієнтоване на декількох клієнтів, і не кожен клієнт отримує останню версію програмного забезпечення одночасно. Таким чином, немає "поточної виробничої версії". Коли клієнт отримує оновлення, він також отримує всі функції, додані до програмного забезпечення з моменту останнього оновлення, що може бути давно. Програмне забезпечення можна налаштувати і включати та вимикати функції: так звані "функції перемикання". Цикли випуску тут дуже тісні, адже вони не в розкладі: коли функція завершена, програмне забезпечення розгортається до відповідного клієнта.
Команда лише минулого року перейшла з Visual Source Safe на Team Foundation Server. Проблема полягає в тому, що вони все ще використовують TFS так, ніби це VSS та застосовують замовлення Checkout на одній гілці коду. Щоразу, коли виправлення помилок виводиться на поле (навіть для одного клієнта), вони просто будують все, що є у TFS, перевіряйте помилку та виправляйте її до клієнта! (Я сам походжу з програмного забезпечення аптеки та медичних пристроїв, це неймовірно!). У результаті виходить, що напівфабрикатний код розробника вводиться у виробництво, навіть не пройшовши тестування. Помилки завжди ковзають у версії версій, але часто клієнт, який щойно отримав збірку, не побачить цих помилок, якщо він не використовує функцію, в якій є помилка. Директор знає, що це проблема, оскільки компанія починає рости все раптово, коли на борту приходять декілька великих клієнтів та більш дрібні клієнти.
Мене попросили переглянути варіанти керування джерелами, щоб уникнути розгортання баггі чи незакінченого коду, але не принести в жертву дещо асинхронний характер випусків команд. Я використовував VSS, TFS, SVN та Bazaar у своїй кар’єрі, але TFS - це те, де більшість мого досвіду було.
Раніше більшість команд, з якими я працював, використовують два-три розгалужувальні рішення Dev-Test-Prod, де протягом місяця розробники працюють безпосередньо в Dev, а потім зміни об’єднуються в Test, потім Prod, або просуваються "коли це зроблено", а не на фіксований цикл. Автоматизовані побудови використовувались за допомогою круїз-контролю або збірки команди. У моїй попередній роботі Bazaar використовувався, сидячи на вершині SVN: розробки працювали у власних невеликих філіях функцій, потім підштовхували свої зміни до SVN (який був прив’язаний до TeamCity). Це було приємно тим, що було легко виділити зміни та поділитися ними з гілками інших народів.
З обома цими моделями була центральна розробка і розробка (а іноді і тестова) гілка, через яку проштовхували код (і мітки використовувались для позначення збірок в продукті, з яких були зроблені релізи ... і вони були зроблені у гілки для виправлення помилок до випусків та злиття назад до dev). Однак це не дуже відповідає способу роботи тут: немає наказу, коли будуть випущені різні функції, коли вони завершаться.
З цією вимогою "безперервна інтеграція" підходить, як я бачу, вона руйнується. Щоб вивести нову функцію при постійній інтеграції, її потрібно перенести через dev-test-prod, і це дозволить зафіксувати будь-яку незакінчену роботу в розробника.
Я думаю, що для того, щоб подолати це, нам слід спуститися на дуже розгалужену модель з НІ розгалуженими тестами, але джерело повинно існувати як серія функціональних гілок, які після завершення роботи над розробкою блокуються, перевіряються, фіксуються, фіксуються , випробуваний, а потім звільнений. Інші гілки функцій можуть захоплювати зміни від інших гілок, коли вони потребують / хочуть, тому зрештою всі зміни поглинаються у всіх інших. Це дуже підходить для чистої моделі Bazaar від того, що я відчував на своїй останній роботі.
Настільки ж гнучко, як це звучить, просто дивно не мати де-небудь стовбура розробника чи гілки prod, і я переживаю за те, щоб гілки змушували ніколи не повторно інтегруватися, або невеликі запізнілі зміни, які ніколи не перетягуються на інші гілки, а розробники скаржаться на злиття катастроф ...
Що з цього приводу думають народи?
Друге остаточне запитання: я дещо заплутаний у точному визначенні розподіленого керування джерелами: начебто деякі люди припускають, що мова йде про те, що він не має центрального сховища типу TFS або SVN, деякі кажуть, що про відключення (SVN на 90% відключений) а TFS має ідеально функціональний режим в режимі офлайн), а інші кажуть, що мова йде про функціональне розгалуження та простота злиття між гілками, які не мають стосунків батько-дитина (TFS також має безпідставне злиття!). Можливо, це вже друге питання!