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.