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

Как в Jenkins сделать нотификацию об неуспешном билде

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

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

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

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

Настройка нотификаций о неуспешном сборках в Jenkins

В Jenkins существует несколько эффективных подходов для настройки уведомлений о неуспешных сборках (failed builds). Рассмотрим основные методы, от базовых до продвинутых.

1. Email уведомления через встроенный плагин

Самый распространенный способ — использование плагина Email Extension. Вот пошаговая настройка:

Глобальная конфигурация (Manage Jenkins → Configure System):

SMTP сервер: smtp.gmail.com (или корпоративный SMTP)
Порт: 587 (с TLS)
Имя пользователя: ваш-email@gmail.com
Пароль: пароль приложения
Использовать SSL: ✓

Настройка в Jenkinsfile (Declarative Pipeline):

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'make build'
            }
        }
        stage('Test') {
            steps {
                sh 'make test'
            }
        }
    }
    post {
        failure {
            emailext(
                subject: "СБОРКА ПРОВАЛЕНА: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
                body: """
                Проверьте сборку: ${env.BUILD_URL}
                
                Детали:
                - Проект: ${env.JOB_NAME}
                - Номер сборки: ${env.BUILD_NUMBER}
                - Причина: ${currentBuild.currentResult}
                """,
                to: 'team@company.com',
                attachLog: true
            )
        }
        success {
            emailext(
                subject: "Сборка успешна: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
                to: 'team@company.com'
            )
        }
    }
}

2. Интеграция с мессенджерами через плагины

Для Slack:

post {
    failure {
        slackSend(
            channel: '#build-failures',
            color: 'danger',
            message: "❌ Сборка ${env.JOB_NAME} #${env.BUILD_NUMBER} провалена\nСсылка: ${env.BUILD_URL}"
        )
    }
    unstable {
        slackSend(
            channel: '#build-failures',
            color: 'warning',
            message: "⚠️ Сборка ${env.JOB_NAME} нестабильна"
        )
    }
}

Для Telegram (используя Telegram Bot API):

post {
    failure {
        sh '''
            curl -s -X POST "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/sendMessage" \
            -d chat_id=<CHAT_ID> \
            -d text="🚨 Сборка ${JOB_NAME} #${BUILD_NUMBER} провалена! Проверьте: ${BUILD_URL}"
        '''
    }
}

3. Использование условных шагов и триггеров

Для сложных сценариев можно использовать conditional buildstep plugin:

steps {
    // Основные шаги сборки
    sh './build.sh'
}
post {
    always {
        // Всегда выполняем анализ результатов
        script {
            if (currentBuild.result == 'FAILURE') {
                // Дополнительная логика для проваленных сборок
                archiveArtifacts artifacts: 'logs/**/*.log', allowEmptyArchive: true
                
                // Отправка в несколько систем одновременно
                slackSend(channel: '#alerts', message: "Сборка провалена")
                emailext(to: 'oncall-engineer@company.com', subject: 'СРОЧНО: Провал сборки в продакшене')
                
                // Запуск диагностического скрипта
                sh './run-diagnostics.sh'
            }
        }
    }
}

4. Вебхуки для внешних систем мониторинга

Настройка через Generic Webhook Trigger plugin:

triggers {
    GenericTrigger(
        genericVariables: [
            [key: 'build_status', value: '\\$.build.status'],
            [key: 'project_name', value: '\\$.project.name']
        ],
        postContentParameters: [
            [name: 'BUILD_RESULT', value: currentBuild.result]
        ],
        token: 'SECRET_TOKEN',
        causeString: 'Triggered by monitoring system'
    )
}

5. Кастомизированные обработчики через Shared Libraries

Для enterprise-решений создаем переиспользуемую библиотеку:

vars/notifyBuildFailure.groovy в Shared Library:

def call(Map config = [:]) {
    def defaultConfig = [
        channels: ['email', 'slack'],
        teams: ['devops', 'backend'],
        priority: 'high'
    ]
    config = defaultConfig + config
    
    echo "Отправка уведомлений о проваленной сборке: ${env.JOB_NAME}"
    
    if (config.channels.contains('email')) {
        sendEmailNotification(config)
    }
    
    if (config.channels.contains('slack')) {
        sendSlackNotification(config)
    }
    
    if (config.priority == 'critical') {
        triggerPagerDutyIncident()
    }
}

private void sendEmailNotification(config) {
    // Логика отправки email
}

private void sendSlackNotification(config) {
    // Логика отправки в Slack
}

Использование в Jenkinsfile:

@Library('notification-lib') _

pipeline {
    post {
        failure {
            notifyBuildFailure(
                channels: ['slack', 'msteams'],
                priority: 'critical',
                teams: ['devops', 'platform']
            )
        }
    }
}

Рекомендации по настройке:

  • Ступенчатые уведомления: Первый провал → разработчикам, повторные провалы → тимлидам, критические провалы → DevOps/OnCall
  • Информативность сообщений: Всегда включайте ссылку на сборку, номер сборки, имя джобы и контекстную информацию
  • Отложенные уведомления: Используйте waitUntil для transient-ошибок, чтобы избежать ложных срабатываний
  • Интеграция с тикет-системами: Автоматическое создание JIRA/ServiceNow тикетов при проваленных сборках
  • Мониторинг эффективности: Отслеживайте MTTR (Mean Time To Recovery) для проваленных сборок

Диагностика проблем:

# Проверка почтовых настроек через Groovy Console
import jenkins.model.*
def mailer = Jenkins.instance.getDescriptorByType(hudson.tasks.Mailer.DescriptorImpl)
println "SMTP сервер: ${mailer.smtpServer}"
println "SMTP порт: ${mailer.smtpPort}"

# Просмотр логов отправки
tail -f $JENKINS_HOME/logs/mail.log

Правильная настройка нотификаций существенно сокращает время реакции на проблемы и улучшает процесс CI/CD, обеспечивая прозрачность и оперативность обработки инцидентов.