Декларативный конвейер: структура pipeline, agent, stages

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

Декларативный конвейер: структура pipeline, agent, stages

Сообщение 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
Зачем вообще нужна жёсткая структура

Если ты когда-нибудь открывал чужой Jenkinsfile, написанный в стиле "как пошло, так и пошло", то знаешь эту боль: сто строк Groovy, переменные плодятся посреди логики, try/catch обмотан вокруг половины сборки, и понять, где тут вообще этапы, можно только запустив. Scripted pipeline даёт полную свободу - и ровно поэтому в нём так легко устроить помойку, которую через полгода никто (включая автора) не хочет трогать.

Declarative pipeline появился как ответ на этот хаос. Это не отдельный язык, а строгий каркас поверх того же Pipeline-движка: ты описываешь, ЧТО должно произойти и в каком порядке, а не как именно это исполнить шаг за шагом. Структура фиксированная, валидируется до запуска, читается сверху вниз как нормальный конфиг. В 2026 году declarative - это стандарт де-факто: с него начинают, на нём держат прод, а scripted достают только там, где реально нужна динамика (например, генерация этапов в цикле). Именно поэтому весь оставшийся курс мы будем вешать на этот скелет, и в этом уроке разберём его до косточек.

Сравни с соседями по цеху: в GitLab CI и GitHub Actions ты вообще пишешь YAML, где структура задана жёстко самим форматом. Declarative - это попытка Jenkins дать ту же предсказуемость, но с возможностью в любой момент провалиться в Groovy через блок script, когда декларативности перестаёт хватать. Лучшее из двух миров, если не злоупотреблять.

Изображение

Обязательная структура jenkins pipeline

У любого declarative pipeline есть жёсткий минимум, без которого он просто не запустится. Вот этот минимум, голый каркас:

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

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Собираем проект'
            }
        }
    }
}
Разбираем по слоям, потому что в этой матрёшке важен каждый уровень:
  • pipeline - внешний блок, обёртка вокруг всего. Весь декларативный код живёт строго внутри него. Снаружи - ничего, кроме разве что общих shared library импортов.
  • agent - где исполняется конвейер. Обязателен либо на верхнем уровне, либо в каждом stage. Это ответ на вопрос "на какой машине крутить сборку".
  • stages - контейнер для этапов. Внутри - один или несколько блоков stage.
  • stage('имя') - конкретный этап с обязательным именем в кавычках. Имя попадёт в визуализацию, поэтому называй по-человечески: Build, Test, Deploy.
  • steps - то, что реально выполняется внутри этапа. Без steps stage невалиден.
Запомни простое правило валидности declarative структуры: есть pipeline, внутри ровно один agent (вверху или поэтапно), внутри stages хотя бы один stage, внутри него хотя бы один step. Уберёшь любой из этих уровней - линтер тебя развернёт ещё до запуска. Это и есть сила подхода: ошибку каркаса ты ловишь за секунду, а не на пятой минуте сборки.

Как работает jenkins agent: any, none, label

Директива agent отвечает на вопрос, на каком исполнителе крутится твой код. Здесь три рабочих режима, которые нужно знать наизусть.

agent any - бери любой свободный агент. Самый частый вариант для простых сборок: Jenkins сам выберет узел, выделит workspace и запустит там все этапы.

agent { label '...' } - привязка к агенту по метке. Так ты говоришь "мне нужна машина с Docker" или "собирай только на linux-узлах". Метки навешиваются на агентов в настройках, и это основной инструмент маршрутизации нагрузки:

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

pipeline {
    agent { label 'linux && docker' }
    stages {
        stage('Build') {
            steps {
                sh 'docker build -t myapp:${BUILD_NUMBER} .'
            }
        }
    }
}
Выражение в label поддерживает логику: 'linux && docker' значит "узел, у которого есть обе метки сразу".

agent none - на верхнем уровне глобальный агент НЕ выделяется. Это осознанный приём для тяжёлых конвейеров: ты не держишь дорогую машину занятой всё время сборки, а назначаешь jenkins agent точечно, на каждом этапе свой. Но за свободу надо платить: при agent none каждый stage обязан объявить собственный agent, иначе сборка падает.

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

pipeline {
    agent none
    stages {
        stage('Build') {
            agent { label 'builder' }
            steps {
                sh 'make build'
            }
        }
        stage('Deploy') {
            agent { label 'deploy-host' }
            steps {
                sh './deploy.sh production'
            }
        }
    }
}
Важная деталь про эфемерность 2026 года: вместо статичных меток на постоянных машинах современные команды всё чаще поднимают агентов в Kubernetes. Через плагин kubernetes-plugin в agent описывается под-шаблон, и под создаётся под сборку, а потом удаляется. Никаких "вечных" исполнителей, копящих мусор в workspace:

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

pipeline {
    agent {
        kubernetes {
            yaml '''
                apiVersion: v1
                kind: Pod
                spec:
                  containers:
                  - name: maven
                    image: maven:3.9-eclipse-temurin-21
                    command: ['sleep']
                    args: ['infinity']
            '''
        }
    }
    stages {
        stage('Build') {
            steps {
                container('maven') {
                    sh 'mvn -B clean package'
                }
            }
        }
    }
}
Директивы вокруг каркаса и порядок разделов

Каркас pipeline/agent/stages - это скелет, но на него навешивается набор директив верхнего уровня. Их полезно знать сразу, потому что именно их ты будешь дописывать в каждом боевом Jenkinsfile:
  • environment - переменные окружения. Объявленные вверху видны всем этапам, объявленные внутри stage - только ему.
  • options - опции сборки: таймауты, число хранимых сборок, запрет параллельного запуска.
  • parameters - параметры, которые спрашиваются при ручном запуске (строки, булевы, выбор из списка).
  • triggers - автозапуск: по cron, по опросу SCM, по вебхуку.
  • post - что сделать в конце: блоки always, success, failure, unstable. Сюда вешают уведомления и очистку.
Соберём всё вместе в близкий к реальности пример:

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

pipeline {
    agent any
    options {
        timeout(time: 30, unit: 'MINUTES')
        buildDiscarder(logRotator(numToKeepStr: '20'))
    }
    environment {
        APP_VERSION = "1.0.${BUILD_NUMBER}"
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
        }
    }
    post {
        always {
            junit '**/target/surefire-reports/*.xml'
        }
        failure {
            echo "Сборка ${APP_VERSION} упала, разбираемся"
        }
    }
}
Про порядок разделов есть тонкость. Синтаксически Jenkins не заставляет располагать директивы в строгой последовательности - валидатор пропустит и переставленные блоки. Но есть общепринятый порядок чтения, которого держится вся индустрия: agent, options, parameters, environment, triggers, stages, post. Соблюдай его - и любой коллега прочитает твой Jenkinsfile за десять секунд, а не будет искать stages где-то посреди файла. Это не каприз, это гигиена.

Типичные грабли
  • Забыл steps внутри stage. Пустой stage невалиден. Если этап-заглушка нужен, поставь хотя бы echo.
  • agent none без agent на этапах. Классика: объявил none сверху, а в stage агента не указал - сборка падает с ошибкой ещё на старте.
  • Groovy-логика прямо в steps. Внутри steps нельзя писать произвольный Groovy (циклы, присваивания) - только шаги. Нужна логика - оборачивай в блок script { ... }, но не злоупотребляй: много script внутри declarative - сигнал, что пора пересмотреть подход.
  • Ставка на Blue Ocean. Красивый редактор конвейеров фактически заброшен и не развивается. Не строй на нём рабочий процесс - пиши Jenkinsfile руками в репозитории, это и есть pipeline as code.
  • Имя stage без кавычек. stage(Build) - синтаксическая ошибка. Имя этапа всегда строка: stage('Build').
Мини-лаба

Руками, чтобы отложилось:
  • Создай pipeline-задание, вставь голый каркас из первого примера, запусти. Убедись, что собралось.
  • Удали блок steps и нажми Replay - посмотри, как линтер ругается. Верни обратно.
  • Переделай конвейер на agent none с двумя этапами, каждому задай свой agent { label '...' } (метку можно взять у встроенного узла). Запусти, открой визуализацию stages.
  • Добавь блок post с секциями always и failure, специально сломай команду в steps (например, sh 'exit 1') и проверь, что отработал именно failure.
Для проверки синтаксиса до запуска используй кнопку Replay (правит и перезапускает копию) или Declarative Linter - он умеет валидировать Jenkinsfile через CLI или REST, не запуская сборку. Привыкай гонять линтер в pre-commit, это экономит кучу красных сборок.

Контрольные вопросы
  • Какие четыре уровня вложенности обязательны в минимальном валидном declarative pipeline?
  • Чем agent none отличается от agent any и что обязательно делать в каждом stage при agent none?
  • Куда поместить переменную окружения, чтобы она была видна только одному этапу, а не всему конвейеру?
  • Почему произвольный Groovy нельзя писать прямо в steps и как из этой ситуации выходят?
Итог

Declarative pipeline - это строгий, предсказуемый каркас: pipeline снаружи, agent для выбора исполнителя, stages с отдельными stage, внутри каждого steps. Этот скелет валидируется до запуска и читается как конфиг. Разберёшься с jenkins stages, режимами agent и порядком директив - и дальше любой урок курса будет просто навешиванием новых возможностей на уже знакомую структуру. Следующий шаг - параметры, переменные окружения и условия, которые оживят этот каркас.
👍3 ❤️5 🔥1 😄 🤔3
Аватара пользователя
haskell95
Сообщения: 1
Зарегистрирован: 21 май 2026, 00:01

Re: Декларативный конвейер: структура pipeline, agent, stages

Сообщение haskell95 »

Вот про agent none наконец дошло, спасибо. Гонял сборку на одной жирной машине целый час, хотя деплой там на 30 секунд. Раскидал по этапам с метками - исполнители освобождаются сразу.
👍 ❤️ 🔥1 😄 🤔
Аватара пользователя
silentgopher
Сообщения: 1
Зарегистрирован: 13 май 2026, 22:39

Re: Декларативный конвейер: структура pipeline, agent, stages

Сообщение silentgopher »

Вопрос: а если внутри steps мне реально нужен цикл по списку сервисов, script { } это нормальное решение или уже повод уходить в scripted pipeline целиком?
👍1 ❤️1 🔥1 😄 🤔
Ответить
← Предыдущая глава
Типы заданий Jenkins: Freestyle, Pipeline, Multibranch и Organization
Следующая глава →
agent, environment и переменные в конвейере

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое jenkins простыми словамикакие плагины jenkins нужны новичкуcicd для начинающих с чего начать на jenkinsjenkinsfile declarative или scripted что выбратьgroovy в jenkins scripted pipeline как написатьjenkins shared library как создать и подключить

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

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

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