Jenkins结合飞书和Metersphere工具链

2023-06-12 807 0

1-Metersphere集成Jenkins

  1. 根据metersphere版本,下载jenkins对应版本的ms插件.插件下载地址: https://github.com/metersphere/jenkins-plugin/releases下载 MeterSphere 对应版本的 hpi 包,在 Jenkins 的插件管理页面(高级->部署插件->选择文件上传),上传并安装下载好的 hpi 插件包

        注意:Jenkins账号需要具备安装插件的权限.

  1. 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 测试工程基础配置

  1. 构建触发器 
  • 构建触发器选中 “其他工程构建后触发” 选择单项“根据构建稳定时触发”
  • 配置哪些现有Task构建成功后触发,配置格式:Jenkins工程名/分支源名,参考上游Job配置如下截图

流水线配置

  • 配置Jenkins pipeline脚本所在地址和仓库,执行指定pipeline脚本
  • 注意pipeline所在分支 main(一般是在staging分支改写pipeline脚本,然后推到main分支生效,也可以直接在main分支直接提交)

Git仓库Jenkins-CI文件所在

Jenkins流水线Jenkinsfile配置

Meterphere 相关资源确认

  1. 获取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中的 上游项目名字/分支源名

  1. 如:addStage("cloud-user/test")

2.在parallel_jobs方法内配置需要并行执行的Metersphere测试计划

  1. 添加else if(){}逻辑流,stageName配置为 参数为步骤1中的 上游项目名字/分支源名

  2. 方法体中配置测试计划

  3. 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-参考

相关文章

集群压测体系搭建-实时监控平台(2)
密码保护:Metersphere使用实践,优缺点分析
密码保护:MS自动化测试框架调研
记一次Nginx代理Mysql服务的经历
Jenkins中自动化创建Jira任务
集群压测体系搭建-Jmeter集群(1)
Index