2019.1.21 始发于TesterHome 持续集成 Jenkins REST API 多任务依赖实际场景应用案例
本文涉及:Jenkins插件及使用、不同job间参数传递、Jenkins REST API、Shell脚本
背景说明:
线上API可用性监控我们使用的是Postman+Newman+Jenkins+Git来实现和维护的。
有时会遇到一个问题:Newman在Jenkins上执行时,有些异常情况会导致环境变量Environment文件(下一次脚本执行的数据来源)为空,导致后续数据加载出错,API任务构建失败。
如上图所示流程中的红叉叉❌那里
出现上述异常后,有没有解决方案?
有,手动构建另一个Jenkins Job,把备份的环境变量cp到指定目录下即可。
但。。。要通过。。。手。。。工。。。发现,太low了,风险高,效率低,鬼知道什么时候会出现这个情况,如果我在睡觉,我可不愿意还要爬起来手动执行几行命令。
So,怎么办呢?(好想睡个好觉)
Jenkins控制台输出打印了对应的错误日志error: Unexpected end of JSON input...
HA,解决方案有了:如果出现上述失败,通过检测控制台输出中的特殊字符串,然后执行环境变量Environment文件cp命令即可。
解决方案:
在脚本中,通过对Jenkins控制台的输出内容进行解析判断,再进行后续操作,比如是否执行后续命令或构建Job等。
解决过程
问题1:
如何获取Jenkins控制台输出的内容?
curl -X GET http://Jenkins_URL:port/job/Job_Name/Build_ID/consoleText
上述链接最后加的 consoleText ,是为了获取控制台输出。
问题2:
如果直接执行上面命令,会提示未登录错误。所以要先登陆到Jenkins。
在Jenkins请求链接前加 user:password@ 即可直接登录Jenkins。
如下:
curl -X GET http://user:password@Jenkins_URL:port/job/Job_Name/Build_ID/consoleText
问题3:
如何获取其它job最新构建的任务编号?
Job_Name 后面添加 /lastBuild/buildNumber 即可。
curl -X GET http://user:password@Jenkins_URL:port/job/Job_Name/lastBuild/buildNumber
问题4:
Jenkins中如何在不同的job间传递参数?
首先Jenkins下载安装 Parameterized Trigger Plugin
插件。
项目A设置:
在 增加构建后操作步骤 中选择 Trigger parameterized build on other projects ,
如下图:
自定义参数可以选择 Add Parameters -> Predefined parameters,按照 <key>:<value>
方式输入即可,支持多个参数。
如下图:
项目B设置:
一定首先选择 参数化构建过程 ,字段名称同项目A;直接 $key
即可使用。
如下图:
实际应用:
#!/bin/bash
GIT_WORKSPACE_PATH="/var/lib/jenkins/workspace/Git_Script_Update/"
NEWMAN_WORKSPACE_PATH="/home/ubuntu1604/xxx/newman/scripts/"
JOB_NAME=$FAILED_JOB_NAME
BUILD_ID=$FAILED_JOB_ID
#BUILD_ID=$(curl -X GET http://user:password@Jenkins_URL:port/job/$JOB_NAME/lastBuild/buildNumber|awk -F'[%]' '{print $1}')
STR_ERROR=$(curl -X GET http://user:password@Jenkins_URL:port/job/$JOB_NAME/$BUILD_ID/consoleText|grep error|awk '{print $1,$2,$3,$4,$5,$6}')
if [ "$STR_ERROR"x = "error: Unexpected end of JSON input"x ]
then
cp -r ${GIT_WORKSPACE_PATH}* ${NEWMAN_WORKSPACE_PATH}
echo "Update scripts Success!"
else
echo "Environment is OK. Nothing need to Do."
fi
说明1:
bash中赋值等号前面要加 $ ,如下:
STR_ERROR=$(curl -X GET http://user:password@Jenkins_URL:port/job/$JOB_NAME/$BUILD_ID/consoleText|grep error|awk '{print $1,$2,$3,$4,$5,$6}')
说明2:
if
判断时
- 如果是数字比对,用
==
或!=
- 如果是字符串比对,用单引号
=
,且等号两边各有一个空格
字符串比对,中括号两边各留一个空格,且字符串后面要加个字符 x
;
比对格式:[ “string1”x = “string2”x ]
,引用的字符也要加双引号
if [ "$STR_ERROR"x = "error: Unexpected end of JSON input"x ]
说明3:
BUILD_ID也可以通过Jenkins url获取,但最后会多一个%
,如下图所示
用 awk 把纯数字的 buildNumber 过滤出来,去掉最后的百分号,如下命令
BUILD_ID=$(curl -X GET http://user:password@Jenkins_URL:port/job/$JOB_NAME/lastBuild/buildNumber|awk -F'[%]' '{print $1}')
方案不足:
项目A构建只要失败(不一定是环境变量为空导致),就会触发项目B,因判断条件在项目B shell脚本中,导致了一些不必要的构建。
方案优化点:
项目A构建后续步骤中,增加本次构建的输出解析,若有关键字符串,再触发项目B,否则什么也不做,这样就可以做到没有冗余的构建。
总结:
上述就是问题解决过程和遇到的问题,可以安心睡觉了。
仅供参考,共同学习。
参考链接
欢迎交流
详细交流口口裙:668526705
威信嗖:Postman&Newman