Halo semuanya!

Kali ini eFishery ingin share mengenai CI/CD pipeline yang digunakan untuk melakukan build dan deployment terhadap suatu aplikasi.

Buat kalian yang masih awam dengan istilah ini. Silahkan merujuk pada: https://nasabahmedia.com/ci-cd/

Hal yang unik adalah, pemasangan pipeline ini dapat dilakukan secara mudah (hanya 1 baris saja), dan tidak membutuhkan orang yang mengerti dan memiliki akses ke Infra eFishery. Developer awam pun dapat mengikuti guideline dengan mudah.

Penasaran? Yuk kita simak bersama-sama

Spesifikasi dan desain CI/CD

Berikut adalah pipeline dasar eFishery dimulai dari build hingga ke deployment

Yap, kami tahu seharusnya “Docker Scan” dilakukan bahkan sebelum build. Namun, saat ini kami hanya membaca hasilnya saja, tidak menggagalkan build ketika ada security vulnerability karena ada keterbatasan resource dan teknis. Hasil scan ini tentunya direview manual secara berkala.

Namun, apa yang sekiranya menjadi spesial disini?

  1. Platform agnostik. Umumnya, devops membuat script yang kompatibel terhadap platform (Jenkins, CircleCI, Github actions, Bitbucket, Gitlab, etc) yang sedang digunakan. Namun di eFishery, kami dapat menjamin pipeline ini dapat dijalankan dimanapun dia berada, selama dapat menjalankan perintah docker.
  2. Konfigurable, dengan memasukkan env yang telah didefinisikan, menentukan behaviour dari build yang dimaksud.
  3. Dinamis, hal ini dikarenakan, CI/CD kita berbentuk binary, dicompile dari bahasa golang. Nantinya pipeline akan dipanggil dengan cara seperti ini
curl -L ${CI_URL} -o /tmp/ci && chmod +x /tmp/ci && /tmp/ci

Dimana ${CI_URL} ada environment variable yang memuat URL dari binary CI yang telah di-compile.

Berikut adalah contoh pipeline kami di salah satu repo bitbucket

image: atlassian/default-image:2

definitions:
  services:
    docker:
      memory: 3072

pipelines:
  branches:
    master:
      - step:
          name: Build
          script:
            - curl -L ${CI_URL} -o /tmp/ci && chmod +x /tmp/ci && /tmp/ci
          services:
            - docker‌

Desain source code dari CI/CD binary

Berikut adalah program utama dari program CI/CD kita

func main() {
 fmt.Println("Main program called")

 mydir, err := os.Getwd()
 if err != nil {
  fmt.Println(err)
 }
 fmt.Printf("[DEBUG] Current Directory: %v\n", mydir)

out, err := dockerbuilder.RunCommandExec("ls -lah")
 if err != nil {
  fmt.Println(err)
 }
 fmt.Println(out)

consuladdress := "[-](http://consul-address)"
 if os.Getenv("CONSUL_ADDRESS") != "" {
  consuladdress = os.Getenv("CONSUL_ADDRESS")
 }

err = dockerbuilder.DockerBuildAndPush(consuladdress)
 if err != nil {
  fmt.Println("Error happened when building docker. Ignore this error if you already push and build docker image")
  fmt.Println(err)
 }

nomadaddress := "[-](http://nomad-address)"
 if os.Getenv("NOMAD_ADDRESS") != "" { // if being replaced someday
  nomadaddress = os.Getenv("NOMAD_ADDRESS")
 }

out, err = dockerbuilder.RunCommandExec("env")
 if err != nil {
  fmt.Println(err)
 }
 fmt.Println(out)

err = nomadcicd.SubmitJob(nomadaddress)
 if err != nil {
  fmt.Println("Error happened when submit job")
  fmt.Println(err)
  os.Exit(2)
 } else {
  scanSnyk(consuladdress)
  fmt.Println("Success!")
 }
}

Ada beberapa perintah untuk melakukan debugging seperti melihat isi direktori, dan env variable yang terpasang pada job tersebut. Kami menggunakan consul karena ada beberapa data/variabel yang tidak kami masukkan ke dalam repository seperti key ke suatu platform.

Environment Variable

Kami memiliki banyak environment variable, dikarenakan sebagian repo memiliki sifat yang berbeda dengan sebagian yang lain. Berikut beberapa env kunci yang dapat dijelaskan disini.

  • NUM_REPLICA Menyatakan berapa jumlah container yang akan dijalankan untuk app ini
  • IMAGE_URL Alamat lengkap docker registry dimana image akan disimpan
  • APP_HOST Domain dari app ini agar dapat diakses
  • TARGET_PORT Port dari app yang dijalankan
  • JOB_CPU CPU yang dibutuhkan
  • JOB_MEMORY Memory yang dibutuhkan
  • VOLUME_NAME Nama volume mount (apabila menggunakan EFS/EBS)
  • TRAEFIK_PASSWORD Disini kami menggunakan traefik sebagai loadbalancer internal, dapat memproteksi suatu endpoint dengan basic authentication apabila ini diset

Tentunya masih banyak env lain, namun yang utama adalah env yang telah dijelaskan.

Benefit

Seperti yang sudah dijelaskan diatas, selain simpel, penambahan, penghapusan dan pengubahan flow CI/CD sudah bukan menjadi masalah lagi di eFishery.

Sebagai contoh, kita ingin mengganti alamat registry, atau menggunakan orkestrator lain (misal kube, swarm atau rancher), atau menambahkan flow untuk security scanning dari vendor A,B, dst. Hal yang akan dilakukan tim infra adalah kodifikasi ulang dan melakukan kompilasi untuk flow baru yang dimaksud, dan selesai sudah tugas infra sampai disini.

Epilog

Di eFishery, developer akan dimanjakan dengan kemudahan, transparansi, fleksibilitas dan keamanan yang memadai. Dimana, aspirasi baik yang berkaitan dengan teknis riset, debugging, manajemen, dll akan diterima dengan baik oleh pihak yang berkaitan.

Tertarik untuk gabung? yuk segera cek web karir kita disini ya

  1. https://efishery.com/career/detailjobdepartment/9
  2. https://engineering.efishery.com/blog/gabung-sebagai-engineer

Sekian dari kami, terima kasih!