Jenkins
Что это такое
Jenkins — самостоятельно размещаемый сервер автоматизации: вы устанавливаете его, указываете ему на свои репозитории и описываете сборки, которые он должен выполнять. Конвейеры обычно пишут кодом в файле внутри репозитория, а Jenkins выполняет их на агентах, которыми управляет. Он появился раньше хостинговых конвейеров и остаётся распространённым в организациях, которым нужны свои сборочные машины внутри собственной сети.
Почему это важно
Причина заводить собственный сервер автоматизации — контроль. Сборка должна дотянуться до внутреннего хранилища артефактов, подписать релиз или поговорить с базой данных, которой не видит ни один хостинговый раннер; либо организация просто не разрешает исходному коду и учётным данным покидать её сеть. Jenkins отвечает на эти требования и имеет огромную экосистему плагинов, собранную за много лет. Цена столь же конкретна: сервер и его агенты — это машины, которые вы патчите, плагины — поверхность совместимости, которую вы поддерживаете, а знание о том, как работает конвейер, живёт у того, кто его устанавливал.
Ключевые идеи
Машина, обновления и инциденты — ваши
Хостинговый конвейер — чужая эксплуатационная проблема; Jenkins — ваша. Доступность сервера становится вашей доступностью, диск, заполненный историей сборок, — вашим сбоем, а обновление безопасности для плагина — изменением, которое нужно запланировать и протестировать. Ценность сосредоточена в требовании, которое и заставило разместить всё самостоятельно, поэтому стоит проверить, что требование настоящее, прежде чем платить всю цену.
хостинг: провайдер управляет раннерами, обновлениями и доступностью
jenkins: ваша сеть достаёт до внутренних систем, и всё это эксплуатируете вы
Агенты определяют, куда достают сборки
Работа распределяется с контроллера на агентов, и сетевое положение агента решает, к чему имеют доступ его сборки. Агент внутри внутренней сети может развернуть в системы, до которых больше никто не достаёт, — в этом и смысл, и это же означает, что агент есть машина с учётными данными и сетевым доступом, которую стоит защищать. Привязка агента к коду, который он собирает, вместо разрешения любой задаче выполняться где угодно — базовый контроль.
Конвейер как код сохраняет определение обозримым
Запись конвейера в файле внутри репозитория делает его рецензируемым и версионируемым — таким же, как код, который он собирает. Настройка задач вручную в веб-интерфейсе даёт обратное: определение существует только в базе данных сервера, а восстановление после аварии означает собрать его по памяти.
Плагины — это и экосистема, и поверхность риска
Почти всё полезное приходит из плагина, а каждый плагин — ещё одна вещь, которая может отстать от исправления безопасности или конфликтовать с другой. Держать установленный набор небольшим и актуальным ценнее, чем принимать плагин ради каждого удобства. Плагины, которые не поддерживают годами, стоит считать обязательствами.
Сравнение — про требование, а не про возможности
Хостинговые и самостоятельно размещённые системы сходятся по возможностям; различаются они тем, где выполняется сборка, кто её эксплуатирует и как до неё доходят учётные данные. Команда, чей код и артефакты могут жить на хостинговом сервисе, получает от Jenkins немного, кроме эксплуатационной работы. Команда, которая не может, получает то, чего больше не даёт никто.
Практика
Сформулируйте требование до выбора
Запишите конкретную вещь, которую хостинговый раннер не может сделать для вашего проекта: дотянуться до внутренней системы, воспользоваться ключом подписи, соблюсти политику. Если список пуст, зафиксируйте, что хостинг — лучший вариант по умолчанию.
Готово, когда: вы можете назвать хотя бы одно жёсткое требование или пришли к выводу, что его нет.
Держите определение конвейера в репозитории
Возьмите задачу, настроенную вручную, и перенесите её логику в файл конвейера в репозитории, оставив серверу только учётные данные и конфигурацию агентов.
Готово, когда: удаление задачи и её пересоздание из файла дают то же поведение.
Частые ошибки
- Размещать всё самостоятельно потому, что хостинг стоит денег — эксплуатационная цена сервера и его плагинов обычно больше; исправить: сравните оба варианта полностью, включая своё время.
- Настраивать задачи вручную — конвейер существует только внутри сервера, его нельзя ни отрецензировать, ни восстановить; исправить: положите определение в репозиторий.
- Ставить плагин ради каждого удобства — каждый из них — поверхность совместимости и безопасности; исправить: держите набор небольшим и удаляйте неподдерживаемые.
- Позволять любой сборке идти на любом агенте — учётные данные и сетевой доступ разделяются шире, чем задумано; исправить: ограничьте, каким задачам можно идти на каких агентах.
- Забывать, что сервер — это зависимость — диск, забитый историей сборок, валит команду; исправить: наблюдайте за ним и ограничивайте хранение так же осознанно, как у любого продакшен-сервиса.
Что читать дальше
- CI/CD (06-cloud-devops/08-ci-cd) — практика, которую реализует этот сервер, поэтому читайте первым.
- GitHub Actions (06-cloud-devops/15-github-actions) — хостинговая альтернатива, с которой эта запись сравнивается.
- Режимы отказа конвейера (06-cloud-devops/08-ci-cd/02-pipeline-failure-modes) — способы, которыми любой конвейер, хостинговый или свой, теряет доверие команды.