1-Metersphere集成Jenkins
- 根据metersphere版本,下载jenkins对应版本的ms插件.插件下载地址: https://github.com/metersphere/jenkins-plugin/releases下载 MeterSphere 对应版本的 hpi 包,在 Jenkins 的插件管理页面(高级->部署插件->选择文件上传),上传并安装下载好的 hpi 插件包
注意:Jenkins账号需要具备安装插件的权限.
-
jenkins中集成metersphere
a.freeStyle方式构建
-
在构建步骤中选择Metersphere;
-
到Metersphere查看,填写对应metersphere的Endpoint(url),Accesskey,SecretKey信息;
-
系统设置->服务集成->马上添加->API Keys->新建AccessKey 和SecretKey;
-
配置好Metersphere的信息后点击验证账户,测试jenkins是否成功连接到Metersphere;
-
选择执行方式。根据自己负责的工作空间,项目名称,选择对应的执行方式(可选Metersphere中制定的测试计划,指定单独case,场景等),运行模式(串行,并行),运行资源池;
-
根据需要,可以添加多个构建步骤,制定多个测试计划运行;
b.PipeLine脚本方式
由于插件实现方式的问题,MeterSphere插件目前还不支持在声明式Pipeline中的直接引用。可以在声明式Pipeline中引入Script步骤, 然后在Script步骤块中引用MeterSphere插件。
■ msEndpoint:MeterSphere服务地址;
■ msAccessKey:MeterSphere上某个用户的API Access Key;
■ msSecretKey:上述Access Key对应的Secret Key;
■ workspaceId:需要触发执行的测试所在的工作空间id;
■ projectId:需要触发执行的测试所在的项目id;
■ method:触发执行任务类型(testplan:执行整个测试计划,single:执行指定的某个测试任务)
■ testPlanId:测试计划id,method参数值为testplan时有效;
■ testCaseId:场景id/接口用例id/性能测试id,method参数值为single时有效;
■ mode:执行方式(serial:串行执行,parallel:并行执行);
■ resourcePoolId:执行测试使用的测试资源池id。
代码实现如下:
pipeline {
agent any //任意选择
// agent { label 'local-host'} //指定agent
stages {
stage('Build') {
steps{
echo "building"
}
}
stage('Deploy') {
steps{
echo "deploying"
}
}
stage('Test') {
steps{
script {
meterSphere msEndpoint:'http://XXXX',
msAccessKey:'XXXXXX',
msSecretKey:'XXXXXX',
workspaceId:'XXXXXX',
projectId:'XXXXXX',
method:'testPlan',
testPlanId:'XXXXXX',
mode:'parallel',
resourcePoolId:'',
result:'metersphere'
}
script {
meterSphere msEndpoint:'http://XXXXXX',
msAccessKey:'XXXXXX',
msSecretKey:'XXXXXX',
workspaceId:'XXXXXX',
projectId:'XXXXXX',
method:'single',
testCaseId:'XXXXXX',
mode:'parallel',
resourcePoolId:'',
result:'metersphere'
}
}
}
}
}
c. 获取测试报告
1 , 待运行Job结束后,可通过对应构建记录点击控制台输出,查看对应的自动化报告(链接会导到metersphere平台查看报告);
2 , 在metersphere平台也可看到自动化执行的报告,不用每次都在手动触发执行,一次性配置集成,自动触发,构建,测试,产出报告结果;
d. 目前发现的情况
1,在Jenkins触发Metersphere的测试计划后,如果在Jenkins中点击停止构建,在Metersphere中会继续运行,不会立即停止,对应的报告状态不是completed.
2,在Jenkins中构建运行后,如果测试计划中存在失败的用例或者场景,会导致Jenkins的整体失败运行,可添加对应配置,在jenkins 脚本中添加异常捕获; catchError(buildResult: “SUCCESS”, stageResult"FAILURE"){ build job:“test” }
2-Jenkins-Metersphere工具链流程
概述
为了最大程度解藕开发和测试的pipeline,将整个集成分为两个阶段。首先目前每个模块已经自有一套对应的Jenkins Job体系,需要创建测试的Jenkins Job编写Pipeline脚本,测试Jenkins中配置pre job触发机制,当开发的jenkins job在构建成功后才会触发测试对应的Jenkins Job,在测试所在的Jenkins Job中会自动获取当前需要构建的是哪个模块的哪个分支,根据模块和分支信息执行对应的Metersphere中的测试计划,多个测试计划并行执行。
在测试开始之前自动判断该次执行属于哪个分支,如果分支为Test则向Test监控群内发送静默信息,如果分支为Staging则向Staging监控群内发送通告信息;
构建架构
每个模块每个分支只会触发一次该构建,如果多个模块多个分支同时触发,则会有不同的构建批次。
- 一阶段联动构建,
- 由开发提交代码到对应分支触发开发对应的Jenkins Job
- 开发对应的Jenkins Job状态成功,自动触发测试的Jenkins Job
- 所在测试的Jenkins Job,Pipeline脚本中获取上游Job的模块和分支信息
- 二阶段Ms集成
- Jenkins中安装和Metersphere版版一致的插件
- 在测试的Jenkins Job中,Pipeline脚本内获取上游标识动态触发stages
- stages中Pipeline并行机制处理
- 并行stage中构建触发Metersphere指定的测试计划
- pipeline脚本优化,简化配置新模块时的步骤
3-集成步骤
资源环境
插件安装
- 具有jenkins安装插件权限的账号
- 下载Meterphsere对应版本的hpi文件
- Jenkins->右上角小铃铛->系统管理->插件管理->高级->上传插件->选择hpi文件点击上传
Jenkins 测试Project类型确认
每个Task类型都各有优缺点,经验证后最后选择 流水线 构建,因为要使用上下游Job对接以及Pipeline调用。
Jenkins 测试工程基础配置
- 构建触发器
- 构建触发器选中 “其他工程构建后触发” 选择单项“根据构建稳定时触发”
- 配置哪些现有Task构建成功后触发,配置格式:Jenkins工程名/分支源名,参考上游Job配置如下截图
流水线配置
- 配置Jenkins pipeline脚本所在地址和仓库,执行指定pipeline脚本
- 注意pipeline所在分支 main(一般是在staging分支改写pipeline脚本,然后推到main分支生效,也可以直接在main分支直接提交)
Git仓库Jenkins-CI文件所在
Jenkins流水线Jenkinsfile配置
Meterphere 相关资源确认
- 获取msAccessKey,msSecretKey msAccessKey,msSecretKey 自创建
系统设置->工作空间->服务集成->马上添加->API Keys->点击新建 确保在启用状态
获取workSpaceId,projectID,TestPlanId
注意:测试计划中需要,指定本测试计划的测试环境,Jenkins会以此环境进行触发基础
- 获取workSpaceId,projectID,TestPlanId可以采用很多种方式比如数据库查看或者接口查看,我是使用接口查看的方式,提前打开F12 调试工具;
- 测试跟踪->测试计划
-
查看点击测试计划后的接口详情
-
如 <121.40.190.206:8081/test/plan/list/1/10/test/plan/list/1/10>
-
忽略其他返回字段,可看到对应TestPlan的相关信息
id: "f0e6aa6a-125c-4 c030584" // TestPlanID
name: "test plan user test -peterTest" // TestPlanName
projectId: "20bd9c 29"
workspaceId: "e179 8f03"
-
Jenkinsfile Pipeline编写
- 可参考 官方文档 Pipeline Syntax
- Pipeline需遵循以下语法格式,可在以下格式的基础之上进行复杂逻辑编程
pipeline { agent any stages { stage('拉取代码') { steps { echo '拉取代码';echo "查看分支名字 ${BRANCH_NAME} " } } stage('编译构建') { steps { echo '编译构建';echo env.BRANCH_NAME; } } stage('项目部署') { steps { echo '项目部署' } } } }
4-集成模块
配置Jenkins上下游Job联动
1.找到该测试工程.配置-> 构建触发器->配置上游项目名字/单分支源名 以英文逗号分隔
2.Pipeline脚本配置构建stage和并行任务
在pipeline中的steps内,调用AddStage方法,参数为步骤1中的 上游项目名字/分支源名
- 如:addStage("cloud-user/test")
2.在parallel_jobs方法内配置需要并行执行的Metersphere测试计划
-
添加else if(){}逻辑流,stageName配置为 参数为步骤1中的 上游项目名字/分支源名
-
方法体中配置测试计划
-
parallel([ "ParallelPlan1":{testPlan}, "Parallelplan2":{testPlan} ])( 如:testPlan(msAccessKey,msSecretKey,workSpaceID,projectID,testPlanID))
// cloud-user parallel test job staging else if( current_model_branch_name==stageName & stageName =="cloud-user/staging"){ parallel([ // 并行任务配置在里面 'staging-env release test':{ testPlan( "", "", "","","" )} ])}
测试报告查看
可以通过Jenkins端看到相应项目的报告地址,点开地址就可以看到测试详情;
-
通过jenkins当前构建查看
通过Metersphere查看[测试跟踪->报告]触发方式为API调用就是Jenkins触发的
飞书监控群静默机制
Test环境每次测试会运行大量反向用例,导致群内报警不断,通过jenkins集成飞书,在测试开始之前通知Test监控群静默,测试结束后通知群恢复静默,从而减少因正常测试导致的报警,以及降低静默时间过长错过其他警报消息的情况;
-
集成步骤:
1.需要提前下载Jenkins 插件 HTTP Request
2.获取飞书webhook以及请求规则
3.pipeline脚本中发送请求Post请求格式 def url = '' def body = groovy.json.JsonOutput.toJson(JsonStringBody) def response = httpRequest acceptType: 'APPLICATION_JSON', contentType: 'APPLICATION_JSON', httpMode: 'POST', requestBody: body, url: url, validResponseCodes: "100:511", quiet: true if (response.status == 200) { println("Http request ${url} is successfully, the body is ${body}") } else { println("faild ${response.status}, content is ${response.content}") }
成功截图
-
Test环境-运行所有正反向用例静默后无任何消息,恢复静默后报警正常;
-
Staging环境- 仅运行正向用例,不会产生报警信息,只会向staging群内提醒开始测试信息;
消息通知
Metersphere自带消息通知机制,可创建消息通知,配置事件[执行成功,执行失败]和飞书机器人webhook;
Pipeline 脚本 pipeline
pipeline {
agent any
stages {
stage('Dynamic Trigger Stages') {
steps {
addStage("test_trial_02/main")
// 第一步 配置对应模块的stage
// other model......
}
}
}
}
// 配置测试计划
def parallel_jobs(stageName){
//....
if( current_model_branch_name==stageName & stageName =="test_trial_02/staging"){
parallel([
'测试计划1':{testPlan("","","","","")},
'测试计划2':{testPlan( "", "", "","", "" )}
])
}
// 第二步 配置判断模块名以及metersphere测试计划
else if( current_model_branch_name==stageName & stageName =="test_trial_02/main"){
parallel([
'测试计划1':{ testPlan( "", "", "","","" )},
'测试计划2': { testPlan( "", "", "","","" )},
'测试计划3': { testPlan( "", "", "","","" )}
])
}
}
// 执行测试计划
def testPlan(ak,sk,workSpaceId,projectId,testPlanId){...}
// 构建一个新的stage
def addStage(stageName) {...}
5-参考
- Jenkins Pipeline 官方编写文档:Pipeline Syntax
- Jenkins 如何发送POST请求:HTTP Request | Jenkins plugin