文章目录
- 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