Як ви тримаєте випущені бінарні файли під контролем версій?


14

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


Що ви маєте на увазі під "відстежувати, які речі змінилися"? Які атрибути бінарних файлів випуску ви (або хочете бути) відстежуєте? Це просто здається дивним, тому мені цікаво.
Джеремі Хайлер

наприклад, між v1.0.0 і v1.0.1, змінюється лише ABC.exe, тоді як залежність DEF.dll залишається незмінною
linquize

1
Як ви це визначаєте, дивлячись на бінарні файли?
Джеремі Хайлер

відрізняти стару та нову версію того самого файлу
посилання на

Відповіді:


21

Два варіанти:

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

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

Так чи інакше, бінарні файли та інший вихід збірки не належать під контролем джерела з численних причин.


7
а) часто неможливо, звичайно, blogs.msdn.com/b/ericlippert/archive/2012/05/31/…
jk.

@jk: приємне посилання. Я думаю, що вихідний код і всі вхідні файли для етапу збирання повністю під контролем джерела (і встановлена ​​правильна версія компілятора) може бути "детермінованим" у багатьох сценаріях реального світу (а в інших, звичайно, недостатньо) ). Залежно від регістру наскільки важливо мати відтворювані бінарні файли побіжно.
Док Браун

10

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

Дивіться, наприклад, сховища Maven як сховище для архівування / публікації / пропозиції випусків та інших бінарних файлів (наприклад, таких як документація)


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

2
gbjbaanb, SCM розшифровується як "Управління контролем над джерелами". Це має дати кому-небудь натяк, що ці системи призначені не для зберігання бінарних файлів, а для джерел. Якщо ви все ще хочете зберігати бінарні файли, продовжуйте. Я не буду.
малер

4
SCM розшифровується як "Управління програмним забезпеченням", але приємна спроба. "вихідний код" часто є не просто текстовими файлами, а зображеннями, документами, діаграмами тощо
gbjbaanb

Зазвичай "Управління конфігурацією програмного забезпечення". Я ніколи не чув про "Управління програмним забезпеченням управління".
Джеймс МакЛейд

7

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

Більшість дельта-бінарних файлів SCM досить добре, ми використовували для того, щоб увімкнути dll ресурсу 2 Мб у наш SVN, і він буде дельтувати до декількох кб кожного разу.

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

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


1
@ MarnenLaibow-Koser Ви, очевидно, довго не працювали в галузі. Середовища побудови змінюються з часом, тому, хоча ви зможете відновити старий, швидше за все, вам доведеться витратити дні, відтворюючи ENV за допомогою правильних старих інструментів та SDK. Я сподіваюся, що ви
роздумували

1
Я думаю, ви зможете створити старий двійковий файл VC6, який був складений на комп'ютері XP за допомогою старого SDK, який Microsoft вже не вважає за потрібне випускати. Якщо хтось запитує цей двійковий файл, його легко просто схопити з того самого місця, все інше зберігається. Витрати на управління, які є величезними, порівняно з болем, що потребують відновлення, і витрати на його зберігання з джерелом незначні. Я був там (із додатком VB6, зробленим із стороннім контролем, коли клієнт повідомив про помилку - отримати бінарний файл та запустити його було набагато простіше, ніж відновити його, що виявилося неможливим)
gbjbaanb

1
@gjbaanb Я також визнаю, що ви перебуваєте в іншій ситуації, ніж у мене іншим чином: всі мої зовнішні залежності - це ОС, тому вони не можуть піти тільки тому, що якась компанія більше не вважає за потрібне звільнити їх.
Marnen Laibow-Koser

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

1
@gjbaanb І я можу сказати, що ви помиляєтесь з цього приводу. :) Звичайно, VCS можуть зберігати все, але вони не надто налаштовані для зберігання файлів, які живуть лише за один комітет (адже ви не хочете, щоб ваш R500 збирався в репо на R550; це буде просто заплутано) . Принципова проблема зберігання артефактів складання в репо не полягає в тому, що вони є бінарними , а в тому, що вони отримують дані і не синхронізуються зі своїм джерелом у тому ж репо. Ті ж аргументи, які я використовую, застосовуватимуться до створених текстових файлів.
Marnen Laibow-Koser

5

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

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


1

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

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

Наприклад, якщо ви використовуєте SVN, використовуйте основну галузеву організаційну схему; робити щоденні розробки в / trunk та створювати / тег для кожного випуску, як тільки він буде готовий.

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

  • / builds / trunk / [rev] [дата] [build_id] /
  • / builds / tags / release_0_1_3beta4 / [rev] [дата] [build_id] /

Системі збірки потрібно буде ставитись до каталогу / builds / trunk /, як до кругового буфера, зберігаючи останні n збірки, видаляючи старі збірки в міру його виконання.

Каталог / builds / tags / , з іншого боку, є постійним магазином. Самі артефакти збірки зберігаються в каталогах з іменами, згенерованими відповідно до наступної схеми:

  • [rev] [дата] [build_id]

де [rev] - ідентифікаційний номер редакції SVN, [дата] - дата у форматі YYYYMMDD, а [build_id] - це 3-значний унікальний лічильник, що збільшується від першої збірки вперед, що робить кожен каталог збірки унікальним.

Детально описаний вище процес дає вам наступні переваги:

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

  2. Це є основою для подальшої автоматизації випуску. Наприклад, автоматична генерація документів, що випускаються тощо ...

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