Setup Integrasi Telegram dengan Jenkins Pipeline

Photo of author
Publish in

Apakah kamu seorang Devops yang sering mendapatkan pertanyaan seperti berikut dari tim dev aplikasi.

Deploynya udah selesai belum ? tadi saya udah push nih ke repo stagging. Kok belum up ya ?

Inilah yang saya alami sebelumnya, agak berisik sebenarnya hahaha. Maka dari itu saya jadi berpikir untuk membuat notifkasi pada jenkins agar team dev aplikasi bisa tahu apakah proses deploy berhasil atau belum.

Meme tim dev menanyakan deploy

Jenkins sendiri menawarkan setting notifikasi email yang akan dikirimkan pada saat proses deployment dilakukan, tapi saya merasa ini kurang efektif. Sehingga saya memiliih Telegram untuk digunakan sebagai alert notification.

Saya coba beberapa plugin telegram jenkins tapi tidak ada yang cocok, akhirnya saya memilih memasukan code kedalam pipeline secara langsung. Cara ini cukup efektif saya gunakan sampai sekarang. Berikut saya bahas cara integrasinya.

Tahap 1 : Setup Telegram

Sebelum melakukan integrasi, buat bot telegram terlebih dahulu. Caranya cukup mudah, kamu coba akses BotFather dari telegeram. Jalankan perintah /start lalu /newbot, berikan nama bot, usernamebot dan kamu akan mendapatkan Token API dari bot yang sudah kamu buat.

Pembuatan Telegrambot

Token API ini yang akan kita gunakan untuk ber-integrasi antara Pipeline Jenkins dan bot telegram yang sudah kita buat, pastikan Token tidak kamu sebar ke internet ya :v

Selanjutnya buat group telegram, lalu add telegrambot yang sudah dibuat sebelumnya. Tambahkan juga @myidbot ke group telegram untuk bisa mendapatkan idgroup.

Untuk mendapatkan groupid, kamu bisa gunakan perintah /getgroupid@myidbot didalam group, lalu bot akan mengirimkan informasi groupid yang nanti akan digunakan pada proses setup Jenkins.

Check groupid telegram

Optional

Jika kamu membuat group telegram berbasis thread (sub group), kamu bisa memuat notifikasi muncul pada thread tertentu saja yaitu dengan mengambil thread_id. Caranya cukup klik salah satu thread dan lihat angka terakhir setelah “/” dari link tersebut. Misalkan pada gambar adalah 2

Check threadid group telegram

Tahap 2 : Setup Credential Jenkins

Selanjutnya tambahkan Token API yang sudah didapatkan pada proses pembuatan telegram bot kedalam Credential Jenkins. Ini dibutuhkan agar Token bisa lebih aman saat disimpan, dan kita hanya perlu memanggil id credentialnya saja.

Setup credential jenkins

Buat juga credential chat_id_telebot yang berisikan informasi secret untuk groupid dari Telegram Group yang kita gunakan sebagai penampung notification alert.

Tahap 3 : Setup Pipeline Script

Tambahkan/Modifikasi pipeline yang akan digunakan pada Jenkins dengan menambahkan code yang akan mengarahkan pada notifikasi telegram mulai dari commit hingga post action berikut.

pipeline {
    agent {
        label 'stagging-develop'
    }
    
    environment {
        APPS_SERVICE = 'telemonitbot'
        TIMESTAMP = new Date().format("ddMMyy.HHmm")  // Format waktu
        
        // Telegram configuration
        TOKEN = credentials('telegram_alert')
        CHAT_ID = credentials('chat_id_telebot')
    }
    
    stages {
        stage('Pull Repository') {
            steps {
                script {
                    // Alert to Telegram for Starting Commit
                     sh """
                        curl -X POST -H 'Content-Type: application/json' \\
                        -d '{
                            "chat_id": "$CHAT_ID",
                            "text": "🚀 *Commit Detected!*\\n*Apps* : ${JOB_NAME}\\n*Build Number*: #${BUILD_NUMBER}",
                            "message_thread_id": "11",
                            "parse_mode": "Markdown"
                        }' "https://api.telegram.org/bot$TOKEN/sendMessage"
                        """
                        
                     // Starting Commit  
                     git branch: 'master',
                        credentialsId: 'project-kantor',
                        url: 'https://github.com/tresnax/telemonit_bot.git'
                }
            }
        }

         stage('Build Image') {
             steps {
                 script {
                     try {
                          sh "docker build -t ${APPS_SERVICE}:${TIMESTAMP} ."
                          sh "docker tag ${APPS_SERVICE}:${TIMESTAMP} ${APPS_SERVICE}:latest"
                      } catch (Exception e) {
                        env.FAILED_STAGE = 'Build Image'
                        throw e
                    }
                 }
             }
         }
        

        stage('Deploy Apps') {
            steps {
                script {
                    try {
                        //Deploy Apps
                        sh "docker compose -f /var/projects/${APPS_SERVICE}/docker-compose.yaml up -d ${APPS_SERVICE}"
                    } catch (Exception e) {
                        env.FAILED_STAGE = 'Deploy Apps'
                        throw e
                    }
                }
            }
        }
      }
      
      
      post {
            success {
                script {
                    sh """
                    curl -X POST -H 'Content-Type: application/json' \\
                    -d '{
                        "chat_id": "$CHAT_ID",
                        "text": "✅ *Deploy succeeded!*\\n*Apps* : ${JOB_NAME}\\n*Build Number*: #${BUILD_NUMBER}",
                        "message_thread_id": "11",
                        "parse_mode": "Markdown"
                    }' "https://api.telegram.org/bot$TOKEN/sendMessage"
                    """
                }
            }
            failure {
                script {
                    sh """
                    curl -X POST -H 'Content-Type: application/json' \\
                    -d '{
                        "chat_id": "$CHAT_ID",
                        "text": "❌ *Deploy failure!*\\n*Apps* : ${JOB_NAME}\\n*Build Number*: #${BUILD_NUMBER}\\n*Failed Stage*: ${env.FAILED_STAGE}",
                        "message_thread_id": "11",
                        "parse_mode": "Markdown"
                    }' "https://api.telegram.org/bot$TOKEN/sendMessage"
                    """
                }
            }
            aborted {
                script {
                    sh """
                    curl -X POST -H 'Content-Type: application/json' \\
                    -d '{
                        "chat_id": "$CHAT_ID",
                        "text": "❌ *Deploy aborted!*\\n*Apps* : ${JOB_NAME}\\n*Build Number*: #${BUILD_NUMBER}\\n*Failed Stage*: ${env.FAILED_STAGE}",
                        "message_thread_id": "11",
                        "parse_mode": "Markdown"
                    }' "https://api.telegram.org/bot$TOKEN/sendMessage"
                    """
                }
            }
        }
}

Keterangan

Bagian pertama adalah agent yang digunakan jenkins untuk melakukan build dan deployment, ini bisa kalian sesuaikan. Saya asumsikan kalian sudah paham bagian ini.

pipeline {
    agent {
        label 'stagging-develop'
    }

Bagian kedua, tambahkan ENV untuk credetial Token Telegram bot dan chatid yang sudah dibuat sebelumnya. Dibuat ENV agar mudah pada saat pemanggilan selanjutnya.

 environment {
        APPS_SERVICE = 'telemonitbot'
        TIMESTAMP = new Date().format("ddMMyy.HHmm")  // Format waktu
        
        // Telegram configuration
        TOKEN = credentials('telegram_alert')
        CHAT_ID = credentials('chat_id_telebot')
    }

Bagian ketiga, tambahkan alert notifikasi pada stage awal yaitu pull repository. Kenapa ? Agar telegram memberikan notif pada saat commit terdeteksi. Jadi dev aplikasi tahu “Oh commit saya udah masuk nih, tinggal nunggu proses deploy” begitu kira-kira.

stage('Pull Repository') {
            steps {
                script {
                    // Alert to Telegram for Starting Commit
                     sh """
                        curl -X POST -H 'Content-Type: application/json' \\
                        -d '{
                            "chat_id": "$CHAT_ID",
                            "text": "🚀 *Commit Detected!*\\n*Apps* : ${JOB_NAME}\\n*Build Number*: #${BUILD_NUMBER}",
                            //"message_thread_id": "11",
                            "parse_mode": "Markdown"
                        }' "https://api.telegram.org/bot$TOKEN/sendMessage"
                        """
                        
                     // Starting Commit  
                     git branch: 'master',
                        credentialsId: 'project-kantor',
                        url: 'https://github.com/tresnax/telemonit_bot.git'
                }
            }
        }

Bagian keempat, tambahkan conditional try pada setiap stage. Ini dibutuhkan untuk proses validasi, apakah stage yang kita lakukan berhasil atau tidak. Bila gagal maka pipeline akan mengarahkan pada post action untuk memberitahu bahwa terdapat kegagalan pada stage yang dimaksud.

Lakukan pada semua stage yang dibuat, sesuai dengan style kalian masing-masing pada saat pembuatan pipeline.

stage('Build Image') {
             steps {
                 script {
                     try {
                          sh "docker build -t ${APPS_SERVICE}:${TIMESTAMP} ."
                          sh "docker tag ${APPS_SERVICE}:${TIMESTAMP} ${APPS_SERVICE}:latest"
                      } catch (Exception e) {
                        env.FAILED_STAGE = 'Build Image'
                        throw e
                    }
                 }
             }
         }

Bagian kelima, tambahkan post action di bagian akhir yang akan dieksekusi apabila step pipeline sudah dijalankan semua. Dia akan menyimpulkan sesuai dengan proses yang dilakukan, apakah terdapat failur atau tidak.

post {
            success {
                script {
                    sh """
                    curl -X POST -H 'Content-Type: application/json' \\
                    -d '{
                        "chat_id": "$CHAT_ID",
                        "text": " *Deploy succeeded!*\\n*Apps* : ${JOB_NAME}\\n*Build Number*: #${BUILD_NUMBER}",
                        //"message_thread_id": "11",
                        "parse_mode": "Markdown"
                    }' "https://api.telegram.org/bot$TOKEN/sendMessage"
                    """
                }
            }
            failure {
                script {
                    sh """
                    curl -X POST -H 'Content-Type: application/json' \\
                    -d '{
                        "chat_id": "$CHAT_ID",
                        "text": "❌ *Deploy failure!*\\n*Apps* : ${JOB_NAME}\\n*Build Number*: #${BUILD_NUMBER}\\n*Failed Stage*: ${env.FAILED_STAGE}",
                        //"message_thread_id": "11",
                        "parse_mode": "Markdown"
                    }' "https://api.telegram.org/bot$TOKEN/sendMessage"
                    """
                }
            }
            aborted {
                script {
                    sh """
                    curl -X POST -H 'Content-Type: application/json' \\
                    -d '{
                        "chat_id": "$CHAT_ID",
                        "text": "❌ *Deploy aborted!*\\n*Apps* : ${JOB_NAME}\\n*Build Number*: #${BUILD_NUMBER}\\n*Failed Stage*: ${env.FAILED_STAGE}",
                        //"message_thread_id": "11",
                        "parse_mode": "Markdown"
                    }' "https://api.telegram.org/bot$TOKEN/sendMessage"
                    """
                }
            }
        }
}

Jika sudah kamu modifikasi sesuai dengan style pipeline yang biasa digunakan, simpan dan lakukan deployment untuk memastikan bahwa pipeline berhasil dibuat.

Tahap 4 : Hasil

Jika modifikasi pipeline dan proses deployment berhasil dilakukan maka akan muncul alert seperti berikut baik itu status failed maupun successed.

Hasil alert telegrambot dari jenkins

Dengan begini proses deployment pada jenkins bisa dilihat bukan hanya oleh kamu sebagai devops tapi oleh team dev aplikasi juga, tambahkan team kamu kedalam group telegram agar mendapatkan alert notifikasi juga.

Penutup

Metode notifikasi telegram pada pipeline jenkins ini bisa cukup efektif digunakan, terlebih tanpa penambahan plugin baru. Hanya saja mungkin cukup rumit terutama pada tasks deployment yang sudah banyak karena harus mengubah pipeline satu persatu untuk menambahkan fitur alert.

Untuk ekosistem ci/cd yang masih sedikit dan baru, cara ini mungkin akan cukup mudah dilakukan karena tidak memerukan banyak modifikasi pada pipeline. Semoga cara ini bisa membantu.

Referensi

  • https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#string-interpolation
  • https://medium.com/@rezvovvad/send-notifications-to-a-specific-topic-in-the-telegram-chat-1f570b7ab929
  • https://dev.to/sharker3312/manual-approval-and-telegram-notifications-in-jenkins-1l7a