Jenkins高级篇之Pipeline技巧篇-5-pipeline中如何代码串联多个job的执行

这篇我来介绍下,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] echo
Do some actins when always need.
[Pipeline] }
[Pipeline] // script
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Here we kickoff run job B
[Pipeline] build (Building ProjectB-pipeline-demo)
Scheduling project: ProjectB-pipeline-demo
Starting building: ProjectB-pipeline-demo #1
[Pipeline] echo
ABORTED
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

你在jenkins的日志控制台点击ProjectB-pipeline-demo #1, 确实可以跳转到Job B的构建日志了, 这里由于我两个job都使用了同一套pipeline代码,所以会出现一直在success里触发Job B, 会死循环,所以我手动给ABORTED了。

关于pipeline中如何串联上下游job就介绍到这里,注意build 这个函数的调用以及里面参数是map成对,特别不要漏冒号和变量parameters中中括号等等。

 

 

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值