需求背景

  • 当前测试组有定时构建的jenkins任务,同时jenkins构建完成之后会自动调用禅道api进行bug创建,但是中间存在断层,,jenkins创建的bug 不能同步到jenkins的构建记录。

    涉及修改

  • 添加两张数据表,一张为jenkins日常构建记录,每次构建直接入库,逻辑部分在jenkins配置中 ```sql create table run_report( id int(11) not null auto_increment comment ‘自增id’ primary key, job_id int(11) comment ‘jenkins_job表id’, create_at datetime comment ‘创建时间’, model varchar(64) default null comment ‘应用名称’, collected int(11) comment ‘总用例数’, passed int(11) comment ‘成功用例数’, failed int(11) comment ‘失败用例数’, error int(11) comment ‘错误用例数’, skip int(11) comment ‘跳过用例数’, swagger_count int(11) comment ‘swagger总共用例数’, interface int(11) comment ‘单接口用例数’, scenario int(11) comment ‘场景用例数’, rate varchar(64) comment ‘成功率’, duration varchar(256) comment ‘持续时间(单位:s)’, fail_reason varchar(256) comment ‘失败原因’ );

create table jenkins_job( id int(11) not null auto_increment comment ‘自增id’ primary key, build_number int(11) comment ‘jenkins任务number’, build_url varchar(256) comment ‘jenkins job 链接’, hrun_branch varchar(256) comment ‘httprunner项目的分支’, build_user varchar(256) comment ‘构建人’, create_at datetime comment ‘创建时间’, report_url varchar(256) comment ‘allure 报告链接’, bug_id int(11) comment ‘禅道CL自动化创建的BUG’ )

  1. <a name="EmmU4"></a>
  2. # 修改思路
  3. - 观察禅道现有的定时任务配置
  4. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1608527/1626593389440-1b3f3645-fff0-4dc5-b34f-a11ad6ddd6ca.png#clientId=u38e40b2e-0dbd-4&from=paste&height=346&id=u88fe34ef&margin=%5Bobject%20Object%5D&name=image.png&originHeight=691&originWidth=1839&originalType=binary&ratio=1&size=546157&status=done&style=none&taskId=u271845c8-3b32-4f64-8a97-c90cf1e130b&width=919.5)
  5. - 其任务定义于ci居多,且本次扩展也同属于持续集成,故选择在ci模块中进行编写,
  6. <a name="xmGDs"></a>
  7. # 具体实现
  8. - ci模块下添加自己定义的新方法
  9. ```sql
  10. public function jenkinsci()
  11. {
  12. // FIXME 写一个定时任务,定时查 ci自动化创建的bug,同步到对应table
  13. // moduleName=ci&methodName=checkCompileStatus
  14. // $this->loadModel('bug')->syncCIBugs();
  15. $ci_bugs = $this->dao->select('*')->from(TABLE_BUG)
  16. ->where('openedBy')->eq('autotest')
  17. ->andWhere('product')->eq(54)
  18. ->andWhere('status')->eq('active')
  19. ->andWhere('deleted')->eq('0')
  20. ->fetchAll();
  21. // TODO 返回为数组,数据为obj
  22. // 定义一个数组 数据格式为 build_num 为key ,对应value 为bugId
  23. $res = array();
  24. $bugIds = array();
  25. foreach ($ci_bugs as $bug) {
  26. // $bugIds = array();
  27. // $bugIds[] = $bug->id;
  28. $sub_title = substr($bug->title, 0, strrpos($bug->title, "_"));
  29. // 取得build_num
  30. $build_num = substr($sub_title, 0, strrpos($sub_title, "_"));
  31. // 判断构建编号是否已经存在,已存在则说明一次构建创建了多个bug
  32. $res[$build_num] = $bug->id;
  33. }
  34. foreach ($res as $key => $value) {
  35. // key 为 buildNumber ,value 为禅道中创建的bugid
  36. $arr[$key] = $value;
  37. $this->dao->update('jenkins_job')
  38. ->set('bug_id')->eq($value)
  39. ->where('build_number')->eq($key)
  40. ->exec();
  41. }
  42. die(json_encode(array('result' => 'success')));
  43. }
  • 首先根据自动化创建的bug标题定位到buildnumber,然后将buildnum 与bugid关联,整合成一个数组。
  • 接下来执行update去更新jenkins_job这张表完成bugid与jenkins构建的关联