Setup Continuous Integration

Pada 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.

Travis CI Home Page

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.

Enable CI di Travis

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.

Proses Build di Travis

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.

Coveralls Sign In Page

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.

Coveralls Add Repo

Kita bisa mendaftarkan project yang ingin kita tampilkan coverage reportnya. Setelah dienable, akan tampil instruksi untuk mengirim laporan coverage ke Coveralls.

Setup 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

Coverage History

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

Coverage Project

dan bahkan kalau kita klik, kita bisa lihat baris per baris apakah sudah dijalankan oleh test.

Line Coverage

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

Build Badge

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 ……