3. jenkins实现job依赖编排

当多个job之间存在依赖情况,如何通过一次触发构建来拉起后续整条链路的构建任务?通过maven依赖来触发构建又不够灵活

要点分析

  • 案例目标在这里插入图片描述
  • 依赖分多层,每层构建可以是并行执行
  • 当前层若存在job失败则不拉起后续job
  • job执行需要提供参数,前面的job需要给后续job传递参数,如目标代码的tag等
  • 父job能否获取到子job的信息,如子job的参数

方案

1. 使用插件
Freestyle project -> Post-build Action在这里插入图片描述插件:

尝试插件不能满足上述要点要求,最终没有使用插件实现

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

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,这样是不是不太灵活??

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzw@sirius

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值