halo sobat sekolahlinux kali ini saya akan sedikit membahas bagaimana cara implementasi monorepo menggunakan gitlab-ci, sebelum membahas bagaimana caranya saya akan sedikit menjelaskan apa itu monorepo dan apa itu protected environment
- monorepo: seperti namanya mono dan repo adalah yang berarti adalah repo yang hanya satu, atau semua code dari berbagai macam service terdapat didalam satu repository git
- protected environment: adalah sebuah feature yang terdapat pada gitlab yang bertujuan untuk memprotect job tertentu yang kita set environment didalamnya sehingga job tersebut hanya bisa di triger / dijalankan oleh user yang sudah di tentukan
nah kenapa ke 2 feature tersebut perlu dan harus ada dalam sebuah monorepo, karena nantinya di monorepo ini akan terdapat banyak service yang mana berarti akan banyak divisi atau team juga banyak role, yuk mari kita sama2 langsung saja masuk ke praktek, oh iya btw dibawah ini adalah layout contoh monorepo yang saya buat
. ├── .git ├── .gitlab-ci.yml ├── README.md ├── service-1 │ ├── .gitlab-ci.yml │ └── service1.txt ├── service-2 │ ├── .gitlab-ci.yml │ └── service2.txt └── service-3 ├── .gitlab-ci.yml └── service3.txt
jika kita lihat pada layout diatas terdapat 3 folder service dan di setiap folder service terdapat file .gitlab-ci.yml
dan juga di root folder juga terdapat file .gitlab-ci.yml
jadi total ada 4 file .gitlab-ci.yml
didalam layout monorepo diatas, yuk mari kita lihat isi masing-masing file .gitlab-ci.yml
yang terdapat didalam layout diatas
.gitlab-ci.yml
yang berada di root folder monorepo
image: busybox stages: - step-1 - step-2 - step-3 include: - '/service-1/.gitlab-ci.yml' - '/service-2/.gitlab-ci.yml' - '/service-3/.gitlab-ci.yml'
pada file .gitlab-ci.yml
kita bisa melihat bahwa:
-
- image: image docker yang digunakan adalah image
busybox
- stages: stages yang di declare untuk digunakan untuk digunakan pada jobs jumlah nya ada 3, setiap stage bisa digunakan lebih dari 1 jobs, dan stages yang digunakan yaitu:
- step-1
- step-2
- step-3
- include: include adalah sebuah feature pada gitlab-ci yang berfungsi untuk menyatukan file-file pipeline code kecil yang sebelumnya dipecah dari pipeline code besar yang ada pada file
.gitlab-ci.yml
, lalu file tersebut dapat disatukan dengan paramaterinclude
ini, disini saya memecahnya menjadi 4, yaitu.gitlab-ci.yml
yang berada di root folder monorepo.gitlab-ci.yml
yang berada di folder service-1.gitlab-ci.yml
yang berada di folder service-2.gitlab-ci.yml
yang berada di folder service-3
- image: image docker yang digunakan adalah image
.gitlab-ci.yml
yang berada di root folder service-1
service-1-step1: stage: step-1 script: - echo "step-1" only: changes: - service-1/**/* service-1-step2: stage: step-2 script: - echo "step-2" only: changes: - service-1/**/* service-1-step3: stage: step-3 script: - echo "step-3" environment: name: service-1 when: manual only: changes: - service-1/**/*
.gitlab-ci.yml
yang berada di root folder service-2
service-2-step1: stage: step-1 script: - echo "step-1" only: changes: - service-2/**/* service-2-step2: stage: step-2 script: - echo "step-2" only: changes: - service-2/**/* service-2-step3: stage: step-3 script: - echo "step-3" environment: name: service-2 when: manual only: changes: - service-2/**/*
.gitlab-ci.yml
yang berada di root folder service-3
service-3-step1: stage: step-1 script: - echo "step-1" only: changes: - service-3/**/* service-3-step2: stage: step-2 script: - echo "step-2" only: changes: - service-3/**/* service-3-step3: stage: step-3 script: - echo "step-3" environment: name: service-3 when: manual only: changes: - service-3/**/*
pada file .gitlab-ci.yml
yang ada didalam folder service-1
, service-2
dan service-3
yang terdapat paramater-paramater dibawah ini
-
- service-1-step1, service-1-step2, service-1-step3, service-2-step1, service-2-step2, service-2-step3, service-3-step1, service-3-step2, service-3-step3: paramater ini adalah penamaan untuk jobs, dan penamaan ini bebas dan tidak perlu di register atau di declare seperti halnya stage
- stage: stage disini digunakan untuk mendefine suatu jobs, sebuah stage dapat digunakan di banyak jobs, stage harus di register, kamu bisa melihat cara register stage di
.gitlab-ci.yml
yang berada di root folder monorepo - script: paramater ini digunakan untuk menajalankan shell script pada jobs
- when: paramater ini digunakan untuk membuat sebuah jobs berjalan pada kondisi tertentu, pada tutorial ini saya set when untuk membuat sebuah jobs dapat berjalan dengan cara di triger manual
- only: paramater ini digunakan untuk menyatakan bahwa job dapat berjalan hanya ketika ada perubahan pada branch atau tags tertentu saja, didalam only terdapat banyak sub parameter kamu bisa baca disini (https://docs.gitlab.com/ee/ci/yaml/#onlyexcept-advanced)
- changes: paramater ini adalah sub paramater dari
only
yang mana jobs hanya akan run ketika ada pada perubahan pada spesific folder ataupun file tertentu saja, paramater ini lah yang nanti dapat kita manfaatkan untuk keperluan monorepo, kamu bisa baca detailnya disini (https://docs.gitlab.com/ee/ci/yaml/#onlychangesexceptchanges)
- changes: paramater ini adalah sub paramater dari
- environment: paramater ini digunakan untuk keperluan register environment yang nanti value nya digunakan sebagai job protection triger, sehingga ketika suatu jobs di set triger secara manual, yang dapat menjalankan jobs tersebut hanya user atau role tertentu saja, diatas saya meregister 3 environment yaitu service-1, service-2 dan service-3, detailnya soal environment kamu bisa baca disini (https://docs.gitlab.com/ee/ci/yaml/#environment) dan juga disini (https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
selanjutnya kita akan coba melakukan protected environment yang bertujuan agar hanya user tertentu saja yang dapat mentriger jobs yang sudah di tentukan
pertama buka project gitlab repo kamu lalu pergi ke setting -> ci/cd -> protected environment maka nanti tampilannya akan seperti gambar dibawah ini
selanjutnya kalian bisa pilih environtment yang sudah di register pada file .gitlab-ci.yml sebelumnya, lalu pilih role atau user mana yang bisa menjalankan environment tersebut, contoh seperti gambar dibawah, jika klik button hijau protect
jika sudah maka tampilannya akan seperti dibawah ini
jika sudah ulangi cara diatas untuk environment service-1, service-2 dan service-3 sehingga nantinya akan seperti gambar dibawah ini
jika sudah selanjutnya adalah kamu harus membuka protected branch untuk user yang kamu assign pada protected environment diatas agar bisa melakukan triger pada jobs manual yang terprotect oleh environment
jika sudah maka kalian coba jalankan pipelinenya, maka kurang lebih nanti pipeline flow akan seperti dibawah ini
sekian tutorial kali ini semoga bermanfaat, jika kalian merasa artikel ini menbantu kalian, jangan lupa share di linkedin ataupun sosmed kalian haha… terimakasih 🙂