持续集成之jenkins的Job配置

常用配置

邮件正文配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 <!DOCTYPE html>    
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
本邮件由系统自动发出,无需回复!<br/>
各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br>
<td><font color="#000000">构建结果 - ${BUILD_STATUS}</font></td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>触发原因: ${CAUSE}</li>
<li>构建状态: ${BUILD_STATUS}</li>
<li>构建日志: <a href="${JENKINS_URL}/job/${JOB_NAME}/${BUILD_ID}/console">${JENKINS_URL}/job/${JOB_NAME}/${BUILD_ID}/console</a></li>
<li>构建 Url : <a href="${JENKINS_URL}/job/${JOB_NAME}">${JENKINS_URL}/job/${JOB_NAME}</a></li>
<li>工作目录 : <a href="${JENKINS_URL}/job/${JOB_NAME}、ws">${JENKINS_URL}/job/${JOB_NAME}/ws</a></li>
<li>项目 Url : <a href="${JENKINS_URL}/job/${JOB_NAME}">${JENKINS_URL}jenkins/job/${JOB_NAME}</a></li>
<li>本次构建脚本:${script} </li>
<li>本次构建环境:${env} </li>
<li>具体报告内容 Url : <a href="${JENKINS_URL}/job/${JOB_NAME}/HTML_20Report/${JOB_NAME}-${env}-${BUILD_ID}-index.htm">${JENKINS_URL}/job/${JOB_NAME}/HTML_20Report/${JOB_NAME}-${env}-${BUILD_ID}-index.htm</a></li>
<li>聚合报告 Url : <a href="http://10.104.113.228:8080/system/#/">http://10.104.113.228:8080/system/#/</a></li>
</ul>

<h4><font color="#0B610B">失败用例</font></h4>
<hr size="2" width="100%" />
详见附件build.log<br/>

<h4><font color="#0B610B">最近提交(#GITLAB_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${JENKINS_URL}/job/${JOB_NAME}changes">${JENKINS_URL}/job/${JOB_NAME}/changes</a><br/>

</td>
</tr>
</table>
</body>
</html>

参数化构建使用扩展参数插件(Extended choice parameter)

Choose Source for Value

Groovy script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//读取目录结构
def locat = "/data/jenkins/workspace/资产售后-流程脚本/脚本"
def dir = new File(locat)
Set<String> artifacts = new TreeSet<String>()
dir.eachDir { directory ->
if (directory.absolutePath.contains("postman") || directory.absolutePath.contains("jmeter")) {
for (File f : directory.listFiles()) {
String script = f.getAbsolutePath()
artifacts.add(script)
}
}
}
List<String> result = new ArrayList<String>()
result.addAll(artifacts)
return result

可以获取以文件夹命名存放的脚本名称,作为jenkins参数来选择,用于构建jenkins job

img

shell脚本获取文件件目录

获取postman或jmeter下的脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env bash
#获取执行脚本集合
arr=(${script//,/ })
#调试输出每个集合元素
echo -----${arr[@]}
#获取集合元素个数
length=${#arr[@]}
#判断个数是否大于0,相当于判断jenkins界面脚本文件夹参数$script是否勾选了
if [ $length > 0 ]
then
#循环调用执行postman/jmeter脚本
for i in ${arr[@]}; do
# =~代表正则匹配
if [[ $i =~ postman ]]
then
# ls 返回目录下的所有文件
files=$(ls $i)
#遍历所有的文件夹
for j in $files
do
# if [ -z $String ] 代表如果字符串为空 这边只运行$testFilesIncluded所包含的文件(有配置的情况)和只获取后缀为postman_collection.json的文件
if ( [ -z "$testFilesIncluded"] || [[ $testFilesIncluded == *$j* ]] ) && [[ $j == *.postman_collection.json ]]
then
# % 去除最短的向后匹配 %%去除最长的向后匹配 #去除最短的向前匹配 ##去除最长的向前匹配 eg:http://landoflinux.com/linux_bash_scripting_substring_tests.html
envPrefix=${j%.postman_collection.json}
reportPrefix=${envPrefix}
# newman 运行脚本文件 输出cli和html的测试报告
#切换当前目录到$WORKSPACE
cd ${WORKSPACE}
#执行newman命令,其中报告输出位置文件名使用到变量。当前shell脚本定义的变量:${reportPrefix};jenkins用户自定义变量:${env};jenkins系统变量:${JOB_NAME}、${BUILD_ID};
newman run $i/$j -e $i/${env}.postman_environment.json --delay-request 1000 --reporters cli,html,json,junit --reporter-json-export ${BUILD_ID}"-"jsonOut.json --reporter-junit-export ${BUILD_ID}"-"xmlOut.xml --reporter-html-export ${JOB_NAME}"-"${env}"-"${BUILD_ID}"-"index.htm
fi
done

fi
done

fi