
# 使用Jenkins插件集成CodeArts Check执行代码检查
#### 应用场景
Jenkins是一款由Java编写的开源的持续集成工具，它运行在Servlet容器中（例如Apache Tomcat），可以通过各种方式触发构建。例如提交给版本控制系统时被触发、通过类似Cron的机制调度、或在其他的构建已经完成时通过一个特定的URL进行请求。
利用Jenkins工具现有能力，实现代码检查服务的快速集成，包含执行检查、状态查询、报告输出等基本扫描流程。用户可根据基础方案进行自定义开发。
本文介绍如何通过Jenkins工具及CodeArtsCheck API，实现代码检查服务集成与调度。本示例将以通用Git为例，进行方案介绍。
#### 约束限制
- 代码源为非同一CodeArts项目下的Repo仓时需使用扩展点进行代码源接入。
- 每个通用Git扩展点仅能对接单个代码仓地址。
- 1个CodeArts项目下的扩展点数量限制为1000。
- 实行本实践需了解Jenkins工具的使用与基础开发。
 
#### 前提准备
已[开通并授权使用代码检查服务](https://support.huaweicloud.com/usermanual-codecheck/codeartscheck_01_9000.html)。
#### 操作流程
表1操作流程 
| **流程**                                                                   | **说明**                                             |
|:---|:---|
| [创建代码检查任务所属项目]              | 为本实践新建项目。                                          |
| [新建通用Git服务扩展点]           | 实践检查第三方代码仓的代码质量，代码检查服务需通过CodeArts提供的扩展插件连接到第三方代码仓。 |
| [创建通用Git代码检查任务并获取任务ID]    | 创建代码检查任务并获取任务ID。                                   |
| [创建访问凭证AK和SK]             | 创建调用API时使用的AK和SK。                                  |
| [下载KooCLI工具并获取代码检查API的调用命令] | 下载KooCLI工具并获取代码检查API的调用命令。                         |
| [在Jenkins工具中调用代码检查API]    | 通过Jenkins工具调用代码检查API。                              |
   
 #### 创建代码检查任务所属项目
1. 使用华为云账号[登录华为云控制台页面](https://console.huaweicloud.com/console)。
2. 单击页面左上角![](https://support.huaweicloud.com/bestpractice-codecheck/zh-cn_image_0000002051102128.png)，在服务列表中选择"开发与运维 \> 华为云码道 CodeArts"。
3. 单击"立即使用"，进入CodeArts服务首页。
4. 在首页单击"新建 \> 新建项目"，选用"Scrum"项目模板。项目名称填写"Scrum01"，其他参数保持默认即可。
5. 单击"确定"后，进入到"Scrum01"项目下。
 
 #### 新建通用Git服务扩展点
服务扩展点（Endpoint）是华为云码道的一种扩展插件，为软件华为云码道提供链接第三方代码仓的能力。
代码检查服务默认检查CodeArts Repo服务的代码质量，同时也可使用服务扩展点连接第三方代码仓库检查代码质量。
1. 在项目下的CodeArts Check服务页面的导航栏选择"设置 \> 通用设置 \> 服务扩展点管理"。
2. 单击"新建服务扩展点"，在下拉列表中选择"通用Git"。
3. 在弹框中配置以下信息，单击"确定"。 
   表2新建通用Git服务扩展点 
   | **参数**          | **说明**                                                 |
   |:---|:---|
   | 连接名称            | 自定义，支持中文、英文、数字、"-"、"_"、"."、空格，不超过256个字符。例如：Endpoint01。 |
   | Git仓库Url        | 输入待连接的Git仓库的https地址。                                   |
   | 用户名             | 输入待连接的Git仓库的用户名，不超过300个字符。                             |
   | 密码或Access Token | 输入待连接的Git仓库的密码，不超过300个字符。                              |
      
   
   
 
 #### 创建通用Git代码检查任务并获取任务ID
1. 在导航栏选择"代码 \> 代码检查" 。
2. 单击"新建任务"，进入"新建任务"页面，参考[表3]配置参数。
   
    表3通用Git代码检查任务参数说明 
   | **参数**     | **说明**                                                                                         |
   |:---|:---|
   | 归属项目       | 任务所属项目。默认填写为[创建代码检查任务所属项目]中的项目名称"Scrum01"，无需手动填写。 |
   | 代码源        | 选择"通用Git"。                                                                                     |
   | 任务名称       | 代码检查任务名称，可自定义。例如：CheckTask01。                                                                  |
   | Endpoint实例 | 选择[新建通用Git服务扩展点]中创建的服务扩展点"Endpoint01"。         |
   | 仓库         | 保持默认即可。                                                                                        |
   | 分支         | 保持默认"master"即可。                                                                                |
   | 检查语言       | 选择需要检查的代码语言，选择"Java"。                                                                          |
      
   
   
3. 单击"新建任务"，完成检查任务的创建。
4. 在代码检查任务列表页，单击代码检查任务名称，在代码检查任务概览页面URL中即为任务ID。 
   图1代码检查任务ID   
   ![](https://support.huaweicloud.com/bestpractice-codecheck/zh-cn_image_0000002166938689.png "点击放大")
   
   
 
 #### 创建访问凭证AK和SK
1. 登录管理控制台。
2. 单击用户名，在下拉列表中单击"我的凭证"。
3. 单击"访问密钥"。
4. 单击"新增访问密钥"，弹出"新增访问密钥"页面。
5. 输入该访问密钥的描述信息。
6. 单击"确定"，下载访问密钥。 
   ![](https://support.huaweicloud.com/bestpractice-codecheck/public_sys-resources/note_3.0-zh-cn.png)
   为防止访问密钥泄露，建议您将其保存到安全的位置。
   
   
 
 #### 下载KooCLI工具并获取代码检查API的调用命令
1. 访问[华为云命令行工具服务KooCLI](https://support.huaweicloud.com/qs-hcli/hcli_02_003.html)文档页面。
2. 根据本地电脑的系统版本号下载对应版本的KooCLI工具。
3. 访问[代码检查API调试](https://console.huaweicloud.com/apiexplorer/#/openapi/CodeCheck/cli?api=RunTask)页面。
4. 选择实际使用的Region和填写[创建通用Git代码检查任务并获取任务ID]中查询到的任务ID，其中hcloud CodeCheck RunTask --cli-region="cn-north-4" --task_id="9fd08c41a9824a69afdb9aca17590e29"即为生成的调用命令。
   
   图2生成API调用命令   
   ![](https://support.huaweicloud.com/bestpractice-codecheck/zh-cn_image_0000002131647354.png "点击放大")
   
   
5. 参考[4]，依次获得查询任务执行状态（ShowProgressDetail）、查询缺陷概要（ShowTaskDetail）API的调用命令。
 
 #### 在Jenkins工具中调用代码检查API
1. 编写流水线脚本，代码示例如下。 
   ```
   pipeline {
       agent any
       stages {
   stage('代码检查') {
               steps {
   script {
   echo "设置AK/SK"
   def response = sh(
   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"
   '''
               }
           }
   }
   }
   ```
   
   
2. 执行流水线任务。
 
