Belajar Jenkins - Automated Testing, Code Quality & SonarQube Integration
Episode 14 of 21

Belajar Jenkins - Automated Testing, Code Quality & SonarQube Integration

Publikasikan hasil test dan coverage ke Jenkins, integrasikan SonarQube untuk static code analysis, dan hentikan pipeline otomatis saat Quality Gate gagal dengan waitForQualityGate.

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

Pendahuluan

Di episode 13 kita menjadikan konfigurasi Jenkins sebagai kode dengan JCasC. Sekarang mari kita pertanyakan sesuatu yang sering dianggap remeh: apa isi dari pipeline kalian sebenarnya?

Banyak pipeline yang berhenti di tahap build — kompilasi sukses, image jadi, lalu langsung deploy. Padahal build yang sukses sama sekali tidak menjamin kode itu benar, aman, atau layak rilis. Bayangkan lulus ujian tulis tanpa ada yang memeriksa jawaban: nilai keluar, tapi kesalahan mendasar tetap lolos. Di dunia nyata, CI yang serius wajib menjalankan automated test, mengukur code coverage, dan menilai kualitas kode secara statis sebelum sesuatu boleh menuju produksi.

Di episode ini kita akan mempublikasikan hasil test ke Jenkins dengan step junit, mengintegrasikan coverage dengan JaCoCo, lalu menghubungkan Jenkins ke SonarQube untuk static code analysis lengkap dengan Quality Gate yang bisa menghentikan pipeline otomatis.

Pembahasan Utama

Publikasikan Hasil Test dengan Step junit

Framework test modern menghasilkan laporan XML di lokasi standar, misalnya Maven menulis ke target/surefire-reports/. Jenkins bisa membaca laporan tersebut dan menampilkan tren, flaky test, dan histori per build dengan step junit:

JenkinsPublish hasil test
steps {
    sh 'mvn test'
    junit 'target/surefire-reports/*.xml'
    archiveArtifacts artifacts: 'target/surefire-reports/*.xml'
}

Pattern di argumen junit bersifat glob dan relatif terhadap workspace. Setelah step ini berjalan, halaman build menampilkan ringkasan jumlah test yang lolos, gagal, dan skipped, lengkap dengan grafik tren antar build.

Tip

Jika banyak test gagal acak (flaky), pantau halaman tren test di Jenkins. Pola test yang selalu hijau kadang berubah menjadi merah tanpa perubahan kode — itu sinyal test bergantung pada urutan atau state global.

Integrasi Code Coverage dengan JaCoCo

Menjalankan test saja belum cukup; kita perlu tahu seberapa banyak kode yang benar-benar diuji. Untuk Java, JaCoCo adalah standar coverage. Konfigurasikan di pom.xml, lalu setelah mvn test Jenkins merekam hasilnya dengan step jacoco:

JenkinsRekam coverage dengan JaCoCo
steps {
    sh 'mvn test'
    jacoco execPattern: 'target/jacoco.exec',
           classPattern: 'target/classes',
           sourcePattern: 'src/main/java'
}

Jenkins lalu menampilkan persentase line, branch, dan method coverage di halaman build. Untuk proyek berbasis XML coverage seperti Cobertura, gunakan step cobertura dengan file laporan coverage.xml. Tampilkan coverage sebagai salah satu syarat kelulusan — misalnya di bawah 70 persen berarti perlu ditingkatkan.

Koneksikan Jenkins ke SonarQube

Untuk menilai kualitas kode secara menyeluruh — bug, code smells, duplikasi, dan celah keamanan — gunakan SonarQube. Arsitekturnya: server SonarQube sebagai analis, dan plugin SonarQube Scanner for Jenkins sebagai jembatannya. Konfigurasikan server di Manage Jenkins > Configure System, lengkapi credential token, lalu setiap project bisa menambahkan file sonar-project.properties:

sonar-project.properties
sonar.projectKey=my-app
sonar.projectName=My App
sonar.sources=src
sonar.tests=src/test
sonar.java.binaries=target/classes
sonar.jacoco.reportPaths=target/jacoco.exec

Untuk proyek Maven, analisis bisa dijalankan langsung lewat plugin sonar Maven di dalam blok withSonarQubeEnv, yang mengarahkan scanner ke server yang telah dikonfigurasi.

Quality Gate: Gerbang Kualitas Otomatis

SonarQube menilai kualitas berdasarkan Quality Gate — kumpulan ambang batas seperti coverage minimum atau jumlah blocker bug. Setelah analisis selesai, step waitForQualityGate menunggu hasil penilaian dan menghentikan pipeline jika gate gagal. Contoh pipeline lengkap untuk proyek Java:

JenkinsPipeline dengan SonarQube Quality Gate
pipeline {
    agent { label 'linux-runner' }
    stages {
        stage('Build & Test') {
            steps {
                sh 'mvn clean verify'
            }
        }
        stage('Publish Test & Coverage') {
            steps {
                junit 'target/surefire-reports/*.xml'
                jacoco execPattern: 'target/jacoco.exec'
            }
        }
        stage('SonarQube Analysis') {
            steps {
                withSonarQubeEnv('SonarQube') {
                    sh 'mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.11.0.3922:sonar'
                }
            }
        }
        stage('Quality Gate') {
            steps {
                timeout(time: 5, unit: 'MINUTES') {
                    waitForQualityGate abortPipeline: true
                }
            }
        }
    }
}

Dengan abortPipeline: true, pipeline dihentikan otomatis begitu SonarQube melaporkan gate gagal — kode tidak akan pernah sampai ke tahap deploy.

Warning

waitForQualityGate menunggu callback dari server SonarQube. Jika webhook ke Jenkins tidak dikonfigurasi di SonarQube, atau Quality Gate tidak di-set agar lulus otomatis saat tidak ada analisis baru, step ini bisa menggantung selamanya. Selalu bungkus dengan timeout seperti contoh di atas.

Important

Perbaiki: pastikan Quality Gate default di SonarQube diterapkan ke project, dan tambahkan webhook http://jenkins.example.com/sonarqube-webhook/ di administrasi SonarQube. Tanpa keduanya, hasil gate tidak akan pernah sampai kembali ke Jenkins.

Apa yang Terjadi Saat Gate Gagal?

Begitu ambang batas dilanggar, SonarQube mengirim status ERROR dan Jenkins menghentikan build tepat di stage Quality Gate. Tim pengembang melihat langsung di halaman build mana analisis melaporkan masalah, membuka detail di dashboard SonarQube, dan memperbaikinya di source code sebelum memicu build berikutnya. Gerbang ini mengubah kualitas dari sekadar harapan menjadi persyaratan yang ditegakkan otomatis.

Tip

Mulailah dengan gate yang realistis — misalnya coverage minimal dan zero blocker — lalu perketat seiring tim terbiasa. Gate yang terlalu ketat sejak awal biasanya memicu tim untuk menonaktifkannya.

Penutup

Pada episode 14 ini kalian telah mempublikasikan hasil test lewat step junit, merekam code coverage dengan JaCoCo, menghubungkan Jenkins ke SonarQube untuk static code analysis, dan menegakkan kualitas lewat waitForQualityGate yang menghentikan pipeline otomatis saat Quality Gate gagal. Kalian juga tahu jebakan umum berupa gate yang menggantung jika webhook tidak terkonfigurasi.

Kini pipeline kalian lengkap di sisi build: aman, terkonfigurasi sebagai kode, teruji, dan berkualitas. Tinggal satu tahap tersisa yang paling ditunggu: mengirim kode ke server produksi.

Di episode 15 berikutnya kita akan membahas Continuous Deployment (CD) ke Linux Server via SSH / Ansible — menginjeksi SSH key secara aman dan mengotomatisasi deployment memakai Ansible. Sampai jumpa!

Belajar Jenkins - Automated Testing, Code Quality & SonarQube Integration | Belajar Jenkins