implementasi monorepo pada gitlab

0
596

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 paramater include 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
  • .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)
    • 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 🙂