博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jenkins高级篇之Pipeline技巧篇-5-pipeline中如何代码串联多个job的执行
阅读量:4302 次
发布时间:2019-05-27

本文共 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/

你可能感兴趣的文章
谈谈关于网瘾的看法和建议
查看>>
C含参数的宏与函数的区别
查看>>
memcpy原码引发的内存拷贝注意事项
查看>>
单工、半双工、全双工的区别
查看>>
LDO是什么?LDO与DCDC的区别与选择
查看>>
FTP和TFTP的区别
查看>>
多进程与多线程的优劣 与 共享内存的同步问题
查看>>
pid_t的类型定义
查看>>
驱动中的file、inode、cdev对象的联系
查看>>
Linux下阅读源码工具
查看>>
《The two second acdvantage》读书笔记
查看>>
Makefile 中:= ?= += =的区别
查看>>
Remap of Holistic learning
查看>>
Android底层知识点(AD+JNI+NDK+HAL)
查看>>
USB转串口通信实践总结
查看>>
file, inode与cdev的总结
查看>>
阻塞与非阻塞知识点总结
查看>>
USB接口、串口、并口有何区别
查看>>
zImage和uImage等内核文件总结
查看>>
GPIO八种工作模式总结
查看>>