一步步玩转测试平台开发(七):巧用 Jenkins "Post Build Task”插件

前文《(六) 如何通过Python获取Jenkins Job信息》讲解了如何通过Python获取Jenkins Job构建信息。如果放到我目前的项目上来说,就是提供了测试平台主动获取Jenkins上的构建job相关信息的可能。

如果你要想光靠这种方式来实现持续集成方案中测试平台和Jenkins之间的交互,那么一般的思路都是首先用Python写一个Jenkins 构建Job的定时轮询脚本,通过这个脚本你可以准实时的发现那些刚刚新构建的Job,通过读取Job信息再来触发后续的自动化测试执行。 其实说到这,大家就能马上意识到这工作效率也太低了吧,同时还要消耗一定网络通信资源,还不能实现构建完就马上触发测试。有什么方法只要构建了Job Jenkins就能主动通知测试平台并且把相应的构建信息传递给测试平台呢?这样既能省了写轮询脚本,从而减少了不必要的网络通信开销,同时还能实现构建完就马上触发测试。

于是带着这个问题我百度了会,发现Jenkins的 "Post Build Task”插件似乎可以解决上述问题。废话少说,开干!

Jenkins的wiki是这样解释这个插件: Post Build Task插件允许用户根据构建日志输出执行shell /批处理任务,允许使用Java正则表达式

Jenkins上安装完这个插件后,在配置Job的设置中最后“构建后操作”中点击“增加构建后操作步骤”,你就能看到“Post build task”了。

下图就是该插件的设置界面:

  • Script输入框: 填写该Job构建完,你希望要执行操作的shell脚本。

  • Run script only if all previous steps were successful: 勾选上它就意味着只有该Job前面步骤都是成功的,之后才能执行Script中的shell脚本

  • Escalate script execution status to job status: 勾选上它就意味着如果该脚本执行失败那么该Job的构建最终状态也是失败

构建后插件.jpg

那么如何能通过shell脚本把该次构建的环境变量取出来呢? 在前文《(六) 如何通过Python获取Jenkins Job信息》中介绍了如何查看每次构建的环境变量,这里shell脚本可以通过 ${xxxxx} 获取到环境变量xxxxx的值。很简单吧!

其实在实际工作中每一次构建并不一定都需要自动化测试,我们可不可以在Job的设置中设置一个开关,通过这个开关来控制构建完是否执行Post build task中脚本呢?

要想实现这个开关,我采用的方案是在Job的构建设置中添加一个“布尔值参数”,如下图:

布尔型参数设置.jpg

设置完这个参数后,在构建job时就会在构建界面中出现咱们刚刚设置的布尔值参数,如下图: 构建job界面.jpg

通过这个参数的勾选与否,我们就可以在shell脚本设置一个判断条件,只有你勾选了这个参数后,才会给测试平台接口发送请求。下面是我的实际工作中使用的shell脚本,供参考:
echo AutomatedTestAreRequired: "${AutomatedTestAreRequired}" # 打印布尔值参数AutomatedTestAreRequired值

if [ ${AutomatedTestAreRequired} = true ];then #判断AutomatedTestAreRequired值是否为True

echo JOB_NAME: "${JOB_NAME}" # 打印需要的环境变量值
echo Project: "${Project}" # 打印需要的环境变量值
echo BUILD_NUMBER: "${BUILD_NUMBER}" # 打印需要的环境变量值

sleep 20s # 考虑一般环境部署完tomcat需要一段时间初始化时间,所以设置了一个睡眠时间

curl -X POST https://test-platform.xxxxxxxx.com/api/trigger-interface-auto-jenkins/ -d 'job='${JOB_NAME}'&project='${Project}'&build='${BUILD_NUMBER}'' # 给测试平台相应的接口发送请求传递参数,触发测试

fi

下图是实际工作中的一次构建的控制台输出,因为测试平台的自动化测试接口是通过线程池实现了异步响应,所以给该接口发送完请求后,接口就会马上返回响应。如何实现异步处理的接口我会在后面的文章专门做解释

执行log.jpg

谢谢关注《一步步玩转测试平台开发》系列连载,坚持原创,分享实用干货,敬请期待后面的精彩!