Jenkins — программная система с открытым исходным кодом на Java, предназначенная для обеспечения процесса непрерывной интеграции программного обеспечения. Позволяет автоматизировать ту часть процесса разработки программного обеспечения, в котором уже не обязательно участие человека, обеспечивая функции непрерывной интеграции. Работает в сервлет-контейнере, таком например, Apache Tomcat.
Для чего нужен Jenkins:
- Автоматизация сборки. Разработчики загружают код в репозиторий (напр., GitHub), а Jenkins автоматически компилирует его.
- Тестирование. Каждый новый кусочек кода можно сразу прогонять через тесты, чтобы избежать ошибок.
- Развертывание. Готовое приложение можно сразу выкатывать на сервер, не тратя время на ручные операции.
- Гибкость. Jenkins поддерживает тысячи плагинов, позволяющих настроить процесс под конкретные задачи.
Как работает Jenkins?
Jenkins действует как оркестратор, который управляет процессами сборки, отладки, тестирования и развертывания кода. Он получает команды, выполняет их и сообщает о результатах.
Принцип работы:
- Разработчик вносит изменения в код, затем отправляет их в какой-либо репозиторий (Git, GitHub, Bitbucket).
- Jenkins отслеживает изменения, автоматически запускает процесс сборки.
- Во время сборки выполняются тесты, проверяющие работоспособность кода.
- После того, как тесты пройдены успешно, код упаковывается в артефакт (напр., Docker-образ).
- Jenkins развертывает обновление на тестовом или боевом сервере.
В основе работы Jenkins лежит подход непрерывной разработки. Это значит, что разработчики добавляют новые функции в код постоянно, как бы собирая воедино кусочки пазла. Другой подход — итеративный, когда сначала пишется полноценная версия программы, а уже потом тестируется и публикуется.
Непрерывная разработка состоит из двух частей:
- CI (continuous integration) — непрерывная интеграция. Идея в том, что все новшества в коде сразу добавляются в мастер-ветку проекта.
- CD (continuous delivery) — непрерывная доставка. Результаты работы программистов доставляются на сервер приложения или в тестовую среду, где их проверяют тестировщики.
Оба понятия обычно используются вместе, отсюда и название подхода — CI/CD.
Особенно эффективен Jenkins в связке с Docker. Docker позволяет контейнеризировать ваши приложения, создавая согласованные среды для разработки, тестирования и производства. Jenkins, в свою очередь, помогает автоматизировать такие задачи, как сборка, тестирование и развертывание вашего кода.
Связка
Jenkins и Kubernetes — это мощное и современное решение для организации полного цикла непрерывной интеграции и доставки (CI/CD). Jenkins отвечает за автоматизацию процессов CI/CD, а Kubernetes предоставляет масштабируемую и гибкую среду для развертывания и управления приложениями.
Основные сценарии использования связки
Существует два основных подхода к интеграции:
- Развертывание Jenkins в Kubernetes: Сам Jenkins (мастер и агенты) запускается как набор подов внутри кластера Kubernetes. Это обеспечивает высокую доступность, отказоустойчивость и масштабируемость самого инструмента CI/CD.
- Jenkins вне кластера управляет развертыванием в Kubernetes: Классический вариант, при котором Jenkins установлен на отдельном сервере (или виртуальной машине), но использует инструменты (например,
kubectl, Helm) для взаимодействия с удаленным кластером Kubernetes и развертывания приложений
- Масштабируемость: Kubernetes может автоматически запускать агенты Jenkins в виде подов по требованию (когда запускается сборка) и удалять их после завершения задачи.
- Изоляция сборок: Каждая задача CI/CD выполняется в чистом, изолированном контейнере (поде), что исключает влияние одной сборки на другую.
- Эффективное использование ресурсов: Ресурсы кластера используются только тогда, когда это необходимо для выполнения конкретной задачи, что оптимизирует затраты.
- Декларативное управление: Используя “инфраструктуру как код” (IaC), конфигурацию Jenkins и процессов развертывания можно хранить в Git-репозиториях, обеспечивая воспроизводимость.
- Плагин Kubernetes: Основной плагин для Jenkins, который позволяет динамически создавать агентов Jenkins в кластере Kubernetes.
- Docker: Используется для создания образов приложений.
kubectlCLI: Инструмент командной строки для взаимодействия с API Kubernetes.- Helm или ArgoCD: Инструменты для управления развертыванием приложений в кластере с использованием шаблонов (Helm-чарты) или подхода GitOps.
- Разработчик отправляет код в репозиторий (например, Git, GitHub).
- Jenkins обнаруживает изменения и запускает пайплайн.
- Jenkins динамически запрашивает у Kubernetes запуск пода-агента для выполнения задачи.
- Внутри пода-агента происходит сборка приложения, его тестирование и создание Docker-образа.
- Образ пушится в реестр контейнеров (например, Docker Hub, GCR).
- Jenkins (или другой инструмент, например, ArgoCD) обновляет манифесты Kubernetes (например, Helm-чарт или YAML-файл) с новым тегом образа и применяет их к кластеру, запуская процесс развертывания.
- Kubernetes управляет обновлением приложения, обеспечивая его доступность и масштабирование.