CI(ee)/CD & Container

Ilham Darmawan
PPL D7 — Fasilkom UI
5 min readApr 3, 2019
Factory by Unsplash

Halo bos, kali ini kita akan membahas mengenai CI/CD dan pengertian awal dari container dalam pengembangan perangkat lunak. CI/CD adalah sebuah best practice yang seringkali kita dengar dalam pengembangan perangkat lunak. CI/CD terdiri dari dua bagian, yaitu Continuous Integration dan Continuous Delivery (atau Deployment?). Selain itu ada juga istilah lain yang bernama container. Seperti namanya, fungsinya adalah sebagai environment untuk ‘menampung’ suatu kode. Mari kita bahas satu per satu.

Continuous Integration

Integration. Ya, kata ini yang membedakan antara CI dan CD. Integrasi yang dimaksud adalah integrasi baris kode. Dalam hal ini, kita ingin suatu proses pengintegrasian kode yang dapat berlangsung secara kontinu. Duh ribet ya. Simple-nya integrasi yang dimaksud dapat didefinisikan ketika proses merging kode yang dikembangkan oleh beberapa developer. Misal ada satu developer yang mengembangkan front end, kemudian satu orang lagi mengerjakan bagian back end. Nah orang front end ini ngestuck karena menunggu orang back end selesai. Dengan continuous integration ini, kita dapat menerima versi terbaru dengan dilakukannya commit oleh developer. Yang penting jangan lupa commit sih…

Continuous Delivery(atau Deployment ?)

Nah untuk pengertian dari CD sendiri terkadang orang-orang menyebutkannya bermacam-macam, ada yang bilang delivery dan ada yang bilang deployment. Kita akan bahas keduanya.

Masuk ke bagian delivery McD 14045, sekarang kita akan membahas pengertian dari continuous delivery. Continuous delivery yang dimaksud adalah layanan pesan antar yang kontinu. Maaf, bercanda. Pengertiannya adalah deliver suatu produk yang berlangsung secara kontinu yang memiliki siklus yang cepat. Bisa harian, mingguan, atau waktu lainnya. Yang jelas bukan 5 tahunan ya kayak ganti presiden aja.

Lalu untuk deployment, dimana setiap perubahan yang lolos pada tiap tahap dalam production pipeline (biasanya ada di gitlab jalanin gitlab ci yang nanti akan kita bahas) akan langsung di-deliver kepada pengguna tanpa adanya campur tangan developer lagi. Jadi hanya tes yang gagal yang dapat menyebabkan gagal di-deliver-nya produk tersebut ke pengguna.

Nah setelah kita membahas mengenai CI/CD, mari kita membahas secara singkat mengenai container dalam pengembangan suatu aplikasi.

Container

Ya, sesuai dengan namanya, container berfungsi untuk menampung suatu aplikasi dalam environment tertentu yang berisi dependencies aplikasi tersebut sehingga dapat berjalan dengan baik dan independen terhadap sistem operasi

Kegunaan dari container adalah agar aplikasi tersebut dapat berjalan dalam berbagai environment, misal pada saat development menggunakan environment Linux, akan tetapi saat production menggunakan Windows, maka hampir dapat dipastikan aplikasi tersebut tidak dapat berjalan dengan baik karena aplikasi tersebut dependen terhadap sistem operasi. Misal dalam sebuah package.json terdapat perintah

find ./node_modules/* -mtime +10950 -exec touch {} \\;

Seperti yang kita tahu perintah tersebut hanya ada di Unix dan tidak ada di Windows, sehingga apabila dijalankan akan menimbulkan error. Untuk implementasi dari container di PPL adalah menggunakan Docker.

Selanjutnya kita akan membahas mengenai CI/CD dan containerized development dalam proyek kami

CI/CD Hands on

Dalam PPL, branch dalam gitlab dibedakan menjadi branch development, staging, dan production. Dapat dilihat pada gambar di bawah.

Sekumpulan branch pada proyek kami

Pada gambar tersebut terdapat beberapa branch. Branch yang diawal dengan ‘US’ merupakan development, kami otak-atik kode disitu. Lalu untuk branch staging yang nantinya setiap branch user story akan di-merge kesana pada tiap akhir sprint. Yang belum ada adalah branch production karena adanya ketika akhir PPL. Nah bagian ini merupakan bagian CI-nya karena sesuai dengan konsepnya, integrasi yang kontinu oleh masing-masing developer ke satu branch.

Tiga tahapan dan variabel yang dideklarasikan

Jadi untuk gitlab ci kami terbagi menjadi 3 bagian, yaitu build, test, dan deploy yang tentunya udah jelas ya ngapain hehehe. Lalu ada variables yang berfungsi untuk mendeklarasikan environment variable yang bersifat non confidential.

Fase build untuk service

Nah untuk folder kita terbagi dua, ada folder webapp yang berisi kode frontend dari partner dan ada juga folder service yang berisi kode backend buatan kami sendiri. Untuk itu, perlu dibedakan perintah ketika melakukan perubahan pada masing-masing folder tersebut. Untuk gambar yang ditampilkan di atas adalah contoh build untuk service. Tag image berfungsi untuk docker image nantinya yang akan di-import. Kemudian dideklarasikan stage untuk mendefinisikan perintah tersebut dieksekusi pada fase apa. Lalu script sudah pada tau ya kalau itu menjalankan perintah untuk kodenya. Lalu only changes itu untuk mengecek bahwa build-service akan dijalankan kalau ada perubahan pada folder isi dari folder service atau pun gitlab ci itu sendiri

Fase test untuk service

Pada script ini, dilakukan untuk menjalankan unit testing dan mengecek code coverage.

Fase deployment

Pada fase ini terdapat bagian baru yaitu refs yang berarti akan dieksekusi kalau pipeline tersebut dipicu oleh branch yang memiliki awalan US untuk service_dev_deploy atau staging untuk service_stage_deploy. Oke kita lanjut ke docker ya… Semangat!!!

Docker hands on

Nah lanjut ke bagian docker, pada docker kali ini kita akan membahas mengenai Dockerfile. Dockerfile ini nantinya akan dijalankan secara otomatis oleh docker engine. Cara kerjanya mirip seperti Procfile pada Heroku, namun pada Dockerfile lebih banyak konfigurasi yang kita lakukan. Berikut gambarnya

Isi Dockerfile untuk service

Sebenarnya dari instruksi yang terlihat sudah jelas. Untuk instruksi yang berwarna biru itu berasal dari docker, kemudian yang berwarna putih itu perintah dengan format Unix. FROM berarti kita meng-import docker image yang sudah ada untuk nodejs. Kenapa kita import, karena kita tidak perlu setup lagi environmentnya, cukup pakai saja. Lalu untuk RUN untuk menjalankan perintah berbasis Unix. WORKDIR untuk mendeklarasikan working directory kita. Perintah COPY untuk melakukan proses copy suatu file dengan mengubah ownership dari file tersebut supaya dapat permission yang sesuai. Perintah EXPOSE untuk membuka port yang dapat melakukan koneksi ke container tersebut. Kemudian yang terakhir adalah CMD, yaitu

The main purpose of a CMD is to provide defaults for an executing container

Berbeda dengan RUN sebelumnya untuk menyiapkan dependency, perintah ini berfungsi untuk menjalankan container tersebut.

Nah begitulah bahasan kali ini mengenai CI/CD dan container. Gimana singkat kann. Sampai jumpa!!

--

--