Jenkins是一款由Java编写的开源的持续集成工具,它运行在Servlet容器中(例如Apache Tomcat),可以通过各种方式触发构建。例如提交给版本控制系统时被触发、通过类似Cron的机制调度、或在其他的构建已经完成时通过一个特定的URL进行请求。

利用Jenkins工具现有能力,实现代码检查服务的快速集成,包含执行检查、状态查询、报告输出等基本扫描流程。用户可根据基础方案进行自定义开发。

本文介绍如何通过Jenkins工具及CodeArtsCheck API,实现代码检查服务集成与调度。本示例将以通用Git为例,进行方案介绍。

  • 代码源为非同一CodeArts项目下的Repo仓时需使用扩展点进行代码源接入。
  • 每个通用Git扩展点仅能对接单个代码仓地址。
  • 1个CodeArts项目下的扩展点数量限制为1000。
  • 实行本实践需了解Jenkins工具的使用与基础开发。
  • 开通并授权使用代码检查服务

    表1 操作流程
  • 使用华为云账号 登录华为云控制台页面
  • 单击页面左上角 ,在服务列表中选择 开发与运维 > 软件开发生产线 CodeArts
  • 单击 “立即使用” ,进入CodeArts服务首页。
  • 在首页单击 新建 > 新建项目 ,选用 “Scrum” 项目模板。项目名称填写 “Scrum01” ,其他参数保持默认即可。
  • 单击 “确定” 后,进入到 “Scrum01” 项目下。
  • 新建通用Git服务扩展点

    服务扩展点(Endpoint)是软件开发生产线的一种扩展插件,为软件开发生产线提供链接第三方代码仓的能力。

    代码检查服务默认检查CodeArts Repo服务的代码质量,同时也可使用服务扩展点连接第三方代码仓库检查代码质量。

  • 在项目下的CodeArts Check服务页面的导航栏选择 设置 > 通用设置 > 服务扩展点管理
  • 单击 “新建服务扩展点” ,在下拉列表中选择 “通用Git”
  • 在弹框中配置以下信息,单击 “确定”
  • 根据本地电脑的系统版本号下载对应版本的KooCLI工具。
  • 访问 代码检查API调试 页面。
  • 选择实际使用的Region和填写 创建通用Git代码检查任务并获取任务ID 中查询到的任务ID,其中 hcloud CodeCheck RunTask --cli-region="cn-north-4" --task_id="9fd08c41a9824a69afdb9aca17590e29" 即为生成的调用命令。 图2 生成API调用命令
  • 参考 4 ,依次获得查询任务执行状态(ShowProgressDetail)、查询缺陷概要(ShowTaskDetail)API的调用命令。
  • returnStdout: true, script: """ /codearts/hcloud configure set --cli-access-key=S******************3 --cli-secret-key=s******************A echo response script { echo "执行检查任务" def response = sh( returnStdout: true, script: """ /codearts/hcloud CodeCheck RunTask --cli-region="cn-south-1" --task_id="4******************f" echo response def json = readJSON text:response echo "exec_id: ${json.exec_id}" script { def try_count=0 def task_status=0 while (true) { def response = sh( returnStdout: true, script: """ /codearts/hcloud CodeCheck ShowProgressDetail --cli-region="cn-south-1" --task_id="4******************f" echo response def json = readJSON text:response task_status=json.task_status echo "代码检查任务执行中 try_count: $try_count, task_status: $task_status" if(task_status.toInteger()>0){ break try_count=try_count+1 if(try_count==120){ break sleep(time: 5, unit: 'SECONDS') if(task_status.toInteger()==0){ error "代码检查超过600s,构建任务失败" if(task_status.toInteger()==1){ error "代码检查没有通过,构建任务失败" if(task_status.toInteger()==3){ error "代码检查任务中止,构建任务失败" script { def response = sh( returnStdout: true, script: """ /codearts/hcloud CodeCheck ShowTaskDetail --cli-region="cn-south-1" --task_id="4******************f" echo response def json = readJSON text:response def issue_count=json.issue_count def new_count=json.new_count def solve_count=json.solve_count def cyclomatic_complexity_per_method=json.cyclomatic_complexity_per_method def duplication_ratio=json.duplication_ratio def code_line=json.code_line def critical_count=json.critical_count def major_count=json.major_count def is_access=json.is_access echo "问题数:$issue_count" echo "未解决问题数:$new_count" echo "已解决问题数:$solve_count" echo "代码平均圈复杂度:$cyclomatic_complexity_per_method" echo "代码重复率:$duplication_ratio" echo "NBNC代码行:$code_line" echo "致命问题数:$critical_count" echo "严重问题数:$major_count" echo "门禁质量是否通过:$is_access" if(is_access.toInteger()==1){ error "门禁质量检查没有通过,构建任务失败" else{ echo "门禁质量检查通过" stage('拉取代码') { steps { sh ''' echo "拉取代码" stage('代码编译') { steps { sh ''' echo "代码编译" stage('上传镜像并部署到cce') { steps{ sh ''' echo "上传镜像并部署到cce"
  • 执行流水线任务。
  •