Jenkins教程(六)脚本与方法执行效果不合预期,如何及时中止pipeline

摘要:
有时很明显,某些Python或shell执行结果是错误的,stage('test'){step{script{defes=someGroovyMethod()if(res==false){thrownewRuntimeException('prompt')}step}2。对于在管道中调用shell,stage('test'){step{script{defes=sh(label:

场景

使用Jenkins的流水线时,有时明明某些Python或Shell执行结果错误,但仍会继续运行下去,甚至于最终提示成功。这并不合我们的预期——出现错误及时停止。当然,还有那种小错误不影响构建的,希望继续执行下去的情况。

所以,场景有两个:

  • 希望发现错误,及时中止执行的情况。
  • 希望错误发生时,脚本仍继续执行的情况。

本文以上两种场景分别给出示例。

本文不考虑能被pipeline捕获的异常中断。

及时中止,如何做?

1、对于Jenkins流水线中,使用groovy语法实现的功能,可以考虑使用Java的异常。

示例:

stage('test'){
	step{
		script{
			def res = someGroovyMethod()
			if(res == false){
				throw new RuntimeException('提示信息')
			}
		}
	}
}

2、对于流水线中调用Shell,可以考虑匹配返回值,抛异常。

示例:

stage('test'){
	step{
		script{
			def res = sh(label:"测试分支是否存在:", script: """
						echo 'hello world!'
						""", returnStdout: true);
			if(!res.contains("hello world")){
				throw new RuntimeException('提示信息')
			}
		}
	}
}

除了 returnStdout 用于返回执行输出,还可以使用 returnStatusreturnStatusreturnStdout 不能同时使用,returnStatus 表示脚本执行完毕的返回值是0还是非0,非0值即有问题的。

3、对于以上两种情况,只要能获取返回输出或状态,就可以终止流水线,使用 error

示例:

stage('test'){
	step{
		script{
			def res = someGroovyMethod()
			if(res == false){
				error '提示信息'
			}
		}
	}
}

报错忽略,如何做?

1、使用异常捕获,try-catch block 或 try-catch-finally block。

示例:

stage('test'){
	step{
		script{
			try{
				someMethodMaybeThrowException()
			} catch(Exception e){
				// do something you want. e.g,print logs.
			}
		}
	}
}

2、使用Jenkins 流水线中的 catchError 忽略异常或可能中断构建的错误。

示例:

stage('test'){
	step{
		script{
			//无论是否会报错,这个stage以及构建结果都不会因这个错误而失败。
			catchError(buildResult: 'SUCCESS', catchInterruptions: false) {
			    someMethodMaybeThrowException()
			}
			//some post step will continued.
		}
	}
}

catchError 的玩法还有很多,典型应用场景是针对一些后置的操作,比如构建完成发消息给构建者,保证这个消息不会因为脚本执行中断而停止。当然了,声明式流水线还有post块完成刚才说的功能~

最后

简单记记,公司最近流水线改造,顺手记点内容。如果文中有什么错误,请留言评论告知我,谢谢。

引用:

免责声明:文章转载自《Jenkins教程(六)脚本与方法执行效果不合预期,如何及时中止pipeline》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java事务管理 (转)Vue——使用JS文件中的函数ESLint报错未定义下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Flask之RESTFul API前后端分离

Flask之RESTFul API前后端分离一:虚拟环境搭建的两种方式 1 pipenv的使用 pip install --user pipenv安装pipenv在用户目录下 py -m site --user-site通过此命令找到用户基础目录,结果为C:Usersu14eAppDataRoamingPythonPython35site-packages...

python 获取系统时间,新建时间目录

import datetime import os theTime = datetime.datetime.now() print(theTime) theTime = str(theTime) date_split = theTime.strip().split(' ') date_today = date_split[0].replace('-', '...

CSS在线字体库,外部字体的引用方法@font-face

@font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许多人会不自然的问,这样的东西IE能支持吗?当我告诉大家@font-face这个功能早在IE4就支持了你肯定会感到惊讶。我的Blog就使用了许多这样的自定义We...

ionic3 项目中问题的解决

1、ios端除了button按钮上绑定click事件,会有时间延迟,可通过给元素绑定tappable解决 2、ios端屏幕上下拖动,底部往上拉会有白屏,可通过config.xml里面配置   <preference name="WebViewBounce" value="false" />   <preference name="Disa...

a.download下载文件 ---跨域问题

下载文件,使用a.download var a = document.createElement('a') a.download = row.fileName || 'pic' a.href = row.src; a.click() 预览文件 window.open(row.src)  预览文件只能预览图片文件和pdf a.download在跨域中是...

Python常用内建模块-struct

以下引用自:廖雪峰官方网站https://www.liaoxuefeng.com/wiki/897692888725344/949448951557344 准确地讲,Python没有专门处理字节的数据类型。但由于str既是字符串,又可以表示字节,所以,字节数组=str。而在C语言中,我们可以很方便地用struct、union来处理字节,以及字节和int,f...