Dalam penggunaan monorepo di GitLab, kita biasanya memecah konfigurasi .gitlab-ci.yml
ke beberapa subfolder. Setiap subproject memiliki file .gitlab-ci.yml
tersendiri dan dipanggil (trigger) dari file utama di root repository.
Namun, sering kali muncul error seperti:
Failed - (downstream pipeline can not be created, The resulting pipeline would have been empty. Review the rules configuration for the relevant jobs.)
Artikel ini akan membahas penyebab dan cara mengatasi error tersebut secara step by step.
Masalah Umum
Ketika root pipeline men-trigger pipeline dari folder (downstream), tetapi file .gitlab-ci.yml
di dalamnya tidak memiliki job aktif (karena rules
tidak terpenuhi), maka GitLab menolak membuat pipeline tersebut karena dianggap kosong.
Contoh konfigurasi trigger di file root:
trigger-project1:
stage: triggers
trigger:
include: project1/.gitlab-ci.yml
rules:
- changes:
- project1/**/*
Masalah:
Jika isi file project1/.gitlab-ci.yml
seperti ini:
rules:
- changes:
- project1/**
Maka saat pipeline dipicu dari root (tanpa perubahan file), job akan skip, dan pipeline dianggap kosong → error!
Solusi Step by Step
1. Gunakan rules
yang mendukung trigger pipeline
Ubah aturan rules
di job dalam project1/.gitlab-ci.yml
seperti ini:
rules:
- if: '$CI_PIPELINE_SOURCE == "pipeline"'
- changes:
- project1/**
Dengan cara ini, pipeline tetap berjalan meskipun tidak ada perubahan file, selama pipeline dipicu oleh parent/root pipeline.
2. Pastikan urutan rules
benar
GitLab membaca rules
dari atas ke bawah. Jika rule pertama cocok, rule berikutnya tidak dicek.
Jadi pastikan rule trigger pipeline diletakkan di atas:
rules:
- if: '$CI_PIPELINE_SOURCE == "pipeline"' # ⬅️ Ini duluan
- changes:
- project1/**
Perbedaan **
dan /**/*
Pola | Mencakup file di folder root? | Subfolder? | Aman digunakan? |
---|---|---|---|
project1/** | ✅ Ya | ✅ Ya | ✅ Direkomendasikan |
project1/**/* | ✅ Ya | ✅ Ya | ✅ Tapi bisa lebih sempit |
Gunakan
project1/**
untuk mencakup perubahan di seluruh folder.
Tips Tambahan
Selalu lint .gitlab-ci.yml
kamu di GitLab > CI/CD > Editor > Lint
Simpan SSH key atau token di CI/CD > Variables
Gunakan resource_group
jika kamu ingin memastikan deploy tidak berjalan bersamaan
deploy:
resource_group: deploy-lock
Kesimpulan
Masalah "Downstream pipeline cannot be created" umumnya disebabkan oleh rules
yang tidak mengizinkan job dijalankan saat pipeline dipicu oleh parent.
Pastikan:
Tambahkan if: $CI_PIPELINE_SOURCE == "pipeline"
Letakkan if
di atas changes
Gunakan **
atau /**/*
sesuai kebutuhan folder
Dengan konfigurasi yang benar, monorepo dan multi-pipeline kamu akan berjalan stabil, fleksibel, dan aman.