CI/CD & Environment



Hello guys, pada kali ini saya mau sharing tentang bagaimana kita melakukan setup terhadap environment yang kita kerjakan.

CI/CD

Pada pengerjaan pengembangan aplikasi ini, kami menggunakan GitLab sebagai repositori kode kami. Nah, hal yang cukup keren dari GitLab adalah, GitLab tidak hanya dapat berfungsi sebagai sekedar tempat penampungan dan kolaborasi kode saja, namun juga terdapat banyak fitur lain yang menarik untuk digunakan. Pada kali ini, kami juga memanfaatkan fitur CI/CD yang diberikan oleh GitLab.

GitLab dapat secara otomatis dikonfigurasikan CI-nya dengan hanya menuliskan konfigurasi dalam sebuah file bernama .gitlab-ci.yml dengan format YML dan diletakkan di root repository. Nah secara umum pipeline dari CI kami berbentuk seperti:


test-mario


Test mario merupakan integrasi yang melakukan tes terhadap backend secara keseluruhan. CI pada GitLab didukung oleh penggunakan image docker sehingga cukup mudah bagi kami untuk melakukan setup karena stack kami juga menggunakan docker sebagai kontener. Pada test-mario kita menggunakan image yang berisikan python dan ditambahkan service berupa postgres yang merupakan stack minimal dalam melakukan testing. Kemudian diberikan konfigurasi, dan script merupakan instruksi secara sekuensial bagaimana cara kita melakukan testing. Dengan menerapkan test-mario maka backend akan diuji setiap kali push sehingga kualitas kode dari backend dapat terjaga.

test-peach


Test peach merupakan integrasi yang melakukan tes terhadap frontend secara keseluruhan. Pada test-paech kita menggunakan image yang berisikan node-js yang merupakan stack minimal dalam melakukan testing. Kemudian diberikan konfigurasi, dan script merupakan instruksi secara sekuensial bagaimana cara kita melakukan testing. Dengan menerapkan test-peach maka frontend akan diuji setiap kali push sehingga kualitas kode dari frontend dapat terjaga seperti juga dengan backend.

*test-mario & test-peach dilakukan secara paralel karena tidak terdapat dependensi dan akan mempercepat proses test.

release


Pada stage release, kode frontend dan backend yang telah lulus test akan dimasukkan ke dalam kontener docker menggunakan image yang berisikan docker tools. Kemudian kita menggunakan fitur dari GitLab yang lain yaitu registry. Untuk dapat membagikan image docker kita melalui internet, kita perlu menaruh docker image kita ke dalam sebuah docker image repository. Salah satu docker image repository adalah menggunakan fitur GitLab yang mereka namakan dengan Registry. Jadi semua docker image dari frontend & backend kita akan di push ke GitLab Registry. Oiya, proses release hanya dilakukan di branch master & sit_uat ya!

deploy


Nah, untuk deployment, kita menggunakan orchestrator berupa Kubernetes yang di-host pada server Azure. Walaupun bisa dibilang cukup rumit di sisi setupnya, namun pada implementasi di .gitlab-ci.yml cukuplah mudah. Kita menggunakan docker image milik orang bernama roffe yang berisikan linux minimal dengan kubectl. Kubectl lah yang kita butuhkan untuk mengkonfigurasikan Kubernetes kita yang berada di Azure service. Secret key diambil melalui environment variables GitLab untuk dapat mengakses Azure service, kemudian dengan kubectl memerintahkan Kubernetes untuk mengambil docker image frontend & backend kita yang baru saja di push ke Registry untuk dilakukan deployment.

Environment

Setelah mengetahui tentang bagaimana proses CI/CD kami, kali ini saya akan berbagi tentang bagaimana kita melakukan setup terhadap environment kami. Karena setupnya cukup panjang dan rumit, pada kali ini saya hanya akan menjelaskan secara umum saja.

Kubernetes

Kubernetes merupakan orchestrator yang berperan untuk melakukan deployment docker image kita ke dalam server.

Konfigurasi pada kubernetes dituliskan dalam bentuk YML dan dikirimkan kepada Kubernetes yang terletak pada server azure menggunakan kubectl. Secara umum, untuk deployment 1 servis utama, membutuhkan 3 konfigurasi.

Deployment

Mirip dengan konfigurasi pada gitlab-ci, deployment berguna untuk memberikan konfigurasi dan spesifikasi serta cara untuk mendeploy dengan benar produk kita. Kita harus menentukan darimana docker image harus diunduh, kemudian spesifikasi maksimal dan minimal mesin, command yang harus dijalankan.

contoh:

mario-master-deployment.yml


Service

Service berguna untuk menjadikan deployment kita yang telah di-deploy untuk dijadikan sebuah service. Parameter konfigurasi yang harus diberikan adalah, menentukan port yang harus di-forward dan port mana yang harus dibuka pada publik.

contoh:

mario-master-service.yml


Ingress

Kita menggunakan Ingress yang berbasis Nginx untuk melakukan host backend dan menyambungkannya dengan domain yang kita miliki.

contoh:

mario-master-ingress.yml


Ada banyak sekali konfigurasi yang harus kami berikan dalam menyiapkan deployment secara keseluruhan yang dapat dilihat di repository kami.

Secara umum, skema dari deployment kita dapat digambarkan sebagai:


COBA_COBA

COBA_COBA merupakan environment yang kami gunakan untuk melakukan testing terhadap implementasi yang baru dibuat terhadap server. Deployment pada COBA_COBA berasal dari kode yang di-push ke dalam branch story yang telah berhasil melalui CI/CD sampai akhir.

SIT_UAT

Setiap sebuah story telah selesai diimplementasikan, maka story tersebut akan di-merge ke dalam branch sit_uat dan akan dilakukan CD ke environment SIT_UAT. Pada setiap akhir sprint, produk sprint akan dilakukan demonstrasi dan review pada sprint review kepada product owner untuk diberikan acceptance atau rejection. Ketika fitur di-reject oleh product owner, maka fitur harus di-rollback dari SIT_UAT dan SIT_UAT harus bersih dari fitur tersebut.

PRODUCTION

Kode pada branch sit_uat yang telah diterima akan dipindahkan ke dalam branch master. Kode yang telah diterima oleh branch master akan dideploy secara otomatis ke dalam environment PRODUCTION dimana merupakan environment yang dirilis kepada publik dan siap untuk digunakan.

Nah, sekarang sudah mengerti kan bagaimana secara umum kami merancang environment serta CI/CD pada proyek kali ini? Sampai jumpa lagi ya guys!

0 komentar:

Post a Comment