Membedah anatomi file .gitlab-ci.yml dari keyword global hingga definisi stages, lalu menulis job pertama dengan inline dan multi-line script, menangani error memakai allow_failure, dan merakit pipeline hello-world lengkap dengan stage build dan test.

Di episode 1 kalian sudah memahami arsitektur GitLab CI/CD: GitLab Server memicu, Runner mengeksekusi, dan .gitlab-ci.yml mendeskripsikan semuanya. Sekarang saatnya menulis kode pipeline pertama. Episode ini membahas anatomi file .gitlab-ci.yml dari nol — mulai dari keyword global dan definisi stages, sampai job pertama yang menjalankan build dan test, lengkap dengan cara menangani error.
Menguasai sintaks dasar ini adalah fondasi mutlak: seluruh episode berikutnya — rules, variables, Docker, hingga deployment — dibangun di atas struktur yang akan kalian pelajari sekarang.
.gitlab-ci.yml.gitlab-ci.yml adalah file YAML yang diletakkan di root repository. Nama file ini sakral — GitLab secara otomatis mendeteksinya setiap kali ada push, merge request, atau tag. Jika file ini ada, GitLab membuat pipeline dan menampilkannya di tab CI/CD project.
Sebelum menulis job, ada beberapa keyword global yang mengatur perilaku pipeline secara keseluruhan:
default — pengaturan yang berlaku untuk semua job, seperti image, before_script, atau timeout.stages — mendefinisikan urutan fase eksekusi pipeline.variables — variabel global (akan dibahas mendalam di episode 5).workflow — kontrol kapan pipeline dibuat (episode 4).Jika kalian tidak mendefinisikan stages sama sekali, GitLab memakai default bawaan: .pre, build, test, deploy, .post.
| Stage | Fungsi |
|---|---|
.pre | Berjalan paling awal, sebelum semua stage |
build | Kompilasi dan pembentukan artefak |
test | Unit test, lint, integration test |
deploy | Deployment ke environment |
.post | Berjalan paling akhir, untuk cleanup atau notifikasi |
Stage dengan awalan titik (.pre dan .post) adalah stage khusus: kalian tidak bisa menyebutnya di daftar stages, tapi seluruh job di dalamnya tetap berjalan di urutan yang sesuai. Untuk pipeline yang lebih eksplisit, definisikan stages sendiri:
stages:
- build
- test
- deployUrutan di daftar ini adalah urutan eksekusi. Job yang memakai stage yang tidak terdaftar akan ditolak GitLab saat membuat pipeline.
Sebuah job adalah blok YAML yang diawali nama job dan berisi minimal stage dan script. Nama job bebas (huruf, angka, underscore), selama unik di dalam file.
unit_test:
stage: test
script:
- npm testunit_test) — identifier job di UI pipeline.stage — menentukan di fase mana job dijalankan.script — perintah yang dieksekusi runner.Jika job hanya menjalankan satu perintah, tulis langsung sebagai nilai script:
unit_test:
stage: test
script: npm testUntuk beberapa perintah berurutan, gunakan daftar YAML di bawah script:
unit_test:
stage: test
script:
- echo "Menjalankan unit test"
- npm ci
- npm run lint
- npm testTiap baris dieksekusi sebagai perintah terpisah dalam satu sesi shell yang sama — variabel yang di-set di baris pertama tetap bisa dipakai di baris berikutnya. Jika salah satu perintah mengembalikan exit code bukan nol, job langsung gagal dan perintah berikutnya tidak dieksekusi.
Terkadang ada job yang boleh gagal tanpa menghentikan pipeline — misalnya linting non-blocking atau test yang sedang flaky. Gunakan allow_failure: true:
lint:
stage: test
script:
- npm run lint
allow_failure: trueJika job lint gagal, pipeline tetap berlanjut ke stage berikutnya. Di UI, job yang gagal dengan allow_failure: true tetap berwarna oranye (warning) — jadi masalahnya terlihat, tapi tidak memblokir rilis.
Warning
allow_failure: true adalah pengecualian, bukan kebiasaan. Mengaktifkannya di hampir semua job membuat pipeline kalian selalu "hijau" padahal kode bermasalah — dan itu menghancurkan nilai utama CI/CD: feedback yang jujur. Gunakan hanya untuk job yang memang non-kritis atau sedang stabilisasi.
Sekarang mari rakit semuanya menjadi pipeline nyata untuk project Node.js:
stages:
- build
- test
before_script:
- npm ci
build_app:
stage: build
script:
- npm run build
unit_test:
stage: test
script:
- npm test
e2e_test:
stage: test
script:
- npx playwright testAda beberapa hal penting dari contoh di atas:
before_script berjalan sebelum script di setiap job — di sini dipakai untuk menginstall dependensi sekali pakai untuk semua job.unit_test dan e2e_test berada di stage test yang sama, sehingga keduanya berjalan paralel setelah stage build selesai.build_app selesai dulu → baru unit_test dan e2e_test dimulai.Setelah file ini di-push, kalian bisa memantau pipeline langsung dari terminal dengan glab ci status:
$ glab ci status
build_app build running
unit_test test pending
e2e_test test pending.gitlab-ci.yml harus berada di root; jika ditaruh di subdirektori, GitLab tidak akan mendeteksinya dan pipeline tidak pernah dibuat.stage: deploy padahal stages tidak menyertakannya akan ditolak GitLab dengan error chosen stage does not exist.script, stage, dan allow_failure berada di level indentasi yang sama (sejajar).Pada episode 2 ini kalian telah menulis pipeline pertama yang benar-benar berjalan:
.gitlab-ci.yml: keyword global default, stages, variables, dan workflow..pre, build, test, deploy, .post, dan cara mendefinisikan urutan stages sendiri.stage, dan script, plus perbedaan inline command dan multi-line command.allow_failure: true sebagai cara menangani job non-kritis tanpa menghentikan pipeline.Sekarang pipeline kalian hidup. Di episode 3 kita akan membedah siapa yang menjalankan pipeline itu — GitLab Runner. Kita akan membahas tipe-tipe runner (shared, group, specific), jenis executor (shell, docker, kubernetes), cara registrasi runner dengan token, dan cara mengarahkan job ke runner tertentu memakai tags. Sampai jumpa di episode 3!