jenkins任务并行+串行,都执行通过后执行最后job

任务背景:想要实现如此流程:开发提交代码后触发CI,开发的CIjob会触发自动化测试环境升级job并传入参数,当前有两套自动化测试环境(all-in-one和splite),想要实现两套自动化环境升级完毕后跑对应的自动化脚本,当两套环境的自动化脚本都跑过时进行手工测试环境升级操作。

实现方案:

流程图

介绍下每个job的功能:

  • 首先需要一个pipline流水线总体调控,接受并传递CIjob中的参数,该job取名enter job,
  • jobA和jobB是两套不同的自动化测试环境升级job
  • jobC和jobD是两套自动化测试环境的测试脚本执行job
  • jobE是手工测试环境升级job

jobA实现方式

这里是定义上游job传入并传入下游的使用参数


image.png

下面是pipline的脚本,stages中使用了parallel,parallel中的stage可以并行执行,jobE的执行放在post的success中是为了只有在jobA和jobB以及后续job都执行成功后才执行最终的jobE,若有一个不成功就不执行jobE

pipeline {
    agent any
    environment {  
        CC = 'clang'
    }
    stages {
        stage('并行执行orch_update_deploysmoke和orch_update_splitsmoke'){
            parallel {
                stage('run orch_update_deploysmoke') {
                    steps {
                        script { 
                            println "Here we kickoff run B1_orch_update_deploysmoke" 
                            println "${params.RF_version}"
                            jobB = build job: 'B1_orch_update_deploysmoke', parameters: [
                               // [$class: 'BooleanParameterValue', name: 'runsmoketest',value: "${params.runsmoketest}"],
                                [$class: 'StringParameterValue', name: 'Run_Smoke',value: "${params.Run_Smoke}"],
                                [$class: 'StringParameterValue', name: 'RF_version',value: "${params.RF_version}"],
                                [$class: 'StringParameterValue', name: 'EntireMessage',value: "${params.EntireMessage}"],
                                [$class: 'StringParameterValue', name: 'frontend_Author',value: "${params.frontend_Author}"],
                                [$class: 'StringParameterValue', name: 'frontend_releaseInfo',value: "${params.frontend_releaseInfo}"],
                                [$class: 'StringParameterValue', name: 'Backend_Author',value: "${params.Backend_Author}"],
                                [$class: 'StringParameterValue', name: 'backend_releaseinfo',value: "${params.backend_releaseinfo}"],
                                [$class: 'StringParameterValue', name: 'Issues',value: "${params.Issues}"]
                            ]
                            println jobB.getResult() 
                        } 
                    }
                }
                stage('run orch_update_splitsmoke') {
                    steps {
                        script { 
                            println "Here we kickoff run B2_orch_update_splitsmoke" 
                            jobB = build job: 'B2_orch_update_splitsmoke', parameters: [
                               // [$class: 'BooleanParameterValue', name: 'runsmoketest',value: "${params.runsmoketest}"],
                                [$class: 'StringParameterValue', name: 'Run_Smoke',value: "${params.Run_Smoke}"],
                                [$class: 'StringParameterValue', name: 'RF_version',value: "${params.RF_version}"],
                                [$class: 'StringParameterValue', name: 'EntireMessage',value: "${params.EntireMessage}"],
                                [$class: 'StringParameterValue', name: 'frontend_Author',value: "${params.frontend_Author}"],
                                [$class: 'StringParameterValue', name: 'frontend_releaseInfo',value: "${params.frontend_releaseInfo}"],
                                [$class: 'StringParameterValue', name: 'Backend_Author',value: "${params.Backend_Author}"],
                                [$class: 'StringParameterValue', name: 'backend_releaseinfo',value: "${params.backend_releaseinfo}"],
                                [$class: 'StringParameterValue', name: 'Issues',value: "${params.Issues}"]
                                ]
                            println jobB.getResult() 
                        } 
                    }
                }
            }
        }
    }
    post{
        success('run D_orch_update_test') {
            script { 
                jobF = build job: 'D_orch_update_test', parameters: [
                               // [$class: 'BooleanParameterValue', name: 'runsmoketest',value: "${params.runsmoketest}"],
                                [$class: 'StringParameterValue', name: 'Run_Smoke',value: "${params.Run_Smoke}"],
                                [$class: 'StringParameterValue', name: 'RF_version',value: "${params.RF_version}"],
                                [$class: 'StringParameterValue', name: 'EntireMessage',value: "${params.EntireMessage}"],
                                [$class: 'StringParameterValue', name: 'frontend_Author',value: "${params.frontend_Author}"],
                                [$class: 'StringParameterValue', name: 'frontend_releaseInfo',value: "${params.frontend_releaseInfo}"],
                                [$class: 'StringParameterValue', name: 'Backend_Author',value: "${params.Backend_Author}"],
                                [$class: 'StringParameterValue', name: 'backend_releaseinfo',value: "${params.backend_releaseinfo}"],
                                [$class: 'StringParameterValue', name: 'Issues',value: "${params.Issues}"]
                       ]
                println jobF.getResult()
            }
        }
    }
}

jobA/jobB实现方式

在jobA/jobB中也先定义上游传入和用到的参数


image.png

在构建步骤中先执行升级操作


image.png

在这一步选择有条件的执行,只有当上游传入的Run_Smoke参数为yes时执行下面的测试jobC/jobD
image.png

这里是关键,需要勾选上Block until the triggered projects finish their builds,这样就可以在jobC/D测试没通过报错时能够让触发他们的jobA/B也报错,从而enter_job就不执行JobE


image.png

jobC/jobD实现方式

在jobC/jobD中也先定义上游传入和用到的参数和上面一样,构建中放入执行测试任务的命令


image.png

JobE实现方式

同上,jobE只需要配置升级手工测试环境的命令即可

实现效果

成功时,这里run orch_update_deploysmoke是执行jobA和jobC的总时间


image.png

这里JobD测试失败,部署手工测试环境的jobE就不执行了


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容