Конвейеры Jenkins и Jenkinsfile: pipeline as code

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

Конвейеры Jenkins и Jenkinsfile: pipeline as code

Сообщение 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
Представь типичную боль. У тебя есть Freestyle-проект, который ты собирал руками через веб-интерфейс: натыкал галочек, вписал команды сборки в текстовые поля, подключил пару плагинов. Работает. А потом коллега спрашивает: "А как именно собирается этот сервис?" И ты честно отвечаешь: "Ну, надо зайти в Jenkins, открыть конфигурацию джобы и посмотреть". Этого описания нет в репозитории. Его нельзя заревьюить в pull request. Если контроллер упадёт и бэкап окажется кривым, ты восстанавливаешь конвейер по памяти. А если кто-то случайно поменял галочку в UI - никто и не заметит, история изменений нигде не хранится.

Именно эту боль решает главная фича второго поколения Jenkins. Конвейер описывается кодом и лежит рядом с приложением. Этот подход называется pipeline as code, а файл с описанием - Jenkinsfile. Давай разберёмся, как это работает и почему это сердце всего курса.

Что такое Jenkinsfile и почему pipeline as code меняет правила

Jenkins pipeline - это вся последовательность сборки, тестов, упаковки и деплоя, описанная как единый процесс. Раньше эта логика жила внутри Jenkins, в его базе конфигураций. Теперь она переезжает в обычный текстовый файл с именем Jenkinsfile, который ты кладёшь в корень своего репозитория - туда же, где лежит исходный код.

Что такое Jenkinsfile по сути? Это groovy-скрипт особого вида, описывающий шаги твоего конвейера. Но не пугайся слова "скрипт": в 2026 году стандарт - declarative pipeline, декларативный синтаксис, где ты описываешь не "как программировать", а "что должно произойти". Выглядит почти как конфиг.

Почему jenkins конвейер в виде кода радикально лучше кликанья мышкой во Freestyle:
  • Версионируется. Jenkinsfile лежит в git. Каждое изменение процесса сборки - это коммит с автором, датой и diff. Откатить плохое изменение так же просто, как откатить баг в коде.
  • Ревьюится. Поменял этап деплоя - открыл pull request. Коллега видит ровно те строки, которые ты изменил, и может оставить комментарий до того, как это уедет в прод.
  • Живёт вместе с веткой. В feature-ветке можно держать свою версию конвейера. Слил ветку - конвейер обновился атомарно вместе с кодом, который он собирает.
  • Переживает рестарт. Здесь работает механизм durability: Jenkins сериализует состояние пайплайна на диск по ходу выполнения. Если контроллер перезапустится посреди долгой сборки, конвейер сможет продолжиться, а не начнётся с нуля. У Freestyle такого нет в принципе.
Сравни с соседями по индустрии. В GitLab CI это файл .gitlab-ci.yml, в GitHub Actions - .github/workflows/*.yml. Все пришли к одной идее: pipeline as code, описание процесса лежит в репозитории. Jenkins был одним из первых, кто сделал это массовым, и до сих пор выигрывает гибкостью - под капотом полноценный groovy, а не только декларативный YAML.

Изображение

Где живёт Jenkinsfile и как Jenkins его подхватывает

Канонический путь - корень репозитория, файл ровно с именем Jenkinsfile, без расширения. Дальше ты создаёшь в Jenkins джобу типа Pipeline и указываешь, что определение брать "from SCM" - то есть из системы контроля версий. Jenkins при запуске сам клонирует репозиторий, читает Jenkinsfile и выполняет то, что в нём описано.

Ещё мощнее - Multibranch Pipeline. Ты указываешь Jenkins на репозиторий целиком, и он сам сканирует все ветки. В каждой ветке, где есть Jenkinsfile, автоматически создаётся отдельный конвейер. Появилась новая ветка с Jenkinsfile - появился новый пайплайн. Удалили ветку - джоба убралась. Открыли pull request - Jenkins может собрать и его. Ничего руками заводить не нужно.

Первый минимальный pipeline: anatomy из stages и steps

Хватит теории, посмотрим на живой Jenkinsfile. Вот минимальный рабочий declarative pipeline:

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

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Собираем проект'
                sh 'make build'
            }
        }
    }
}
Разберём анатомию по слоям, потому что эту структуру ты будешь видеть в каждом конвейере:
  • pipeline - корневой блок. С него начинается любой declarative-конвейер. Всё описание живёт внутри его фигурных скобок.
  • agent - где выполнять. agent any означает "на любом доступном агенте". Можно прибить к конкретному лейблу: agent { label 'linux' }, или запускать каждый этап в своём docker-контейнере.
  • stages - контейнер для этапов. Внутри лежат отдельные stage.
  • stage - один логический этап с человекочитаемым именем: Build, Test, Deploy. Именно эти прямоугольники ты потом видишь в визуализации Stage View.
  • steps - конкретные шаги внутри этапа. sh выполняет shell-команду, echo печатает в лог. Шаг - это атомарное действие.
Теперь более боевой пример с несколькими этапами, переменными окружения и блоком post, который выполняется в конце независимо от результата:

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

pipeline {
    agent any

    environment {
        APP_VERSION = '1.4.0'
    }

    options {
        timeout(time: 30, unit: 'MINUTES')
        disableConcurrentBuilds()
    }

    stages {
        stage('Build') {
            steps {
                sh 'mvn -B clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                }
            }
        }
        stage('Deploy') {
            when {
                branch 'main'
            }
            steps {
                sh "./deploy.sh ${APP_VERSION}"
            }
        }
    }

    post {
        failure {
            echo 'Сборка упала, шлём уведомление в чат'
        }
        always {
            cleanWs()
        }
    }
}
Обрати внимание на пару современных деталей. Блок when { branch 'main' } - деплой выполнится только в ветке main, в feature-ветках этап пропустится. Блок options задаёт таймаут и запрещает параллельные сборки одной джобы. junit подбирает отчёты тестов, чтобы Jenkins нарисовал тренд. Это валидные шаги, а не псевдокод - такой Jenkinsfile запустится.

Declarative - стандарт по умолчанию, потому что он проверяется на синтаксис до запуска и читается линейно. Но иногда нужна динамика: сгенерировать список этапов в цикле, хитрая логика ветвления. Тогда внутри declarative можно открыть блок script { } со scripted-кодом на groovy, либо писать весь конвейер в scripted-стиле. Правило простое: declarative по умолчанию, scripted - точечно, где упираешься в ограничения.

Кстати, про визуализацию. В книгах 2018-2019 годов активно рекламировали Blue Ocean - красивый UI для пайплайнов. В 2026 он де-факто заброшен и в режиме поддержки. Воспринимай его как наследие, не строй на нём процессы. Современная визуализация - встроенный Stage View и Pipeline Graph View, а сам конвейер всегда определяется через Jenkinsfile, а не через клики.

Типичные грабли
  • Забыл agent. Без директивы agent declarative-конвейер не пройдёт валидацию. agent обязателен либо на уровне pipeline, либо в каждом stage.
  • Путаешь declarative и scripted. Если файл начинается с node { } - это scripted. Если с pipeline { } - declarative. Смешивать синтаксис двух стилей напрямую нельзя, scripted-вставки идут только внутри script { }.
  • Многострочный shell. Используй sh '''...''' с тройными кавычками для нескольких команд. И помни: каждый sh-шаг по умолчанию падает на первой же ненулевой команде, потому что Jenkins запускает его с set -e.
  • Секреты прямо в коде. Никогда не вписывай пароли и токены в Jenkinsfile - он же в git. Бери их через credentials(): environment { TOKEN = credentials('my-token') }.
  • Имена этапов как у мусора. stage('stage1') ничего не говорит. Зови этапы по делу: Build, Unit Tests, Deploy Staging - это твоя документация в Stage View.
Мини-лаба: собери первый конвейер руками

Закрепляем. Что повторить самостоятельно:
  • Установи Jenkins LTS (актуальная линейка - 2.541.x от января 2026 на Java 17, новые сборки 2.555.x уже требуют Java 21). Подними хоть в docker одной командой.
  • Создай git-репозиторий, положи в корень файл Jenkinsfile из первого примера выше.
  • В Jenkins заведи джобу типа Pipeline, в Definition выбери "Pipeline script from SCM", укажи свой репозиторий.
  • Запусти сборку и открой Stage View - убедись, что видишь прямоугольник этапа Build.
  • Добавь второй stage с именем Test и шагом sh 'echo running tests'. Закоммить, запусти снова, посмотри, как появился новый этап.
  • Сломай синтаксис специально (убери закрывающую скобку) и убедись, что declarative ловит ошибку до запуска сборки.
Контрольные вопросы
  • Чем pipeline as code принципиально лучше Freestyle-джобы, настроенной через UI? Назови минимум три преимущества.
  • Из каких обязательных блоков состоит минимальный declarative pipeline и за что отвечает каждый?
  • В чём разница между stages, stage и steps?
  • Что такое durability и как механизм помогает конвейеру пережить рестарт контроллера?
Итог

Jenkinsfile - это твой конвейер, превращённый в код и положенный в репозиторий рядом с приложением. Pipeline as code даёт версионирование, ревью, durability и одинаковый процесс для всех веток. Базовая анатомия проста: pipeline -> stages -> stage -> steps, и её хватает, чтобы собрать первый рабочий конвейер уже сегодня. Declarative - твой выбор по умолчанию на 2026 год, scripted держи в запасе для динамики. Дальше мы будем наращивать на этот скелет параметры, параллельные этапы, агентов в Kubernetes и Configuration as Code - но фундамент именно здесь.
👍1 ❤️2 🔥4 😄 🤔2
Аватара пользователя
max123
Сообщения: 1
Зарегистрирован: 19 май 2026, 19:15

Re: Конвейеры Jenkins и Jenkinsfile: pipeline as code

Сообщение max123 »

Наконец-то дошло, зачем городить Jenkinsfile вместо привычного Freestyle. Раньше казалось лишним усложнением, а теперь понял - вся боль с восстановлением джоб после падения контроллера из-за этого и была. Спасибо за пример с post и when, прям то что искал.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
fan_grisha
Сообщения: 1
Зарегистрирован: 16 май 2026, 10:14

Re: Конвейеры Jenkins и Jenkinsfile: pipeline as code

Сообщение fan_grisha »

Вопрос по агенту: если поставить agent any на уровне pipeline, а внутри stage Deploy указать свой agent { label 'prod' } - какой победит? И влезет ли scripted-блок script { } внутрь steps, если надо в цикле этапы генерить?
👍3 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Configuration as Code (JCasC): настройка Jenkins декларативно
Следующая глава →
Scripted против Declarative: два синтаксиса конвейера

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

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

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

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

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