本文共 4349 字,大约阅读时间需要 14 分钟。
这篇我来介绍下,pipeline代码中如何把两个JOB(A 和B)给串接起来。我们知道,在图形界面的jenkins中的自由风格的job的设置页眉,我们可以选择,执行完job A之后触发执行Job B, 那么pipeline又是如何实现这一过程呢。
环境准备
当前我的JobA 就是前面几篇文章一直介绍的那个ProjectA-pipeline-demo,为了演示这个过程,我基于Job A给复制了一个Job B, 名称为ProjectB-pipeline-demo.
从上面我们看到,Job B我们没有任何构建历史记录,待会我们通过JobA的pipeline代码去调用触发执行Job B, 当然,这里由于是clone JobA, 所以Job B里面执行的git代码和Job A是一样。实际项目肯定不一样的,代码分支可能一样,但是参数提供肯定不一样,不然Job B没有存在意义。
调用下一个job的pipeline代码(post块里build方法)
这里,我在前面一篇文章基础上,在post块下添加调用Job B的代码。这里提一下,post字面意思是事后的意思,也就是做完JobA里面不同stage,这个事情之后,所有的操作都写在post块里。这里,我们写在当Job A构建结果为success的时候触发构建Job B.
import hudson.model.*;pipeline{ agent any stages{ stage("Hello Pipeline") { steps { script { println "Hello Pipeline!" println env.JOB_NAME println env.BUILD_NUMBER } } } stage("Init paramters in json") { steps { script { println "read josn input file" json_file = INPUT_JSON? INPUT_JSON.trim() : "" prop = readJSON file : json_file name = prop.NAME? prop.NAME.trim() : "" println "Name:" + name age = prop.AGE? prop.AGE.trim() : "" println "Age:" + age phone = prop.PHONE_NUMBER? prop.PHONE_NUMBER.trim() : "" println "Phone:" + phone address = prop.ADDRESS? prop.ADDRESS.trim() : "" println "Address:" + address email = prop.EMAIL? prop.EMAIL.trim() : "" println "Email:" + email gender = prop.GENDER? prop.GENDER.trim() : "" println "Gender:" + gender is_marry = prop.IS_MARRY? prop.IS_MARRY : false println "is_marry:" + is_marry is_smoke = prop.SMOKE? prop.SMOKE : false println "is_smoke:" + is_smoke full_test = prop.FULL_TEST? prop.FULL_TEST : false } } } stage("call a method") { steps { script { println "send the parameter as map type" model_call = load env.WORKSPACE + "/groovy/projectA-model.groovy" model_call.getUserInfo(name:name, age:age, phone:phone, address:address, email:email, gender:gender, is_marry:is_marry) } } } stage("check serive up") { when { expression { return (is_smoke == true || full_test == true) } } steps { script { println "SMOKE TEST: check service startup" } } } stage("check UI login") { when { expression { return (is_smoke == true || full_test == true) } } steps { script { println "SMOKE TEST: check UI login success" } } } stage("Integrate-ModelA") { when { expression { return (is_smoke == false || full_test == true) } } steps { script { println "Integrate-ModelA" } } } stage("Integrate-ModelB") { when { expression { return (is_smoke == false || full_test == true) } } steps { script { println "Integrate-ModelB" } } } } post { always { script { println "Do some actins when always need." } } failure { script { println "Do some actins when build failed." } } success { script { println "Here we kickoff run job B" jobB = build job: 'ProjectB-pipeline-demo', propagate: false, wait: true, parameters: [ string(name:'INPUT_JSON', value: "${json_file}") ] println jobB.getResult() } } }}
测试一下
下面这个stage view是JobA的执行结果
我们主要下Post Actions这个stage下的日志
Integrate-ModelB[Pipeline] }[Pipeline] // script[Pipeline] }[Pipeline] // stage[Pipeline] stage[Pipeline] { (Declarative: Post Actions)[Pipeline] script[Pipeline] {[Pipeline] echoDo some actins when always need.[Pipeline] }[Pipeline] // script[Pipeline] script[Pipeline] {[Pipeline] echoHere we kickoff run job B[Pipeline] build (Building ProjectB-pipeline-demo)Scheduling project: ProjectB-pipeline-demoStarting building: ProjectB-pipeline-demo #1[Pipeline] echoABORTED[Pipeline] }[Pipeline] // script[Pipeline] }[Pipeline] // stage[Pipeline] }[Pipeline] // withEnv[Pipeline] }[Pipeline] // node[Pipeline] End of PipelineFinished: SUCCESS
你在jenkins的日志控制台点击ProjectB-pipeline-demo #1, 确实可以跳转到Job B的构建日志了, 这里由于我两个job都使用了同一套pipeline代码,所以会出现一直在success里触发Job B, 会死循环,所以我手动给ABORTED了。
关于pipeline中如何串联上下游job就介绍到这里,注意build 这个函数的调用以及里面参数是map成对,特别不要漏冒号和变量parameters中中括号等等。
转载地址:http://hkows.baihongyu.com/