文章目錄
- 1. 說明
- 2. 官方樣例
- 2.1 在作業中生成配置文件,保存為產物
- 2.2 將觸發器作業配置為在生成配置文件的作業之后運行。
- 3. 實戰應用
- 3.1 背景介紹
- 3.2 項目介紹
- 3.3 公共項目配置
- 3.4 測試項目配置
- 3.5 測試
- 4. 總結
1. 說明
顧名思義,動態流水線就是一種動態生成的流水線,主要在于其具有強大的靈活性,可以在特殊的場景下基于我們的一個預期生成我們想要的流水線,從而來執行某個作業任務。
既然是動態生成的流水線,那肯定就需要額外的觸發操作來運行流水線,這里我們可以通過trigger:include: artifact
的方式,具體就是使用trigger
關鍵字將 include: artifact
設置為生成的產物并通過 include: job
設置為創建產物的作業。
2. 官方樣例
2.1 在作業中生成配置文件,保存為產物
generate-config:stage: buildscript: generate-ci-config > generated-config.ymlartifacts:paths:- generated-config.yml
2.2 將觸發器作業配置為在生成配置文件的作業之后運行。
child-pipeline:stage: testtrigger:include:- artifact: generated-config.ymljob: generate-config
在此示例中,GitLab 檢索 generated-config.yml
并使用該文件中的 CI/CD 配置觸發子流水線。
產物路徑由GitLab 而非 runner 解析,因此該路徑必須與運行GitLab 的操作系統的語法相匹配。如果GitLab 在 Linux 上運行但使用 Windows runner 進行測試,則觸發作業的路徑分隔符為 /
。使用 Windows runner 的作業的其他 CI/CD 配置,如腳本,使用 \
。
3. 實戰應用
3.1 背景介紹
- 我們希望如果研發在提交代碼的時候,如果commit message中有x86_64關鍵字,則創建一個Release_x86_64的job,如果commit message中有aarch64關鍵字,則創建一個Release_aarch64的job。
- 該案例使用了include的嵌套方式,也是另類的一種高級用法。
3.2 項目介紹
- ci-test 是公共項目
- variables.yml 里面存放了群組級下的所有的常用的變量
- template.yml 里面是公共的job,里面也通過include 嵌套了variables.yml
- ci-test-1 是測試項目
3.3 公共項目配置
gitlab-ci/vars/variables.yml
variables:DOCKER_VERSION: "Docker version 20.10.17, build 100c701"BUILD_TYPE: ReleaseREGION: BJTAG: dc
gitlab-ci/common_job/template.yml
##set default retry
default:retry: max: 1when: runner_system_failure##set image & gitlab-runner
.image@image:image:name: alpine:latest.tags@tag:tags:- $TAG##include variables
include:- project: "ops/ci-test"ref: devfile: "gitlab-ci/vars/variables.yml"###set job
.build@build:script:- envextends: - .image@image- .tags@tagrules:- when: always
3.4 測試項目配置
ci文件
stages:- test- buildinclude:- project: "ops/ci-test"ref: "dev"file:- "gitlab-ci/vars/variables.yml"generate-config:stage: testimage: alpine:latestscript: - env- chmod +x generate.sh- bash -x generate.sh- cat generated-config.ymlartifacts:paths:- generated-config.ymlbefore_script:- apk update- apk add bashchild-pipeline:stage: buildtrigger:include:- artifact: generated-config.ymljob: generate-config
generate.sh
#!/bin/bash
echo $CI_COMMIT_MESSAGEif [[ $CI_COMMIT_MESSAGE == *x86_64* ]];then
cat <<EOF > generated-config.yml
include:- project: "ops/ci-test"ref: "dev"file:- "gitlab-ci/common_job/template.yml"
stages:- generate_jobs
Release_x86_64:stage: generate_jobsimage: alpine:latestextends:- .build@build
variables:DOCKER_VERSION: $DOCKER_VERSIONBUILD_TYPE: $BUILD_TYPEPLATFORM: x86_64REGION: $REGION
EOF
elif [[ $CI_COMMIT_MESSAGE == *aarch64* ]]; then
cat <<EOF > generated-config.yml
include:- project: "ops/ci-test"ref: "dev"file:- "gitlab-ci/common_job/template.yml"
stages:- generate_jobs
Release_aarch64:stage: generate_jobsimage: alpine:latestextends:- .build@build
variables:DOCKER_VERSION: $DOCKER_VERSIONBUILD_TYPE: $BUILD_TYPEPLATFORM: aarch64REGION: $REGION
EOF
fi
3.5 測試
本地項目提交 - 提交commit包含x86_64
本地項目提交 - 提交commit包含aarch64
4. 總結
其實這個案例相對比較簡單,主要想表達的一個思想是,在某個業務場景下,我們可以通過通過腳本動態的生成gitlab的流水線,從而達到我們想要的效果。
此外,這里也給大家推薦下gitlab官方項目的測試用例。
- 使用 Jsonnet 的動態子流水線
- Dynamic child pipeline creation via artifact includes