Gymterview
middle

Что такое Jenkinsfile и чем отличается Declarative Pipeline от Scripted Pipeline

Jenkinsfile — это текстовый файл, содержащий описание CI/CD пайплайна на Groovy DSL. Хранится в корне репозитория проекта вместе с исходным кодом, что реализует подход Pipeline as Code — пайплайн версионируется, проходит code review и имеет полную историю изменений.

Declarative Pipeline (рекомендуемый)

Declarative Pipeline использует строго структурированный синтаксис с предопределенными секциями. Jenkins валидирует его ещё до запуска, что позволяет обнаружить синтаксические ошибки заранее.

Пример Declarative Pipeline
pipeline {
    agent any

    environment {
        MAVEN_OPTS = '-Xmx1024m'
    }

    stages {
        stage('Build') {
            steps {
                sh 'mvn clean compile'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit '**/target/surefire-reports/*.xml'
                }
            }
        }
        stage('Package') {
            steps {
                sh 'mvn package -DskipTests'
            }
        }
    }

    post {
        success {
            echo 'Pipeline succeeded!'
        }
        failure {
            mail to: 'team@company.com',
                 subject: "FAILED: ${env.JOB_NAME}",
                 body: "Build ${env.BUILD_NUMBER} failed."
        }
    }
}

Scripted Pipeline (полноценный Groovy)

Scripted Pipeline дает полную свободу Groovy-кода: циклы, условия, обработка исключений — все возможности языка программирования.

Пример Scripted Pipeline
node('java17-maven') {
    try {
        stage('Build') {
            checkout scm
            sh 'mvn clean compile'
        }
        stage('Test') {
            sh 'mvn test'
        }
        stage('Package') {
            sh 'mvn package -DskipTests'
        }
    } catch (e) {
        currentBuild.result = 'FAILURE'
        throw e
    } finally {
        junit '**/target/surefire-reports/*.xml'
    }
}

Сравнение Declarative и Scripted Pipeline

Критерий Declarative Pipeline Scripted Pipeline
Синтаксис Структурированный, строгий Свободный Groovy
Простота Проще для новичков Сложнее, требует знания Groovy
Гибкость Ограниченная (но есть блок script {}) Полная
Валидация Валидируется до запуска Ошибки обнаруживаются в runtime
Секция post Встроенная поддержка Реализуется через try/catch/finally
Рестарт со стадии Поддерживается Не поддерживается
Рекомендация Jenkins Рекомендуется Для сложных случаев

Блок script внутри Declarative Pipeline

Если в декларативном пайплайне нужна сложная логика, можно использовать блок script {}:

Пример
stage('Conditional Logic') {
    steps {
        script {
            if (env.BRANCH_NAME == 'main') {
                sh 'mvn deploy'
            } else {
                echo 'Skipping deploy for non-main branch'
            }
        }
    }
}

Вывод

В большинстве проектов рекомендуется использовать Declarative Pipeline как более читаемый и поддерживаемый вариант. Scripted Pipeline оправдан только для действительно сложной логики, которую невозможно выразить декларативно. В банковской практике Declarative Pipeline предпочтителен, так как его проще стандартизировать и проверять на code review.

На собеседовании: классический вопрос — объяснить разницу между двумя типами пайплайнов и обосновать выбор. Упомяните, что Declarative Pipeline поддерживает рестарт с конкретной стадии, что важно для длительных пайплайнов, а Scripted — нет.