当多个job之间存在依赖情况,如何通过一次触发构建来拉起后续整条链路的构建任务?通过maven依赖来触发构建又不够灵活
要点分析
- 案例目标
- 依赖分多层,每层构建可以是并行执行
- 当前层若存在job失败则不拉起后续job
- job执行需要提供参数,前面的job需要给后续job传递参数,如目标代码的tag等
- 父job能否获取到子job的信息,如子job的参数
方案
1. 使用插件
Freestyle project -> Post-build Action插件:
- Join plugin
- Parameterized Trigger plugin
该插件可以传递参数给子job
尝试插件不能满足上述要点要求,最终没有使用插件实现
2. pipeline实现job编排
这是本次实现本次案例使用的方案,具体实现见下文
pipeline实现job编排
尝试实现上述ple1->ple2的过程
相关pipeline功能语法
- build job
build job: 'job-1-1', parameters: [string(name: 'hzw_version', value: env.hzw_version)]
build job: 'ple2', parameters: [string(name: 'hzw_version', value: env.hzw_version)], propagate: false, wait: false
使用parameters调用子job时传递的参数,可以传递多个,前提是子job是参数化构建并且配置了同名参数项,这样子job才能获取这里传递的参数
- UI界面通过This project is parameterized设置参数
- pipeline脚本中通过parameters设置参数
propagate,是否传播错误,默认为true(子job失败会传播到当前job)
wait,是否等待子job执行完成,默认为true
- parallel并行
options {
parallelsAlwaysFailFast() // 字面意思^o^
}
...
failFast true // 当前parallel快速失败
parallel {
stage('并行1') {
// do something
}
stage('并行2') {
// do something
}
}
实现
ple1
入口输入参数,此参数可通过githook等方式获取,这里不展开了,暂手动输入算了
pipeline{
agent any
//parameters {
// // 等价于UI界面配置:This project is parameterized,但每次执行会再次初始化job中的param
// string(name: 'hzw_version', defaultValue: 'hhhzzzwww-ple1_v0.1', trim: true, description: '描述一下这个参数')
//}
stages{
stage('build-childs-1'){
failFast true
parallel {
stage("child 1"){
steps{
build job: 'job-1-1', parameters: [string(name: 'hzw_version', value: env.hzw_version)]
}
}
stage("child 2"){
steps{
build job: 'job-1-2', parameters: [string(name: 'hzw_version', value: env.hzw_version)]
}
}
}
}
stage('build-childs-2'){
steps{
build job: 'job-1-3', parameters: [string(name: 'hzw_version', value: env.hzw_version)]
}
}
//====上文job完成,则执行下一级====
stage("next_level"){
steps{
build job: 'ple2', parameters: [string(name: 'hzw_version', value: env.hzw_version)], propagate: false, wait: false
}
}
}
post {
failure {
script {
echo "${currentBuild.projectName}构建失败!!"
}
}
success {
script {
echo "${currentBuild.projectName}构建成功!!"
}
}
}
}
job-1-1
- 设置参数,以接收父job传递的参数
- pipeline脚本
pipeline{
agent any
environment {
// 自定义配置
hzw_job1_1='job1-1'
}
stages{
stage('testsomething'){
steps{
script{
echo "===================="
sh("env|grep hzw")
echo "===================="
// error "这里指定一个错误" // 子job产生错误,测试是否传递到父job
}
}
}
}
}
ple2
- 设置参数,以接收父job传递的参数
pipeline{
agent any
options{
parallelsAlwaysFailFast()
}
stages{
stage('build-child'){
parallel {
stage("child 1"){
steps{
build job: 'job-2', parameters: [string(name: 'hzw_version', value: env.hzw_version)]
}
}
}
}
stage("next_level"){
steps{
build job: 'ple3', parameters: [string(name: 'hzw_version', value: env.hzw_version)], propagate: false, wait: false
}
}
}
}
效果展示
- 成功
- 子job失败
尾巴
本文实现了不同层级job依次执行,但前提要将所有level型job都创建出来,每个level需要在脚本中写死构建哪些job,若只想执行某些job,这样是不是不太灵活??