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

Как выглядит конвейер в Jenkins

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

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

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

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

Общая архитектура Jenkins Pipeline

Конвейер в Jenkins — это автоматизированный процесс, описанный в виде кода (Infrastructure as Code), который определяет последовательность этапов сборки, тестирования и развертывания приложения. Основная философия заключается в моделировании всего жизненного цикла ПО от коммита до продакшена.

Ключевые компоненты конвейера

  1. Jenkinsfile — центральный элемент. Это текстовый файл, содержащий определение конвейера, написанный на декларативном или скриптовом (Scripted Pipeline) синтаксисе. Хранится в репозитории вместе с кодом приложения.
  2. Узел (Node) — машина (агент), на которой выполняется конвейер. Это может быть мастер-сервер Jenkins или выделенный агент (например, Docker-контейнер, виртуальная машина).
  3. Этап (Stage) — логический раздел конвейера, который группирует несколько шагов (например, "Сборка", "Тестирование", "Развертывание"). В интерфейсе Jenkins этапы визуализируются отдельными блоками.
  4. Шаг (Step) — атомарная операция, которая выполняет конкретную задачу (например, выполнить shell-команду, зачекаутить код, отправить уведомление).

Пример декларативного конвейера (Declarative Pipeline)

Это современный и рекомендуемый синтаксис, более структурированный и простой для чтения.

pipeline {
    // 1. Где запускать?
    agent {
        docker {
            image 'maven:3.8.4-openjdk-11' // Запуск каждого этапа в свежем контейнере с Maven
            args '-v /home/jenkins/.m2:/root/.m2' // Кэширование Maven-зависимостей
        }
    }

    // 2. Переменные окружения, доступные на всех этапах
    environment {
        APP_NAME = 'my-application'
        DOCKER_REGISTRY = 'my-registry:5000'
        VERSION = sh(script: 'git describe --tags --always', returnStdout: true).trim()
    }

    // 3. Последовательность этапов (Stages)
    stages {
        // Этап 1: Получение кода и подготовка
        stage('Checkout & Prepare') {
            steps {
                checkout scm // Клонирование репозитория из источника, который запустил сборку
                sh 'git version'
                echo "Сборка версии: ${VERSION}"
            }
        }

        // Этап 2: Сборка проекта
        stage('Build') {
            steps {
                sh 'mvn clean compile -DskipTests'
            }
        }

        // Этап 3: Запуск тестов
        stage('Test') {
            steps {
                sh 'mvn test'
                junit 'target/surefire-reports/*.xml' // Архивация результатов тестов для Jenkins
            }
        }

        // Этап 4: Сборка артефакта (Docker-образа)
        stage('Package') {
            steps {
                script { // Блок script позволяет использовать Groovy-код
                    docker.build("${APP_NAME}:${VERSION}")
                }
            }
        }

        // Этап 5: Развертывание в staging
        stage('Deploy to Staging') {
            when {
                branch 'develop' // Этап выполнится только для ветки develop
            }
            steps {
                sh "docker tag ${APP_NAME}:${VERSION} ${DOCKER_REGISTRY}/${APP_NAME}:${VERSION}"
                withCredentials([usernamePassword(credentialsId: 'docker-registry-creds', usernameVariable: 'USER', passwordVariable: 'PASS')]) {
                    sh "echo ${PASS} | docker login ${DOCKER_REGISTRY} -u ${USER} --password-stdin"
                    sh "docker push ${DOCKER_REGISTRY}/${APP_NAME}:${VERSION}"
                }
                // Здесь обычно идет вызов Ansible, kubectl или вызов API оркестратора
                sh "kubectl set image deployment/${APP_NAME} ${APP_NAME}=${DOCKER_REGISTRY}/${APP_NAME}:${VERSION} -n staging"
            }
        }
    }

    // 4. Пост-обработка (Post-actions) - выполняется всегда в конце
    post {
        always {
            echo "Конвейер для ${APP_NAME} завершен."
            cleanWs() // Очистка рабочей директории
        }
        success {
            emailext (
                subject: "SUCCESS: Pipeline ${env.JOB_NAME}",
                body: "Сборка ${env.BUILD_NUMBER} прошла успешно.",
                to: 'team@example.com'
            )
        }
        failure {
            emailext (
                subject: "FAILED: Pipeline ${env.JOB_NAME}",
                body: "Сборка ${env.BUILD_NUMBER} завершилась с ошибкой. Проверьте консольный вывод: ${env.BUILD_URL}",
                to: 'team@example.com'
            )
            // Можно добавить оповещение в Slack
            // slackSend(channel: '#alerts', message: "Build Failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}")
        }
    }
}

Как это выглядит в интерфейсе Jenkins (Blue Ocean / Classic)

  • Stage View: Графическое представление последовательности этапов. Каждый этап — цветной блок (синий — успех, красный — падение). Видно, на каком этапе конвейер находится или упал.
  • Console Output: Подробный лог выполнения каждого шага с временными метками.
  • Pipeline Steps: Древовидная структура всех выполненных шагов внутри каждого этапа.

Продвинутые возможности

Конвейер Jenkins становится мощным инструментом DevOps благодаря таким функциям:

  • Параллельное выполнение этапов:
    stage('Parallel Tests') {
        parallel {
            stage('Unit Tests') { steps { sh 'mvn test' } }
            stage('Integration Tests') { steps { sh 'mvn verify -Dit.test' } }
            stage('Static Analysis') { steps { sh 'sonar-scanner' } }
        }
    }
    
  • Взаимодействие с внешними системами: Интеграция с Kubernetes (kubernetes plugin), Terraform, системы мониторинга.
  • Восстанавливаемость и отказоустойчивость: Конвейер может быть приостановлен для ручного подтверждения (input), повторно запущен с определенного этапа.
  • Общие библиотеки (Shared Libraries): Вынесение повторяющегося кода (логики сборки, развертывания) в отдельные библиотеки для повторного использования across всех проектов.

Заключение

Конвейер Jenkins — это программируемый workflow, который превращает ручные операции DevOps в контролируемый, отслеживаемый и повторяемый процесс. Его сила — в экосистеме плагинов, интеграции с практически любым инструментом цепочки поставок ПО и возможности описания сложных, разветвленных сценариев в виде кода. Современный Jenkins-конвейер — это не просто "сборка по нажатию кнопки", а полноценная система оркестрации CI/CD, которая может включать в себя контейнеризацию, развертывание в облаках, канареечные релизы и откаты.