← Назад к вопросам

Что такое Jenkins Pipeline и как написать Jenkinsfile?

2.2 Middle🔥 191 комментариев
#CI/CD и автоматизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Jenkins Pipeline?

Jenkins Pipeline — это набор инструментов и методология в Jenkins, позволяющая описывать процесс сборки, тестирования и развертывания программного обеспечения как единый автоматизированный workflow (конвейер). Pipeline моделирует весь процесс непрерывной интеграции и доставки (CI/CD) в виде последовательности стадий и шагов, которые могут быть визуализированы, управляемы и расширяемы. Основная цель Pipeline — превратить разрозненные задачи (компиляция, тесты, деплой) в единый, воспроизводимый и надежный поток, который легко поддерживать и развивать.

Ключевые преимущества Jenkins Pipeline:

  • Автоматизация всего процесса CI/CD: От кода до развертывания.
  • Воспроизводимость и надежность: Pipeline выполняется одинаково при каждом запуске.
  • Визуализация: Jenkins предоставляет графическое представление потока с статусами каждой стадии.
  • Расширяемость: Возможность использования плагинов и разделения логики на общие библиотеки.
  • Два стиля написания: Declarative (декларативный, более простой и структурированный) и Scripted (скриптовый, основанный на Groovy, более гибкий).

Как написать Jenkinsfile?

Jenkinsfile — это текстовый файл, который содержит определение Pipeline. Он хранится в корне репозитория проекта вместе с кодом, что позволяет реализовать принцип "Pipeline as Code". Это обеспечивает версионирование, совместную работу и единый источник описания процесса CI/CD.

Jenkinsfile состоит из нескольких основных секций.

Пример Declarative Pipeline (Декларативный стиль)

Декларативный стиль более предпочтителен для большинства случаев благодаря своей четкой структуре и ограниченной сложности.

// Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any // Запускает Pipeline на любом доступном агента (узле)
    
    options {
        timeout(time: 1, unit: 'HOURS') // Общее ограничение времени выполнения
    }
    
    triggers {
        cron('H */4 * * *') // Планировщик: запуск каждые 4 часа
    }
    
    stages {
        stage('Build') {
            steps {
                echo 'Этап сборки...'
                sh 'mvn clean compile' // Пример команды для Java проекта
            }
        }
        stage('Test') {
            steps {
                echo 'Этап тестирования...'
                sh 'mvn test'
                junit 'target/surefire-reports/*.xml' // Сохранение результатов тестов
            }
        }
        stage('Deploy') {
            when {
                branch 'production' // Этап выполняется только для ветки production
            }
            steps {
                echo 'Развертывание в production...'
                sh './deploy.sh'
            }
        }
    }
    
    post {
        always {
            echo 'Pipeline завершен. Этот шаг выполняется всегда.'
            cleanWs() // Очистка рабочего пространства
        }
        success {
            echo 'Pipeline успешно выполнен!'
        }
        failure {
            echo 'Pipeline завершился с ошибкой!'
            // Здесь можно добавить отправку уведомлений
        }
    }
}

Пример Scripted Pipeline (Скриптовый стиль)

Скриптовый стиль предоставляет максимальную гибкость, так как представляет собой полноценный Groovy скрипт.

// Jenkinsfile (Scripted Pipeline)
node('linux-agent') { // Запуск на конкретном агента с label 'linux-agent'
    try {
        stage('Build') {
            echo "Начинаем сборку"
            // Более сложная логика с Groovy
            def buildTool = env.BUILD_TOOL ?: 'mvn'
            sh "${buildTool} clean compile -DskipTests"
        }
        
        stage('Test') {
            echo "Запуск тестов"
            sh 'mvn test'
            // Прямая работа с результатами
            testResults = junit testData: 'target/surefire-reports/*.xml', keepLongStdio: true
            if (testResults.failCount > 0) {
                currentBuild.result = 'UNSTABLE'
            }
        }
        
        stage('Deploy') {
            if (env.BRANCH_NAME == 'master') {
                echo "Развертывание на staging"
                sh './deploy-staging.sh'
                // Интерактивные шаги, например, ожидание подтверждения
                input message: 'Развернуть в production?', ok: 'Да'
                sh './deploy-production.sh'
            }
        }
    } catch (Exception e) {
        currentBuild.result = 'FAILED'
        echo "Ошибка в Pipeline: ${e.getMessage()}"
    } finally {
        echo "Завершение работы Pipeline"
    }
}

Ключевые элементы и рекомендации по написанию

  • agent: Определяет, где будет запущен Pipeline (any, none, label, docker).
  • stages: Содержит последовательность stages (стадий), которые представляют логические группы шагов.
  • steps: Конкретные действия внутри стадии (sh, echo, bat, git, archiveArtifacts).
  • when: Позволяет добавлять условия выполнения стадии (например, по ветке, изменению файла).
  • post: Секция для действий после выполнения всех стадий (анализ результатов, очистка, уведомления).
  • environment: Секция для определения переменных окружения, доступных во всем Pipeline.
  • parameters: Для определения параметров, которые пользователь может задать при запуске Pipeline.

Практические советы

  1. Начинайте с Declarative Pipeline: Он более структурирован и безопасен для начала.
  2. Используйте sh для shell-команд: Указывайте полные пути, если необходимо.
  3. Храните Jenkinsfile в репозитории: Это основная практика "Pipeline as Code".
  4. Разделяйте сложную логику: Для повторяющихся или сложных шагов создавайте Shared Libraries (общие библиотеки) в Groovy.
  5. Тестируйте Pipeline локально: Для сложных Scripted Pipeline можно использовать инструменты для запуска Groovy скриптов вне Jenkins.
  6. Добавляйте обработку ошибок: Используйте post секцию или блоки try-catch в Scripted Pipeline для корректного завершения.

Jenkinsfile — это центральный элемент современного CI/CD в Jenkins. Правильно написанный Pipeline не только автоматизирует процесс, но и служит документацией, делает процесс прозрачным и легко управляемым для всей команды разработки и эксплуатации.