Gymterview
middle

Как использовать параметры, условия и параллельные стадии в Jenkins Pipeline

Параметры, условия и параллельные стадии — это механизмы Declarative Pipeline, которые делают пайплайн гибким: параметры позволяют настраивать сборку при запуске, условия управляют выполнением стадий, а параллельные стадии ускоряют пайплайн.

Параметры (parameters)

Параметры позволяют задавать входные данные при запуске сборки. Доступные типы: string, choice, booleanParam, password, text.

Пример
pipeline {
    agent any
    parameters {
        string(name: 'BRANCH', defaultValue: 'main', description: 'Branch to build')
        choice(name: 'ENVIRONMENT', choices: ['dev', 'staging', 'production'],
               description: 'Target environment')
        booleanParam(name: 'SKIP_TESTS', defaultValue: false, description: 'Skip tests')
        password(name: 'DEPLOY_TOKEN', description: 'Deployment token')
    }
    stages {
        stage('Build') {
            steps {
                echo "Building branch: ${params.BRANCH}"
                sh "mvn clean package ${params.SKIP_TESTS ? '-DskipTests' : ''}"
            }
        }
        stage('Deploy') {
            steps {
                echo "Deploying to: ${params.ENVIRONMENT}"
            }
        }
    }
}

Важно: при первом запуске пайплайна параметры ещё не существуют — Jenkins создает их после первого прогона. Последующие запуски покажут форму с параметрами.

Условия (when)

Директива when определяет, при каких условиях выполняется стадия. Основные условия:

Условие Описание
branch 'main' Только для указанной ветки
expression { ... } Произвольное Groovy-выражение
environment name: 'X', value: 'Y' Переменная окружения равна значению
changeRequest() Сборка запущена для Pull Request
not { ... } Отрицание условия
allOf { ... } Все условия выполнены (AND)
anyOf { ... } Хотя бы одно условие выполнено (OR)
Пример использования when
stages {
    stage('Deploy to Staging') {
        when {
            branch 'develop'  // Только для ветки develop
        }
        steps { sh './deploy.sh staging' }
    }
    stage('Deploy to Production') {
        when {
            allOf {
                branch 'main'
                expression { params.ENVIRONMENT == 'production' }
            }
        }
        steps {
            input message: 'Deploy to production?', ok: 'Deploy'
            sh './deploy.sh production'
        }
    }
    stage('SonarQube') {
        when {
            not { changeRequest() }  // Не для pull request
        }
        steps { sh 'mvn sonar:sonar' }
    }
}

Параллельные стадии (parallel)

Параллельные стадии позволяют выполнять несколько задач одновременно, сокращая общее время пайплайна.

Пример
stage('Tests') {
    parallel {
        stage('Unit Tests') {
            steps { sh 'mvn test -pl unit-tests' }
        }
        stage('Integration Tests') {
            agent { label 'docker' }
            steps { sh 'mvn verify -pl integration-tests' }
        }
        stage('Security Scan') {
            steps { sh 'mvn dependency-check:check' }
        }
    }
}

Важно: по умолчанию, если одна параллельная стадия упадет, остальные продолжат выполнение. Чтобы прервать все при первой ошибке, используйте failFast true:

Пример
stage('Tests') {
    failFast true
    parallel {
        stage('Unit Tests') { steps { sh 'mvn test' } }
        stage('Integration Tests') { steps { sh 'mvn verify -Pit' } }
    }
}

Комбинирование параметров, условий и параллелизма

Полный пример
pipeline {
    agent any
    parameters {
        choice(name: 'ENV', choices: ['dev', 'staging', 'prod'], description: 'Target')
        booleanParam(name: 'RUN_SECURITY', defaultValue: true, description: 'Security scan')
    }
    stages {
        stage('Build') {
            steps { sh 'mvn clean compile' }
        }
        stage('Quality Checks') {
            parallel {
                stage('Unit Tests') {
                    steps { sh 'mvn test' }
                }
                stage('Security Scan') {
                    when { expression { params.RUN_SECURITY } }
                    steps { sh 'mvn dependency-check:check' }
                }
            }
        }
        stage('Deploy') {
            when { expression { params.ENV == 'prod' } }
            steps {
                input message: 'Confirm production deploy?', submitter: 'release-managers'
                sh './deploy.sh prod'
            }
        }
    }
}

Вывод

Параметры, условия и параллельные стадии — три столпа гибкости Declarative Pipeline. Параметры делают пайплайн настраиваемым, when — адаптивным к контексту (ветка, PR, окружение), а parallel — быстрым.

На собеседовании: часто дают задачу: «Напишите пайплайн, который деплоит на production только из ветки main с ручным подтверждением». Это проверяет знание when, input и parameters одновременно.