Jenkinsfile以stage为逻辑功能实现和划分的方式使用起来非常方便,而一旦发生异常之后应该如何处理,如何根据stage执行的结果而进行特定处理则是实际Pipeline使用中经常会碰到的问题。在Groovy或者Java语言中一般这就是try {} catch{}的使用场景,而Jenkinsfile也将执行结果的状态进行共通化,可以根据执行结果的特定状态作为触发的条件,这就是post{}。而流水线的实现则只需要在对应的状态中执行预定的处理逻辑即可,这篇文章中将通过具体的示例进行介绍和演示。
post{}
根据执行记的结果决定处理内容,就像Java程序中catch块中做的那样,post{}根据pipeline或者stage的执行结果预先定义了多个条件,通过在流水线中声明这些条件和在这些条件之下的steps操作即可,类似回调函数的使用方法,你也可以把它看作是try…catch…的封装实现,从而使得对于异常的处理更加方便。
- 使用限制:需要写在pipeline或者stage块中
- 可选vs必选:可选
- 支持的条件预置:
- always: 无论pipeline或者stage的执行结果如何,此块中的预置操作都会执行。
- changed:只有当pipeline或者stage的执行后,当前状态与之前发生了改变时,此块中的预置操作才会执行。
- fixed:前一次运行为不稳定状态或者失败状态,而且本次运行成功结束,这两个条件同时满足时,此块中的预置操作才会执行。
- regression: 本次运行状态为不稳定状态,失败状态或者是中止状态,而且前一次运行成功结束,这两个条件同时满足时,此块中的预置操作才会执行。
- aborted:当前pipeline或者stage的状态为aborted时,此块中的预置操作才会执行。通常是由于流水线被手工中会导致此状态产生,而产生此状态后,通常在Jenkins的UI界面会显示为灰色。
- failure:当前pipeline或者stage的状态为failed时,此块中的预置操作才会执行。而产生此状态后,通常在Jenkins的UI界面会显示为红色。
- success:当前pipeline或者stage的状态为success时,此块中的预置操作才会执行。而产生此状态后,通常在Jenkins的UI界面会显示为绿色。
- unstable: 当前pipeline或者stage的状态为unstable时,此块中的预置操作才会执行。通常情况下测试失败或者代码规约的违反都会导致此状态产生,而产生此状态后,通常在Jenkins的UI界面会显示为黄色。
- unsuccessful:当前pipeline或者stage的状态不是success时,此块中的预置操作才会执行。
- cleanup:无论pipeline或者stage的状态为何种状态,在post中的其他的条件预置操作执行之后,此块中的预置操作就会执行。
注意: cleanup和always的区别在于,cleanup会在其他任意一个条件预置操作执行之后就会执行。
示例
本文示例:
将流水线分按照功能分为逻辑上的三段:构建(Build) 、测试(Test)、部署(Deploy),顺序如下所示。