Setup Continuous Integration
23 Feb 2016Pada artikel sebelumnya, kita telah membuat struktur project lengkap dari database sampai ke web. Project tersebut juga telah dilengkapi dengan automated test dan sampel data.
Akan tetapi, di artikel terdahulu tersebut, kita harus menjalankan semua test tersebut melalui command line. Dengan demikian, bila ada programmer yang malas membuat automated test dan menjalankannya, kita tidak bisa mendeteksinya.
Untuk itu, kita akan mengkonfigurasi continuous integration, yaitu suatu scheduler yang memantau repository Git kita, dan menjalankan proses build pada waktu ada update di repository. Dengan demikian, apabila terjadi error, semua anggota tim bisa langsung mendapatkan notifikasi.
Ada beberapa tools untuk menjalankan proses ini. Pada jaman dahulu saya pernah juga menulis artikel tentang penggunaan CruiseControl dan Luntbuild. Tapi itu artikel jadul sekali, yang populer pada jaman sekarang adalah Travis dan Jenkins
Travis
Travis adalah tools continuous integration (kita singkat saja CI yah, capek ngetiknya) yang berbasis cloud. Kita tinggal registrasi, daftarkan project kita, dan dia akan melakukan build terhadap project kita.
Travis CI sangat terintegrasi dengan Github. Jadi kalau kita sudah punya akun Github, kita bisa langsung login menggunakan Github.
Setelah kita login, Travis akan mengakses akun Github kita dan menampilkan daftar repository kita dalam Github. Untuk mengaktifkan fitur CI, kita tinggal klik saja project yang ingin diproses.
Setelah dienable, Travis akan memantau project kita. Pada saat terjadi git push
, Travis akan menjalankan proses build sesuai konfigurasi yang kita tulis di file .travis.yml
. Berikut contoh file yang saya gunakan
language: java
jdk:
- oraclejdk8
services:
- mysql
before_install:
- mysql -uroot -e "grant all on belajar.* to belajar@localhost identified by 'java'"
- mysql -uroot -e "drop database if exists belajar"
- mysql -uroot -e "create database belajar"
Pada konfigurasi di atas, kita menyatakan bahwa project kita dibuat menggunakan bahasa pemrograman Java. Travis akan mencoba melakukan build menggunakan Maven atau Gradle. Bila di project kita ada file pom.xml
, Travis akan menggunakan Maven. Demikian juga bila ditemukan file build.gradle
, Travis akan menggunakan Gradle. Dokumentasi lengkapnya bisa dibaca di dokumentasi Travis.
Aplikasi kita menggunakan database MySQL. Untuk mengaktifkannya kita tulis konfigurasi
services:
- mysql
Agar tidak banyak modifikasi source code, kita juga samakan username, password, dan nama database. Ini dikonfigurasi menggunakan script before install
.
Setelah konfigurasi .travis.yml
kita sediakan, kita lakukan git push
. Travis akan mulai melakukan proses build.
Coveralls
Bagaimana bila programmer kita malas membuat automated test?
Pertama, tentu kita butuh notifikasi dulu bila mereka tidak membuat test. Untuk keperluan ini, kita bisa menggunakan coverage testing. Konsepnya sudah pernah saya bahas di artikel terdahulu.
Pada artikel tersebut, laporan dari coverage report bisa kita lihat di komputer kita sendiri. Belum dipublish supaya bisa dilihat semua orang, dan juga belum ada notifikasinya. Untuk itu, kita menggunakan layanan tambahan yang disediakan oleh Coveralls.
Sama seperti Travis, Coveralls juga sudah terintegrasi dengan Github. Kita bisa login menggunakan akun Github, dan dia akan membaca project-project yang tersedia di akun Github kita.
Kita bisa mendaftarkan project yang ingin kita tampilkan coverage reportnya. Setelah dienable, akan tampil instruksi untuk mengirim laporan coverage ke Coveralls.
Sebenarnya Coveralls sendiri tidak melakukan coverage testing. Dia mengandalkan tools lain untuk melakukannya dan menghasilkan report. Di Java, kita bisa menggunakan Jacoco, Cobertura, Saga, dan sebagainya. Oleh karena itu, kita perlu mengaktifkannya dulu di proses build kita. Tambahkan baris berikut di pom.xml
di dalam tag <build><plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.5.201505241946</version>
<configuration>
<excludes>
<exclude>**/BelajarCiApplication.*</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
Kita kecualikan main class kita, karena isinya cuma public static void main
yang tidak perlu dites. Bila tidak dikecualikan, akan mengurangi nilai coveragenya.
Jacoco akan menghasilkan file jacoco.exec
yang merupakan hasil coverage testing dan juga file target/site/jacoco/jacoco.xml
. File ini kemudian akan dikonversi menjadi file JSON yang dipahami oleh Coveralls dan dikirim melalui REST API. Konversi dan pengiriman ini dilakukan oleh plugin Maven. Tambahkan baris berikut di bawah deklarasi plugin Jacoco.
<plugin>
<groupId>org.eluder.coveralls</groupId>
<artifactId>coveralls-maven-plugin</artifactId>
<version>4.1.0</version>
</plugin>
Agar Maven menjalankan proses pembuatan report, kita harus mengeksekusi target mvn jacoco:report coveralls:report
. Tambahkan baris berikut di konfigurasi .travis.yml
agar Travis menjalankan target tersebut
after_success:
- mvn jacoco:report coveralls:report
Selanjutnya, pada saat kita melakukan git push
, Travis akan bekerja dan menjalankan target tersebut. Kita dapat melihat history perkembangan nilai coverage test
pada halaman di atas, kita juga bisa mengkonfigurasi notifikasi error apabila nilai coverage turun di bawah sekian persen, atau selisih penurunannya sebesar sekian persen. Saya atur apabila turun di bawah 80%, Coveralls akan mengirim pesan error. Dan bila penurunannya sebesar 5% (misalnya dari 100% turun menjadi 90%), Coveralls juga akan mengirim notifikasi.
Kita juga bisa lihat detail coverage per file source code
dan bahkan kalau kita klik, kita bisa lihat baris per baris apakah sudah dijalankan oleh test.
Build Badge
Jaman sekarang, sangat penting bahwa kita eksis di dunia maya. Demikian juga dalam urusan project. Travis dan Coveralls memahami ini dan menyediakan badge untuk kita pasang di halaman project kita. Cukup tambahkan baris berikut pada file README.md
[[![Build Status](https://travis-ci.org/endymuhardin/belajar-ci.svg?branch=master)](https://travis-ci.org/endymuhardin/belajar-ci)](https://travis-ci.org/endymuhardin/belajar-ci)
[[![Coverage Status](https://coveralls.io/repos/github/endymuhardin/belajar-ci/badge.svg?branch=master)](https://coveralls.io/github/endymuhardin/belajar-ci?branch=master)](https://coveralls.io/github/endymuhardin/belajar-ci?branch=master)
untuk menampilkan badge seperti ini
Penutup
Untuk project open source, Travis dan Coveralls dapat digunakan secara gratis. Tapi untuk project private, kita harus bayar. Pada saat artikel ini ditulis, harganya $129/bulan/project untuk Travis dan $5/bulan/project untuk Coveralls. Cukup mahal juga.
Bila kita ingin murah, maka kita bisa install sendiri tools CI yang tersedia gratis, misalnya:
- Jenkins
- Gitlab CI
Kita bisa install tools tersebut di hosting gratisan seperti Heroku atau Openshift, atau yang berbayar seperti DigitalOcean atau Linode.
Setelah project kita bisa dibuild otomatis, artikel berikutnya akan membahas tentang deployment ke cloud provider populer. Stay tuned ……