Архитектура Jenkins: контроллер, агенты, узлы и исполнители

Рейтинг: 60.1% · 14 голосов
Подробный курс по Jenkins и CI/CD: установка и настройка, плагины и Configuration as Code, конвейеры (pipeline) и Jenkinsfile, declarative и scripted, агенты, Docker и Kubernetes, общие библиотеки на Groovy, безопасность и credentials, интеграции (SonarQube, артефакты), траблшутинг. Актуально на 2026.
Ответить
Аватара пользователя
Andrey_CICD
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Архитектура Jenkins: контроллер, агенты, узлы и исполнители

Сообщение Andrey_CICD »

Оглавление курса (47)
  1. Что такое Jenkins и зачем нужен CI/CD
  2. Jenkins в 2026: версии, экосистема и сравнение с GitLab CI и GitHub Actions
  3. Архитектура Jenkins: контроллер, агенты, узлы и исполнители (вы здесь)
  4. Установка Jenkins: пакеты, Docker и Kubernetes
  5. Первичная настройка Jenkins: мастер, плагины, пользователи
  6. Плагины Jenkins: установка, обновление и ключевой набор
  7. Configuration as Code (JCasC): настройка Jenkins декларативно
  8. Конвейеры Jenkins и Jenkinsfile: pipeline as code
  9. Scripted против Declarative: два синтаксиса конвейера
  10. Структура конвейера: node, stage, steps и первый pipeline
  11. Генератор сниппетов, запуск конвейера и Replay
  12. Типы заданий Jenkins: Freestyle, Pipeline, Multibranch и Organization
  13. Декларативный конвейер: структура pipeline, agent, stages
  14. agent, environment и переменные в конвейере
  15. tools, options, parameters и triggers в декларативном конвейере
  16. stages, parallel и matrix: организация этапов
  17. Условное выполнение when и блок post
  18. Триггеры сборки: webhook от GitHub, SCM polling и расписание
  19. Параметры сборки и пользовательский ввод
  20. Управление потоком: timeout, retry, sleep и waitUntil
  21. Параллелизм и блокировки: parallel, lock, milestone
  22. Постобработка и уведомления о результате сборки
  23. Groovy для Jenkins: основы скриптового конвейера
  24. Скриптовый конвейер: логика, циклы и функции
  25. Общие библиотеки Jenkins: Shared Libraries
  26. Подключение и загрузка общих библиотек
  27. Шаги оболочки: sh, bat, powershell и коды возврата
  28. Переменные среды, withEnv и рабочие пространства
  29. Работа с файлами, артефактами и отпечатками
  30. Сборка проектов в конвейере: Maven, Gradle, npm
  31. Качество кода: SonarQube и покрытие тестами
  32. Управление артефактами: публикация в Nexus и Artifactory
  33. Docker в Jenkins: образы как агенты сборки
  34. Сборка и публикация Docker-образов из конвейера
  35. Jenkins в Kubernetes: динамические pod-агенты
  36. Развёртывание в Kubernetes из конвейера
  37. Безопасность Jenkins: аутентификация и матрица прав
  38. Учётные данные Jenkins: credentials в конвейере
  39. Безопасность сценариев: Groovy sandbox и Vault
  40. Уведомления и отчёты: email, Slack, Telegram, HTML
  41. Blue Ocean и интерфейс Jenkins в 2026
  42. Автоматизация Jenkins: CLI, REST API и script console
  43. Поиск и устранение неисправностей: читаем логи конвейера
  44. Типичные ошибки конвейера: сериализация и неутверждённый код
  45. Эксплуатация Jenkins: бэкап, обновление, масштабирование
  46. Конвертация и миграция: от Freestyle к Jenkinsfile
  47. Итог: сквозной CI/CD конвейер и Jenkins против альтернатив в 2026
Ты поставил Jenkins, запустил первую сборку, она прошла - и всё работает прямо на той машине, где крутится сам Jenkins. Знакомо? Так начинают почти все. А потом проектов становится десять, сборки лезут друг на друга, диск забивается артефактами, и в один прекрасный день тяжёлый билд кладёт весь сервер вместе с веб-интерфейсом. Чтобы такого не случилось, нужно понять, из каких кусков Jenkins реально состоит и кто за что отвечает. Разберём это раз и навсегда: контроллер, агенты, узлы и исполнители - четыре понятия, на которых стоит вся система.

Контроллер: мозг, а не рабочая лошадь

Центральный процесс называется контроллер (controller). Раньше его звали master, но термин ушёл в прошлое вместе с slave - современная документация говорит только controller и agent, и ты тоже привыкай так писать и думать. Что делает jenkins контроллер? Он держит конфигурацию, хранит историю сборок и пайплайнов, отдаёт веб-интерфейс и REST API, ставит задачи в очередь и решает, куда их отправить. По сути это диспетчер: он не копает, он командует.

Ключевая мысль урока: на контроллере НЕ собирают. Никогда в проде. Причин несколько. Во-первых, безопасность - код сборки (а это произвольные скрипты из репозитория) не должен исполняться там, где лежат секреты, креды и конфиг всего CI. Один зловредный Jenkinsfile - и злоумышленник внутри сердца системы. Во-вторых, стабильность: тяжёлая компиляция или прожорливый тест съедают память и CPU, и тогда падает не одна сборка, а вообще всё. Поэтому у контроллера должно быть ноль исполнителей.

Сделать это можно руками через "Manage Jenkins" -> "Nodes", а правильнее - декларативно через Configuration as Code (JCasC), чтобы настройка жила в git, а не в чьей-то голове:

Код: Выделить всё

jenkins:
  numExecutors: 0
  mode: EXCLUSIVE
  labelString: "controller"

Код: Выделить всё

numExecutors: 0
запрещает контроллеру брать работу.

Код: Выделить всё

mode: EXCLUSIVE
означает "выполнять только задачи, явно привязанные к моим меткам" - то есть фактически ничего. JCasC - это уже актуализация на 2026 год, в книге Ластера 2018 года его ещё толком нет, а сегодня без него серьёзный Jenkins не настраивают.

Изображение

Узлы, агенты и executor: где реально идёт работа

Теперь к рабочей части. Здесь три термина, которые новички путают, поэтому разложим по полочкам.

Узел (node) - это абстракция "машины", которая может выполнять задачи. Jenkins node - общий термин: сам контроллер тоже формально является узлом (built-in node), но рабочие узлы - это отдельные машины. Когда в Jenkinsfile пишут шаг в скриптовом пайплайне - это запрос "дай мне любой узел и рабочую директорию на нём".

Агент (jenkins agent) - это процесс, который запущен на узле и подключён к контроллеру; именно он принимает команды и выполняет шаги сборки. На практике "узел" и "агент" в речи часто сливаются в одно, и это нормально: агент - это узел, готовый к работе.

Исполнитель (jenkins executor) - это слот параллельного выполнения на узле. Один executor = одна задача в один момент времени. Если у агента четыре исполнителя, он тянет до четырёх сборок одновременно. Сколько ставить? Грубое правило - примерно по числу ядер, но смотри на профиль нагрузки: тяжёлые сборки душат друг друга, и иногда два executor дают больше реальной пропускной способности, чем восемь. Jenkins executor - это ровно та единица, которой ты управляешь пропускной способностью своего CI.

Схема такая: контроллер ставит задачу в очередь -> ищет свободный executor на подходящем узле -> отдаёт работу агенту -> агент выполняет шаги и шлёт логи обратно.

Как агент подключается к контроллеру

Способов три, и выбор зависит от инфраструктуры.

1. SSH. Контроллер сам заходит по SSH на удалённую машину, кладёт туда agent.jar и запускает. Удобно для статических Linux-серверов: ничего не надо ставить заранее, нужен только Java и SSH-доступ. Это исходящее соединение от контроллера к агенту.

2. Inbound (бывший JNLP). Здесь наоборот: агент сам стучится на контроллер. Подходит, когда агент за NAT или фаерволом и контроллер до него не достучится (типичный случай - агенты в DMZ или Windows-машины). Запускается примерно так:

Код: Выделить всё

java -jar agent.jar \
  -url https://jenkins.example.ru/ \
  -secret @secret-file \
  -name "win-build-01" \
  -workDir /home/jenkins/agent
3. По требованию (on-demand) через облака. Docker или Kubernetes поднимают агента под конкретную сборку и гасят после. Об этом - в следующем блоке, это главный тренд.

Важная деталь про версии: агенту нужна совместимая Java. Текущая LTS на середину 2026 - Jenkins 2.541.1 (январь 2026), линейка 2.541.x - последняя с поддержкой Java 11, а начиная с 2.555.1 контроллер и агенты требуют уже Java 21 (или 25), Java 17 там не поддерживается. Так что планируя парк агентов, держи Java в актуальном состоянии, иначе свежий контроллер просто откажется с ними работать.

Метки (labels): как направить задачу на нужный узел

У тебя есть Linux-агенты, Windows-агенты, машина с GPU и узел с доступом в прод-сеть. Как сказать сборке "иди именно на Linux с Docker"? Через метки. Каждому узлу вешаешь метки (linux, docker, gpu, arm64), а в пайплайне указываешь, что тебе нужно:

Код: Выделить всё

pipeline {
    agent { label 'linux && docker' }
    stages {
        stage('Build') {
            steps {
                sh 'docker build -t myapp:${BUILD_NUMBER} .'
            }
        }
        stage('Test') {
            agent { label 'gpu' }
            steps {
                sh './run-gpu-tests.sh'
            }
        }
    }
}
Обрати внимание: можно задать на весь пайплайн и переопределить на отдельном stage. Выражения с и работают -

Код: Выделить всё

linux && docker
выберет узел, у которого есть обе метки. Это и есть маршрутизация задач: не привязывайся к именам конкретных машин, привязывайся к их возможностям через метки. Машина умрёт - заменишь, и пайплайн не заметит.

Статические и эфемерные агенты: куда всё идёт

Статический агент - это всегда работающая машина (VM или физический сервер), которая постоянно подключена. Минусы очевидны: она простаивает и жрёт деньги, когда сборок нет; на ней накапливается мусор от предыдущих билдов (грязный кеш, чужие зависимости), и "у меня собралось, а у тебя нет" - классика именно отсюда.

Эфемерный агент решает обе беды. Под каждую сборку поднимается чистый одноразовый pod в Kubernetes, выполняет работу и уничтожается. Никакого мусора, оплата только за время сборки, идеальная воспроизводимость. Это стандарт 2026 года для динамического CI. В declarative-пайплайне это выглядит так:

Код: Выделить всё

pipeline {
    agent {
        kubernetes {
            yaml '''
                apiVersion: v1
                kind: Pod
                spec:
                  containers:
                  - name: maven
                    image: maven:3.9-eclipse-temurin-21
                    command: ["sleep"]
                    args: ["infinity"]
            '''
            retries 2
        }
    }
    stages {
        stage('Build') {
            steps {
                container('maven') {
                    sh 'mvn -B clean package'
                }
            }
        }
    }
}

Код: Выделить всё

retries 2
- современная штука: если pod не поднялся из-за сбоя инфраструктуры, Jenkins повторит на свежем поде, а не уронит сборку. Шаг

Код: Выделить всё

container('maven')
переключает выполнение в нужный контейнер пода. Pod живёт ровно столько, сколько идёт блок, и удаляется сразу после.

Раз уж актуализируем: интерфейс Blue Ocean, который во многих туториалах преподносят как современный вид Jenkins, сегодня в режиме поддержки - новых фич не получает, только критичные багфиксы. Не строй на нём ничего нового, это наследие. И ещё к слову о выборе инструмента: у GitLab CI и GitHub Actions агенты (runner-ы) и эфемерность встроены из коробки, конфиг лежит в YAML рядом с кодом. Jenkins же даёт максимальную гибкость и контроль над парком узлов ценой того, что эту архитектуру - контроллер, агенты, метки - надо понимать и настраивать руками. Зато теперь ты её понимаешь.

Типичные грабли
  • Оставили исполнителей на контроллере. Сборки идут на нём же, секреты под угрозой, сервер падает под нагрузкой. Лечится

    Код: Выделить всё

    numExecutors: 0
    .
  • Перекрутили число executor "по числу ядер x2" и удивляются, почему всё тормозит. Тяжёлые сборки конкурируют за память и диск - меньше иногда быстрее.
  • Жёстко прописали имя узла вместо метки. Машину пересоздали - пайплайны посыпались. Всегда через label.
  • Несовместимая Java на агенте. Обновили контроллер до новой LTS - старые агенты с Java 11/17 отвалились.
  • Думают, что эфемерный pod сохранит кеш между сборками. Нет, он одноразовый. Кеш зависимостей выноси в persistent volume или внешний кеш.
Мини-лаба
  • Зайди в "Manage Jenkins" -> "Nodes" и убедись, что у built-in node стоит 0 исполнителей. Если нет - поставь.
  • Подними один статический агент по SSH: дай ему метки linux и docker, выставь 2 executor.
  • Напиши минимальный declarative-пайплайн с

    Код: Выделить всё

    agent { label 'linux && docker' }
    и шагом

    Код: Выделить всё

    sh 'echo $NODE_NAME && nproc'
    . Запусти, посмотри в логе, на каком узле он отработал.
  • Поставь в очередь три сборки разом и посмотри в "Build Executor Status", как они разбираются по исполнителям.
Контрольные вопросы
  • Почему на контроллере в проде не должно быть исполнителей - назови две причины (безопасность и что ещё)?
  • Чем узел (node) отличается от исполнителя (executor)? Сколько задач тянет один executor?
  • Когда выбирать inbound-подключение агента вместо SSH?
  • В чём практическая разница между статическим и эфемерным агентом и почему второй воспроизводимее?
Итог

Контроллер оркеструет и хранит состояние, но сам не собирает. Агенты выполняют работу на узлах, а число исполнителей на узле задаёт, сколько задач идёт параллельно. Подключение бывает SSH, inbound или по требованию через Docker/Kubernetes. Метки маршрутизируют задачи по возможностям, а не по именам машин. И главный вектор 2026 года - эфемерные одноразовые агенты в Kubernetes: чисто, дёшево, воспроизводимо. Дальше в курсе именно к ним и идём.
👍7 ❤️1 🔥1 😄 🤔
Аватара пользователя
raspberry_smith
Сообщения: 1
Зарегистрирован: 17 май 2026, 04:09

Re: Архитектура Jenkins: контроллер, агенты, узлы и исполнители

Сообщение raspberry_smith »

Спасибо, наконец дошло чем node отличается от executor, я думал это одно и то же. У меня на контроллере стояло 4 исполнителя, сейчас же выключу.
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
scaladev
Сообщения: 1
Зарегистрирован: 11 май 2026, 15:51

Re: Архитектура Jenkins: контроллер, агенты, узлы и исполнители

Сообщение scaladev »

А если кеш maven выносить в persistent volume для эфемерных подов, не будет ли гонки когда две сборки одновременно лезут в один .m2? Или там какой-то локинг?
👍1 ❤️ 🔥1 😄 🤔
Ответить
← Предыдущая глава
Jenkins в 2026: версии, экосистема и сравнение с GitLab CI и GitHub Actions
Следующая глава →
Установка Jenkins: пакеты, Docker и Kubernetes

Все главы курса «Jenkins: конвейеры CI/CD от основ до продакшена»

Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое jenkins простыми словамикак установить jenkins на linux и в dockerпервичная настройка jenkins после установкикакие плагины jenkins нужны новичкукак настроить агенты jenkins для сборкиcicd для начинающих с чего начать на jenkins

Вернуться в «Jenkins: конвейеры CI/CD от основ до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость