stages, parallel и matrix: организация этапов

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

stages, parallel и matrix: организация этапов

Сообщение 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
Представь конвейер, который собирает проект, потом гоняет юнит-тесты на Linux, потом те же тесты на Windows, потом на macOS, потом интеграционные, потом линтер. Все строго по очереди. Каждый шаг ждет предыдущий, даже если они друг от друга не зависят. В итоге сборка, которая по уму должна укладываться в 8 минут, тянется полчаса, а инженеры пьют третий кофе и матерят CI. Знакомо? Эта боль решается грамотной организацией этапов. В этом уроке разберем, как раскладывать jenkins pipeline на стейджи, что выполнять последовательно, а что параллельно, и как одним компактным блоком matrix покрыть десяток комбинаций версий и платформ, не плодя копипасту.

Из чего собирается pipeline: stages и stage

Базовый кирпич declarative-конвейера - блок stages, а внутри него отдельные stage. Каждый stage - это логически завершенный этап: сборка, тесты, упаковка, деплой. По умолчанию все jenkins stages внутри одного stages выполняются строго сверху вниз, последовательно. Это и хорошо (понятный поток), и плохо (медленно, если этапы независимы).

Вот скелет, к которому привыкает глаз в 2026 году. Declarative pipeline - стандарт по умолчанию, scripted трогаем только там, где нужна динамика.

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

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh './gradlew clean assemble'
            }
        }
        stage('Test') {
            steps {
                sh './gradlew test'
            }
        }
        stage('Package') {
            steps {
                sh './gradlew bootJar'
                archiveArtifacts artifacts: 'build/libs/*.jar', fingerprint: true
            }
        }
    }
}
Важная деталь: stage можно вкладывать друг в друга. Внутри одного stage разрешено объявить новый блок stages с вложенными этапами. Это удобно, когда у тебя есть крупная фаза (например "QA"), внутри которой несколько подэтапов, и ты хочешь сгруппировать их под общим заголовком и общим agent или when.

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

stage('QA') {
    agent { label 'linux' }
    stages {
        stage('Lint') {
            steps { sh 'make lint' }
        }
        stage('Unit') {
            steps { sh 'make test-unit' }
        }
    }
}
Изображение

jenkins parallel: запускаем этапы одновременно

Самый честный способ ускорить конвейер - перестать ждать там, где ждать не надо. Если юнит-тесты на разных ОС не зависят друг от друга, нет смысла гонять их в очередь. Блок parallel говорит Jenkins запустить вложенные стейджи jenkins параллельно. Каждая ветка обычно уезжает на свой агент, и они крутятся одновременно.

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

stage('Cross-platform tests') {
    parallel {
        stage('Linux') {
            agent { label 'linux' }
            steps { sh './run-tests.sh' }
        }
        stage('Windows') {
            agent { label 'windows' }
            steps { bat 'run-tests.bat' }
        }
        stage('macOS') {
            agent { label 'macos' }
            steps { sh './run-tests.sh' }
        }
    }
}
Тут три платформы тестируются разом. Если у каждой прогон занимает 6 минут, последовательно вышло бы 18, а параллельно - около 6 (при условии, что есть три свободных агента). Это и есть реальная экономия. В Jenkins parallel ветки независимы: упала одна - остальные продолжают работать.

Если же ты хочешь, чтобы при первом падении любой ветки остальные немедленно прервались (например, дорогие e2e-прогоны, и нет смысла жечь ресурсы при заведомо красной сборке), включи failFast:

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

stage('E2E') {
    failFast true
    parallel {
        stage('Chrome')  { steps { sh './e2e.sh chrome' } }
        stage('Firefox') { steps { sh './e2e.sh firefox' } }
        stage('WebKit')  { steps { sh './e2e.sh webkit' } }
    }
}
То же самое глобально на весь конвейер делает

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

options { parallelsAlwaysFailFast() }
в начале pipeline - тогда failFast включается для всех параллельных блоков сразу.

jenkins matrix: декартово произведение осей одним блоком

Теперь представь, что тебе нужно протестировать продукт на трех ОС и трех версиях Java. Руками это 9 одинаковых стейджей. Писать их копипастой - путь к ошибкам. Для этого придумали matrix - он генерирует декартово произведение осей и сам разворачивает все комбинации (ячейки). Это одна из самых недооцененных современных возможностей: jenkins matrix экономит десятки строк и держит конфигурацию в одном месте.

Структура такая: внутри matrix обязательны секции axes (оси) и stages (что выполнять в каждой ячейке). Опционально - excludes (выкинуть невалидные сочетания).

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

stage('Matrix build') {
    matrix {
        axes {
            axis {
                name 'PLATFORM'
                values 'linux', 'windows', 'mac'
            }
            axis {
                name 'JAVA'
                values '17', '21', '25'
            }
        }
        excludes {
            exclude {
                axis { name 'PLATFORM'; values 'mac' }
                axis { name 'JAVA'; values '17' }
            }
        }
        agent { label "${PLATFORM}" }
        stages {
            stage('Test cell') {
                steps {
                    sh 'echo "PLATFORM=$PLATFORM JAVA=$JAVA"'
                    sh './gradlew test -Pjava=$JAVA'
                }
            }
        }
    }
}
Здесь 3x3 = 9 комбинаций, минус одна исключенная (mac + Java 17) = 8 ячеек. Значения осей доступны внутри как переменные окружения PLATFORM и JAVA. Каждая ячейка - это полноценный набор стейджей со своим agent. По умолчанию ячейки matrix тоже выполняются параллельно, так что matrix - это, по сути, удобная надстройка над parallel для случая "много однотипных комбинаций". failFast здесь работает аналогично.

Типичные грабли
  • Параллелят все подряд. Параллелизм имеет смысл только для независимых задач. Если ветки дерутся за один и тот же ресурс (общая БД, один порт, один артефакт-кэш) - получишь гонки и плавающие падения.
  • Не хватает агентов. Объявил 9 ячеек matrix, а исполнителей всего 2 - параллельности не будет, очередь все равно растянется. Считай реальную емкость: число свободных executors и агентов с нужными метками.
  • Используют stages внутри parallel неправильно. Внутри parallel идут именно stage-ветки, а уже внутри каждой ветки может быть свой блок stages. Путаница в уровнях вложенности - частая причина ошибок "Expected a stage".
  • Забывают про общий post. При падении одной параллельной ветки удобно собрать отчеты во всех. Делай это в post внутри каждого stage, а не в одном месте снаружи.
  • Ждут failFast там, где надо собрать всю картину. failFast хорош для дорогих прогонов, но для матрицы совместимости он вреден: ты хочешь видеть ВСЕ красные ячейки, а не первую попавшуюся. Не включай его бездумно.
  • Думают, что Blue Ocean покажет красивый граф. Blue Ocean заброшен и держится как наследие. Параллельные ветки и matrix отлично визуализируются в штатном Pipeline-обзоре и в Stage View современных LTS - ветки рисуются столбиками рядом, ячейки матрицы тоже видны по отдельности.
Мини-лаба: повтори руками

Возьми любой свой проект (или болванку из Build-стейджа выше) и на Jenkins LTS из линейки 2.541.x или новее (2.555.x уже требует Java 21/25):
  • Собери линейный конвейер из трех стейджей Build -> Test -> Package и засеки время сборки в Stage View.
  • Раздели Test на три параллельные ветки (можно даже на одном агенте через разные

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

    sh 'sleep 5; echo linux'
    и т.п.), запусти и сравни длительность с линейным вариантом.
  • Добавь

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

    failFast true
    , сломай намеренно одну ветку (

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

    sh 'exit 1'
    ) и посмотри, как остальные обрываются.
  • Перепиши параллельный блок через matrix с двумя осями (например PLATFORM и JAVA), добавь один exclude и убедись, что в обзоре ячеек стало на одну меньше.
Если сравнивать с соседями: в GitLab CI параллелизм по осям делается через

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

parallel: matrix:
в job, а в GitHub Actions - через

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

strategy.matrix
с

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

fail-fast
. Идея ровно та же - декартово произведение осей. Так что навык переносимый, меняется только синтаксис.

Контрольные вопросы
  • Чем порядок выполнения стейджей внутри одного блока stages отличается от стейджей внутри parallel?
  • Какие две секции обязательны внутри matrix и за что отвечает excludes?
  • Что делает failFast и в каком случае его НЕ стоит включать?
  • Сколько ячеек породит matrix с осями 3 ОС x 4 версии при двух excludes, и почему важно иметь достаточно агентов?
Итог

Стейджи задают структуру конвейера и читаются как оглавление сборки. parallel убирает лишнее ожидание и реально режет время там, где этапы независимы. matrix сворачивает десяток однотипных комбинаций в один компактный блок с осями и исключениями. Связка stages + parallel + matrix плюс аккуратный failFast - это и есть современный способ организовать этапы в jenkins pipeline так, чтобы сборка была быстрой, читаемой и предсказуемой.
👍3 ❤️ 🔥1 😄 🤔2
Аватара пользователя
pghacker
Сообщения: 1
Зарегистрирован: 24 май 2026, 14:41

Re: stages, parallel и matrix: организация этапов

Сообщение pghacker »

Долго не доходило, почему matrix лучше чем десять stage руками. После примера с PLATFORM x JAVA дошло, спасибо. А excludes можно по нескольким осям сразу вешать или только по двум?
👍3 ❤️1 🔥 😄 🤔
Аватара пользователя
madburnout
Сообщения: 1
Зарегистрирован: 28 май 2026, 09:12

Re: stages, parallel и matrix: организация этапов

Сообщение madburnout »

Поставил parallelsAlwaysFailFast в options и e2e перестали жечь агентов впустую на красной сборке. Сборка с 24 минут упала до 9. Параллелить надо было еще год назад.
👍 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
tools, options, parameters и triggers в декларативном конвейере
Следующая глава →
Условное выполнение when и блок post

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: параметры и параллельные стейджи в jenkins pipelineструктура declarative pipeline в jenkins: stages, agent, steps

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

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

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