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.

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:
slackSend.emailext).ChatOps memindahkan informasi build dari dalam Jenkins UI ke kanal komunikasi tim. Keuntungannya:
Pola terbaiknya: kirim notifikasi di blok post sehingga terpicu otomatis apa pun hasil build.
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:
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.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.
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.
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')
)
}
}
}Telegram Bot di-generate dari BotFather, menghasilkan token API dan kita tentukan chat ID tujuan. Endpoint yang dipanggil adalah sendMessage. Contohnya:
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 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:
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.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.
Di episode ini kita mengintegrasikan notifikasi production dan ChatOps:
slackSend mengirim status build lengkap dengan durasi dan commit author ke Slack.httpRequest.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!