Belajar Jenkins - Production Notification & ChatOps Integration
Episode 17 of 21

Belajar Jenkins - Production Notification & ChatOps Integration

Di episode ini kita mengintegrasikan notifikasi real-time ke Slack, Microsoft Teams, dan Telegram Bot agar status build sukses, gagal, atau dibatalkan langsung sampai ke tim. Kita juga mempelajari Email Extension plugin untuk mengirim laporan HTML kustom kepada tim developer dan QA ketika pipeline mengalami kegagalan.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

Di episode 16 kita berhasil deploy ke Kubernetes dan Helm. Tapi ada satu hal yang sering terlupakan: bagaimana tim tahu build gagal? Pipeline yang diam tanpa notifikasi ibarat pesan penting yang dikirim tanpa lampiran — tidak ada yang menyadarinya sampai masalah muncul di production. Di sinilah ChatOps dan notifikasi otomatis berperan.

Di episode ini kita akan membahas:

  1. Notifikasi real-time ke Slack dengan step slackSend.
  2. Alternatifnya: Microsoft Teams dan Telegram Bot lewat incoming webhook.
  3. Email HTML kustom dengan Email Extension plugin (emailext).

Mengapa ChatOps Penting?

ChatOps memindahkan informasi build dari dalam Jenkins UI ke kanal komunikasi tim. Keuntungannya:

  • Respons cepat — kegagalan langsung terlihat, bukan ditunggu orang membuka Jenkins.
  • Konteks lengkap — durasi build, commit author, dan link log tersedia dalam satu pesan.
  • Akuntabilitas — siapa yang memperkenalkan perubahan bermasalah langsung terlihat.
  • Audit — history notifikasi menjadi jejak aktivitas deployment.

Pola terbaiknya: kirim notifikasi di blok post sehingga terpicu otomatis apa pun hasil build.

Integrasi Slack dengan slackSend

Plugin Slack Notification menyediakan step slackSend. Pertama, buat Slack App di workspace tim dan aktifkan fitur Incoming Webhooks. Token webhook disimpan sebagai credential Secret text di Jenkins (misal ID slack-token).

Tip

Konfigurasi global Slack (base URL dan default channel) bisa diisi sekali di Manage Jenkins lalu Configuration System. Step di pipeline cukup memakai channel override saat diperlukan.

Berikut contoh notifikasi yang memuat status, durasi, dan commit author:

JenkinsJenkinsfile - notifikasi Slack di blok post
post {
    always {
        script {
            def author = sh(
                script: 'git log -1 --pretty=%an',
                returnStdout: true
            ).trim()
            def duration = currentBuild.durationString.replace(' and counting', '')
            def channel = currentBuild.currentResult == 'SUCCESS' ? '#deploy-success' : '#deploy-alert'
            slackSend(
                color: currentBuild.currentResult == 'SUCCESS' ? 'good' : 'danger',
                message: "Build ${env.JOB_NAME} #${env.BUILD_NUMBER} ${currentBuild.currentResult} by ${author} (${duration}) - ${env.BUILD_URL}",
                channel: channel,
                tokenCredentialId: 'slack-token'
            )
        }
    }
}

Beberapa hal yang perlu diperhatikan:

  • currentBuild.currentResult bernilai SUCCESS, FAILURE, atau ABORTED.
  • color bernilai good untuk hijau dan danger untuk merah di Slack.
  • tokenCredentialId merujuk ke Secret text yang kita buat.
  • Commit author diambil dengan git log -1 di awal blok.

Warning

Jangan pernah menulis token Slack langsung di Jenkinsfile. Selalu pakai credentials store lewat tokenCredentialId agar token tidak terbaca di repository.

Integrasi Microsoft Teams

Teams menggunakan Incoming Webhook di kanal tim. Setelah webhook URL dibuat, kirim pesan JSON menggunakan step httpRequest dari plugin HTTP Request. URL webhook disimpan sebagai Secret text.

JenkinsJenkinsfile - notifikasi Microsoft Teams
def teamsMessage(String status) {
    return """
    {
      "@type": "MessageCard",
      "summary": "Build ${env.JOB_NAME}",
      "themeColor": "${status == 'SUCCESS' ? '00FF00' : 'FF0000'}",
      "sections": [{
        "activityTitle": "Build ${env.JOB_NAME} #${env.BUILD_NUMBER} ${status}",
        "text": "Log: ${env.BUILD_URL}"
      }]
    }
    """
}
 
post {
    failure {
        withCredentials([string(credentialsId: 'teams-webhook', variable: 'TEAMS_URL')]) {
            httpRequest(
                url: env.TEAMS_URL,
                httpMode: 'POST',
                contentType: 'APPLICATION_JSON',
                requestBody: teamsMessage('FAILURE')
            )
        }
    }
}

Integrasi Telegram Bot

Telegram Bot di-generate dari BotFather, menghasilkan token API dan kita tentukan chat ID tujuan. Endpoint yang dipanggil adalah sendMessage. Contohnya:

JenkinsJenkinsfile - notifikasi Telegram
post {
    failure {
        withCredentials([string(credentialsId: 'telegram-token', variable: 'TG_TOKEN')]) {
            sh 'curl -s -X POST \
                "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
                --data-urlencode chat_id=-1001234567890 \
                --data-urlencode "text=Build ${JOB_NAME} #${BUILD_NUMBER} FAILED - ${BUILD_URL}"'
        }
    }
}

curl dikirim ke API Telegram dengan chat ID negatif untuk grup. Pesan memuat nama job, nomor build, dan link console agar anggota grup bisa langsung menelusuri penyebab kegagalan.

Email HTML Kustom dengan Email Extension

Email Extension Plugin memberikan step emailext yang jauh lebih fleksibel daripada notifikasi email bawaan Jenkins. Pertama, konfigurasi SMTP di Manage Jenkins lalu Configuration System, dan pastikan default recipients diisi.

Contoh email HTML untuk tim dev dan QA saat build gagal:

JenkinsJenkinsfile - emailext dengan body HTML
post {
    failure {
        emailext(
            to: 'dev-team@example.com, qa-team@example.com',
            subject: "BUILD FAILED: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
            mimeType: 'text/html',
            body: '''
                <h2>Build Gagal</h2>
                <p>Job <b>${env.JOB_NAME}</b> build <b>#${env.BUILD_NUMBER}</b> gagal.</p>
                <p>Author: ${env.CHANGE_AUTHOR}</p>
                <p>Durasi: ${currentBuild.durationString}</p>
                <p><a href="${env.BUILD_URL}console">Lihat Console Log</a></p>
                <hr>
                <p>Ringkasan kesalahan:</p>
                <pre>${env.ERROR_MESSAGE}</pre>
            ''',
            attachLog: true
        )
    }
}

Fitur yang dimanfaatkan:

  • to — daftar penerima, bisa memakai variabel atau recipient list dari konfigurasi.
  • mimeType: 'text/html' — email dirender sebagai HTML.
  • attachLog — melampirkan console log sebagai artefak.
  • Templating body mendukung interpolasi variabel Jenkins, sehingga email selalu kontekstual.

Note

Environment variable CHANGE_AUTHOR tersedia untuk pipeline yang dipicu oleh pull request. Untuk build dari branch langsung, gunakan nilai dari git log seperti contoh Slack di atas.

Best Practice Notifikasi

  • Satu sumber: buat fungsi notifikasi di shared library (episode 9) agar semua pipeline memakai format pesan yang sama.
  • Tidak semua kanal: kirim notifikasi success hanya ke kanal ringkas, sedangkan failure ke kanal alert yang dipantau cepat.
  • Selalu sertakan link: tambahkan URL console build di setiap pesan.
  • Batas ukuran: jangan kirim log penuh ke chat; cukup ringkasan dan tautan.

Penutup

Di episode ini kita mengintegrasikan notifikasi production dan ChatOps:

  • slackSend mengirim status build lengkap dengan durasi dan commit author ke Slack.
  • Microsoft Teams memakai incoming webhook dengan httpRequest.
  • Telegram Bot lewat API sendMessage dengan curl.
  • emailext mengirim laporan HTML kustom beserta console log ke tim dev dan QA.

Build yang selalu memberi kabar adalah fondasi observability. Di episode 18 kita akan membahas bagaimana menjaga Jenkins sendiri tetap sehat: High Availability, backup, disaster recovery, dan monitoring dengan Prometheus dan Grafana. Sampai jumpa!

Belajar Jenkins - Production Notification & ChatOps Integration | Belajar Jenkins