Як ми можемо відслідковувати, яка версія нашого коду є у кожному середовищі?


14

Зараз моя команда використовує досить простий процес розгалуження / розгортання, який виглядає приблизно так:

                ┌────────┐ ┌────┐ ┌──────┐
 Environments:  │  DEV   │ │ QA │ │ PROD │
                └────────┘ └────┘ └──────┘

                     ▲       ▲       ▲
                     │       │       │

                ┌────────┐ ┌────┐ ┌──────┐
 Builds:        │  DEV   │ │ QA │ │ PROD │
                └────────┘ └────┘ └──────┘

                     ▲       ▲       ▲
                     │       │       │

                ┌────────┐ ┌────┐ ┌──────┐
 Branches:      │ master │ │ qa │ │ prod │
                └────────┘ └────┘ └──────┘

Кожне середовище має власну гілку (ми використовуємо git ) та власну збірку, яка використовує цю гілку. Коли ми хочемо просуватись із одного середовища в інше, наприклад, від DEV до QA, ми об'єднуємо masterгілку в qaта починаємо нову збірку QA (яка автоматично розгортається у середовищі QA).

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

                ┌────────┐     ┌────┐     ┌──────┐
 Environments:  │  DEV   │ ──► │ QA │ ──► │ PROD │
                └────────┘     └────┘     └──────┘

                      ▲ 
                       \ 

                        ┌───────────────┐
 Builds:                │ release build │
                        └───────────────┘

                                ▲
                                │

                ┌────────┐ ┌─────────┐
 Branches:      │ master │ │ release │
                └────────┘ └─────────┘

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

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

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

Як ми можемо відслідковувати, який код є у кожному середовищі?

Деякі варіанти, які ми розглядаємо:

  • використання тегів git для відстеження того, яка фіксація знаходиться в якому середовищі
  • вбудовування git-комітету, використовуваного build, у кожен пакет розгортання

У вас є система CI, наприклад, Хадсон чи Дженкінс? Чи здатна вона відштовхувати теги того, що вона побудувала назад, до git? (Я знаю, що для Хадсона та Дженкінса є плагіни, які можуть ... - не так впевнено щодо інших).

@MichaelT Ми використовуємо MSBuild для своїх версій та Octopus Deploy для розгортання. Я впевнений, що ми могли б змусити Octopus маніпулювати нашим сховищем git за допомогою спеціального сценарію розгортання Powershell.
Друг Натана

Відповіді:


14

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

Хоча це і є відповідь, яку ви шукаєте, вона вирішує лише половину проблеми. Інша - "ей, ось розгорнута .[wje]arна сервері, з чого вона склалася?" Ми знаємо, що ви ніколи не будете мати різні версії програми, розгорнуті в програмах dev і qa або prod. Правильно?

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

<manifestEntries>
    <Specification-Title>${project.name}</Specification-Title>
    <Specification-Version>${project.version}</Specification-Version>
    <Build-Number>${build.number}</Build-Number>
    <Build-Id>${build.id}</Build-Id>
    <Svn-Revison>${svn.revision}</Svn-Revison>
</manifestEntries>

Це в архіві Maven-war-плагін архіву. Але його можна знайти і в інших плагінах. Тоді в Хадсоні частина виклику Maven build:

-Dbuild.number=${BUILD_NUMBER}
-Dsvn.revision=${SVN_REVISION}
-Dbuild.id=${BUILD_ID}

який встановлює те, що визначає, що потім бере Мавен. І тоді лише питання шукати у файлі MANIFEST.MF, який був розгорнутий на сервері, щоб побачити, яка це версія.

Є плагін git , який пропонує аналогічний набір змінних середовища, включаючи:

  • GIT_COMMIT - SHA струму
  • GIT_BRANCH - Назва віддаленого сховища (за замовчуванням походження), а потім назва гілки, що використовується зараз, наприклад, "origin / master" або "origin / foo"

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


3

Зовсім інший підхід був би відмовитись від ідеї versionsповністю. У вас є лише "одна версія", яка має іншу настройку поведінки. Єдина відмінність полягала б у тому, що у вас є спільна кодова база - навіть у виробництві ви б розгортали незавершене виробництво : але не активовано.

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

Відключення / активація здійснюється за допомогою перемикачів функцій .

Вгору: весь процес випуску спрощений: Ви завжди постачаєте інтегровану версію свого програмного забезпечення. Кожна функція завжди доступна в master. Додаткові гілки не потрібні.

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

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

Можливо, це працює для вас.


А як щодо того, щоб різні стани репозиторію були розгорнуті на різних серверах? Чи код, який працює у вікні QA, такий самий, як і той, який працює на виробництві, щоб відтворити помилку? Чи код, який розробники натиснули на поле свого розробника, такий самий, як і код, проти якого працює QA?

1
Питання потрібно задавати по-іншому: чи відтворюється помилка зі спеціальною конфігурацією "зараз", якщо так, ви можете її виправити. Якщо ні - чи має значення клоп? Ви завжди натискаєте на робочий (і інтегрований код).
Томас Джунк

-1

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

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