Рейтинг:2

Как реализовать непрерывную интеграцию с Puppet и несколькими сервисами

флаг sa

Мы пытаемся реализовать конвейер непрерывной интеграции в нашей среде. У нас много разных сервисов, каждый со своим Git-репозиторием.Развертывание выполняется через Puppet с использованием внешнего классификатора узлов, который определяет, какие классы развертывать на каждом типе хоста. И файлы Puppet находятся в собственном репозитории Git, как показано здесь:

Марионетка и Git

Только это не просто 3 сервиса, это больше похоже на 100. Итак, проект Puppet — это чудовищный монолит из множества манифестов, и, конечно же, он находится в собственном независимом репозитории Git.

Теперь приходит старина я, которому поручено настроить шаблон для CI, чтобы, когда кто-то запрашивает слияние ветки, скажем, службы A, с мастером, мы могли запустить сборку CI, которая будет разверните виртуальную среду, разверните службу A на некоторых виртуальных машинах и убедитесь, что новая ветвь проходит все автоматизированные тесты. Конечно, проблема в том, что для развертывания новой сборки службы А мне нужно не только ее собрать, но и обновить манифест Puppet, чтобы он ссылался на новую версию сборки... а файлы Puppet находятся в полностью независимое репо, а не в моей ветке. Так что у меня нет простого способа сказать Хозяину Марионеток, что для это ветке нам нужно использовать сборку CI, а не основную версию.

Я не могу быть первым человеком, который когда-либо захочет настроить CI для такой среды, но я искал в Интернете решения и ничего не нашел. Возможно, я использую неправильные условия поиска.

Может ли кто-нибудь предложить подходящий шаблон проектирования, который позволит мне реализовать непрерывную интеграцию для всех моих сервисных репозиториев?

Рейтинг:2
флаг cn

Самый простой (но не обязательно лучший) способ, который я вижу, - это настроить что-то, что требует, чтобы CI создавал тестовую среду, для этого требуется совпадение имен ветвей или что-то в этом роде. Это заставит разработчиков создавать ветку в коде Puppet для развертывания своей версии сборки.

Эффективно:

  1. Dave the Developer создает новую ветку функций службы на основе заявки: например. функция/JIRA-999-какая-то задача
  2. Дэйв вводит свой код
  3. CICD обнаруживает новую ветку или PR или что-то еще, начинает работать
  4. Стадия конвейера ищет тем же имя ветки в репозитории Puppet
  5. Если ветка не существует, выдает ошибку конвейера и говорит Дейву создать ветку.
  6. Если он существует, может быть, добавить некоторую проверку, чтобы убедиться, что он был изменен?
  7. Запуск тестов
  8. Тесты проходят, все довольны

Это непростая проблема, и при таком подходе вы должны убедиться, что разработчики знают, где обновить версию (может быть, в файле данных Hiera?).

Единственный другой способ, которым я вижу эту работу, — это гораздо больший переход к чему-то вроде контейнеризации, позволяющему вам управлять одним уровнем (инфраструктурой) с помощью Puppet, а затем развертывать контейнеры поверх. Затем вы можете дать разработчикам инструменты для развертывания контейнеров, сохраняя при этом контроль над платформой.

И последняя случайная мысль: не могли бы вы провести некоторые тесты в облаке, чтобы избежать использования кода Puppet для чего-либо, кроме prod/staging? Или каким-то образом использовать облачную марионетку?

Shaul Behr avatar
флаг sa
Это хорошее предложение. Как оказалось, я больше склоняюсь к идее разбить монолит Puppet и поместить манифест Puppet, относящийся к службе, в репозиторий службы. Но твой ответ достоин награды. Спасибо!
Рейтинг:1
флаг us

Проблема здесь в том, что код не связан с развертыванием.

Мой подход заключался бы в том, чтобы передать хэш коммита Git в Puppet, а затем Puppet использовал бы этот хэш коммита, чтобы выбрать код для развертывания. Однако я не знаю, поддерживает ли Puppet передачу таких аргументов заданиям.

На этапе проверки фактического репозитория кода хэш будет записан и затем передан Puppet.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.