Integrasi* Sonar Scanner dan Gitlab CI/CD

Bayu Hendra Winata
Javan Cipta Solusi
Published in
4 min readJan 23, 2021

--

Flashback

Ada baiknya Anda membaca dahulu artikel-artikel di bawah ini:

Kenapa Perlu Sonar?

Cara Install Sonarlint di IntelliJ IDEA

Integrasi Sonarlint, PHPStorm, dan SonarQube

Apa Itu Sonar Scanner?

Pada tulisan-tulisan di atas, kita sudah tahu bahwa sonarlint harus diintegrasikan dengan editor/IDE, dan hasil analisisnya hanya bisa dilihat di editor/IDE tersebut. Sedangkan Sonar Scanner adalah sebuah dedicated CLI yang bisa kita gunakan untuk melakukan scanning kode dan mengirim hasil analisisnya ke server SonarQube sehingga skornya bisa up to date dengan kondisi kode saat ini.

Sonar Scanner ini harus diinstall di device masing-masing dan dijalankan secara menual melalui terminal.

Langkah-langkah instalasinya bisa dibaca di: https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/

Menjalankan Sonar Scanner Otomatis

Agar mendapatkan hasil analisis yang realtime, sesuai dengan kondisi kode saat ini, maka kita harus secara rutin menjalankan sonar-scanner setiap kali ada perubahan kode. Tentu saja cara ini tidak efektif, karena bergantung pada manusia (yang bisa lupa). Opsi yang adalah membuat cronjob/scheduler untuk melakukan scanning secara otomatis dalam periode tertentu. Sedikit lebih otomatis, tetapi perlu usaha lebih untuk setup.

Cara yang lebih efisien adalah mengintegrasikan sonar-scanner dengan CI/CD, sehingga proses analisis kode otomatis dijalankan setiap ada perubahan kode (push ke branch tertentu).

Mari kita bahas langkah-langkahnya.

Menyiapkan File sonar-project.properties

File sonar-project.properties berisi konfigurasi terkait project sonarqube yang akan dijalankan. Kita bisa memiliki banyak project dimana masing-masing project memiliki konfigurasinya sendiri.

Contoh project SonarQube

Berikut ini contoh minimal sebuah file sonar-project.properties:

sonar.projectKey=aplikasi-pengaduan-pbj
sonar.host.url=https://sonar.javan.co.id
#sonar.login=<login token>

Selain melalui file sonar-project.properties, kita juga bisa mengatur konfigurasi melalui web interface yang sudah disediakan SonarQube:

Contoh konfigurasi sebuah project SonarQube

Jika ada config key yang sama, maka entri di sonar-project.properties lebih diprioritaskan.

Mendapatkan Token Login

Langkah selanjutkan adalah mendapatkan Token yang akan dipakai sebagai pengganti username-password. Token bisa didapatkan dengan login sebagai admin ke web interface SonarQube.

Menu Account — Security

Setelah mendapatkan token, ada 2 opsi yang bisa dilakukan:

  1. Menambahkan entri sonar.login=<token> ke file sonar-project.properties. Tentu saja cara ini riskan karena <token> harusnya bersifat rahasia dan tidak untuk diakses umum.
  2. Memasukkan sonar.login sebagai Environment Variables di Gitlab CI/CD. Cara ini lebih dianjurkan demi menjaga kerahasiaan <token>.

Setup gitlab-ci

Untuk mengintegrasikan Sonar Scanner dengan Gitlab, kita perlu menambahkan entri berikut ini ke file .gitlab-ci.yml:

sonarqube-check:
tags:
- cloud
stage: code-quality
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [ "" ]
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner -Dsonar.qualitygate.wait=true -Dsonar.login=$SONAR_TOKEN
only:
- develop
allow_failure: true

Intinya, task di atas akan memanfaatkan docker image sonarsource/sonar-scanner-cli untuk menjalankan perintah “sonar-scanner” terhadap source code yang ada di branch develop. Silakan ubah isinya sesuai kebutuhan.

Satu langkah lagi, kita perlu menambahkan variables SONAR_TOKEN melalui halaman admin Gitlab.

Seperti yang sudah kita bahas di atas, parameter “-Dsonar.login=” ini sama dengan entry “sonar.login” di file sonar-project.properties. Parameter yang dipanggil melalui command-line (seperti contoh script di atas) akan lebih diprioritaskan dibanding parameter yang didefinisikan di file properties.

Jadi urutan prioritas parameter Sonar Scanner adalah:

  1. Parameter command line
  2. File sonar-project.properties
  3. Settings di web interface SonarQube

Setelah semua di-setup dengan benar, mulai sekarang setiap kali ada push ke branch develop maka sonar-scanner akan dijalankan otomatis sekaligus meng-update skor yang ditampilkan di web interface SonarQube.

Dengan skema seperti ini, maka kita bisa memantau secara realtime kualitas kode yang di-push ke repository.

Better Approach

Skema di atas sudah cukup baik, tapi memiliki satu kekurangan, yaitu analisis kode dilakukan setelah kode di-merge ke main branch. Idealnya analisis bisa dilakukan di tahap Merge Request (di masing-masing feature branch), dimana kode masih dalam fase review dan belum di-merge. Jika MR tidak memenuhi standar sonar, maka otomatis tertolak dan harus diperbaiki terlebih dahulu. Bukankah lebih baik mencegah daripada mengobati?

Tentu saja SonarQube sudah menyediakan fitur ini, tapi hanya tersedia untuk versi berbayar.

Branch analysis hanya tersedia di versi berbayar

Berapa harganya?

Pricing SonarQube Developer Edition

Sebagai estimasi, sebuah proyek bisa dibagi menjadi 3 kategori jika dilihat dari jumlah line of code:

  1. Skala kecil, kurang dari 10.000 loc
  2. Skala menengah, 10.000–100.000 loc
  3. Skala besar > 100.000 loc

Tahun 2020 kemarin, rata-rata loc project di Javan adalah 41.450. Jadi, jika perusahaan Anda harus memantau 20 proyek dalam setahun (baik proyek aktif ataupun prooyek yang sudah dalam fase maintenance), maka kira-kira total loc yang perlu dipantau adalah 829.000 (paket yang 1 Million). Jadi dalam setahun harus membayar sekitar:

Apakah cukup menarik?

--

--

Bayu Hendra Winata
Javan Cipta Solusi

80% programmer, 20% designer, 100% ayah