接力上一篇的 needs
,隨著專案的規模變大,有時候為了好除錯或降低複雜度,會採用 Parent - Child 形式的 GitLab Pipeline,但自然就會衍生一些問題,變數及Artifact的傳遞等。
那個,應該怎麼在 Child Pipeline 中,拿到 Parent Pipeline 特定 Job 的 Artifact 呢? 在不確定什麼版本的 GitLab 中,正式開始支援 needs:pipeline:job
的結構,可以直接在 Child Pipeline 的 Job 中直接宣告,所需要對應的 Pipeline 的那個 Job 的 Artifact。
首先先建立子 Pipeline 的 CI/CD YAML,名稱為 child.yml
:
default:
image: ubuntu:24.04
test-app:
script:
- cat artifact.txt
- echo "CI_PIPELINE_ID $CI_PIPELINE_ID"
- echo "PARENT_PIPELINE_ID $PARENT_PIPELINE_ID"
needs:
- pipeline: $PARENT_PIPELINE_ID
job: build-app
這邊的使用方式很直覺,透過 needs
中設定參數 pipeline
在正式執行時,帶入 Parent Pipeline ID,並設定所需要的 Job 即可。
而 .gitlab-ci.yml
中,則可以如下範例中實作,在 build-app
的工作中,建立需要的 artifact,在 trigger-child-pipeline
工作中,則負責觸發 child.yml
及帶入參數給 Child Pipeline,供 Child Pipeline 中知道,可以跟什麼 Pipeline 取得 Artifact:
image: ubuntu:24.04
stages:
- build
- test
build-app:
stage: build
script:
- echo "sample artifact" > artifact.txt
- echo "CI_PIPELINE_ID $CI_PIPELINE_ID"
- echo "PARENT_PIPELINE_ID $PARENT_PIPELINE_ID"
artifacts:
paths: [artifact.txt]
trigger-child-pipeline:
stage: test
trigger:
include: child.yml
strategy: mirror
variables:
PARENT_PIPELINE_ID: $CI_PIPELINE_ID
在使用 needs:pipeline:job
時,自然有一些限制,首先這邊使用的 Pipeline ID,不能是目前 Pipeline 的 ID,這限制是可以想像的,因為在目前的 Pipeline,其時就只需要直接使用 needs 即可,不用多這麼一層。
另外,被 Trigger 的 Pipeline 不能是 Project (Multi-project pipelines),如果真的要使用,則可以參考另外一個參數 needs:project
不過它是付費版本的。
最後是,所 needs 的 job,其完成狀態必須是 success
的狀態。(這個限制目前有可能解除,但還在討論中。)
透過 needs:pipeline:job
的語法,Child Pipeline 可以直接宣告取得 Parent Pipeline 中特定 Job 其輸出的 Artifact 。雖然有一些使用上的限制,但比較大型的專案中,這此功能可以降低維護的複雜度,讓跨 Pipeline 的 Artifact 傳遞更直覺。我是墨嗓(陳佑竹),期待這次的內容能帶給你實用的啟發與幫助。