Что такое 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 — нет.