- 最新动态
- 功能总览
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
- 最佳实践
- API参考
-
常见问题
-
技术类问题
- 执行代码检查任务时提示:任务正在执行,稍后重试
- 执行代码检查任务时提示:权限不足,请核对后再试
- 执行代码检查任务时提示:单个任务并发数超过套餐限制,任务无法下发
- 执行代码检查任务时提示:Cppcheck cannot tokenize the code correctly
- 执行代码检查任务时提示:no such file or directory
- 执行代码检查任务时提示:在Maven仓库中找不到依赖
- 执行代码检查任务时提示:调用CodeArts Repo失败,未授权
- 执行代码检查任务时提示:CC.00070400.500
- 单击任务名称时提示权限不足
- C#前端使用WPF组件的项目检查失败
- 任务执行完成后没有数据
- TypeScript任务检查失败,日志显示404
- API类问题
-
技术类问题
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
使用Jenkins插件集成CodeArts Check执行代码检查
应用场景
Jenkins是一款由Java编写的开源的持续集成工具,它运行在Servlet容器中(例如Apache Tomcat),可以通过各种方式触发构建。例如提交给版本控制系统时被触发、通过类似Cron的机制调度、或在其他的构建已经完成时通过一个特定的URL进行请求。
利用Jenkins工具现有能力,实现代码检查服务的快速集成,包含执行检查、状态查询、报告输出等基本扫描流程。用户可根据基础方案进行自定义开发。
本文介绍如何通过Jenkins工具及CodeArtsCheck API,实现代码检查服务集成与调度。本示例将以通用Git为例,进行方案介绍。
约束限制
- 代码源为非同一CodeArts项目下的Repo仓时需使用扩展点进行代码源接入。
- 每个通用Git扩展点仅能对接单个代码仓地址。
- 1个CodeArts项目下的扩展点数量限制为1000。
- 实行本实践需了解Jenkins工具的使用与基础开发。
前提准备
操作流程
流程 |
说明 |
---|---|
为本实践新建项目。 |
|
实践检查第三方代码仓的代码质量,代码检查服务需通过CodeArts提供的扩展插件连接到第三方代码仓。 |
|
创建代码检查任务并获取任务ID。 |
|
创建调用API时使用的AK和SK。 |
|
下载KooCLI工具并获取代码检查API的调用命令。 |
|
通过Jenkins工具调用代码检查API。 |
创建代码检查任务所属项目
- 使用华为云账号登录华为云控制台页面。
- 单击页面左上角,在服务列表中选择“开发与运维 > 软件开发生产线 CodeArts”。
- 单击“立即使用”,进入CodeArts服务首页。
- 在首页单击“新建项目”,选用“Scrum”项目模板。项目名称填写“Scrum01”,其他参数保持默认即可。
- 单击“确定”后,进入到“Scrum01”项目下。
新建通用Git服务扩展点
服务扩展点(Endpoint)是软件开发生产线的一种扩展插件,为软件开发生产线提供链接第三方代码仓的能力。
代码检查服务默认检查CodeArts Repo服务的代码质量,同时也可使用服务扩展点连接第三方代码仓库检查代码质量。
- 在项目下的CodeArts Check服务页面的导航栏选择“设置 > 通用设置 > 服务扩展点管理”。
- 单击“新建服务扩展点”,在下拉列表中选择“通用Git”。
- 在弹框中配置以下信息,单击“确定”。
表2 新建通用Git服务扩展点 参数
说明
连接名称
自定义,支持中文、英文、数字、“-”、“_”、“.”、空格,不超过256个字符。例如:Endpoint01。
Git仓库Url
输入待连接的Git仓库的https地址。
用户名
输入待连接的Git仓库的用户名,不超过300个字符。
密码或Access Token
输入待连接的Git仓库的密码,不超过300个字符。
创建通用Git代码检查任务并获取任务ID
- 在导航栏选择“代码 > 代码检查” 。
- 单击“新建任务”,进入“新建任务”页面,参考表3配置参数。
表3 通用Git代码检查任务参数说明 参数
说明
归属项目
任务所属项目。默认填写为创建代码检查任务所属项目中的项目名称“Scrum01”,无需手动填写。
代码源
选择“通用Git”。
任务名称
代码检查任务名称,可自定义。例如:CheckTask01。
Endpoint实例
选择新建通用Git服务扩展点中创建的服务扩展点“Endpoint01”。
仓库
保持默认即可。
分支
保持默认“master”即可。
检查语言
选择需要检查的代码语言,选择“Java”。
- 单击“新建任务”,完成检查任务的创建。
- 在代码检查任务列表页,单击代码检查任务名称,在代码检查任务概览页面URL中即为任务ID。
图1 代码检查任务ID
创建访问凭证AK和SK
- 登录管理控制台。
- 单击用户名,在下拉列表中单击“我的凭证”。
- 单击“访问密钥”。
- 单击“新增访问密钥”,弹出“新增访问密钥”页面。
- 输入该访问密钥的描述信息。
- 单击“确定”,下载访问密钥。
说明:
为防止访问密钥泄露,建议您将其保存到安全的位置。
下载KooCLI工具并获取代码检查API的调用命令
- 访问华为云命令行工具服务KooCLI文档页面。
- 根据本地电脑的系统版本号下载对应版本的KooCLI工具。
- 访问代码检查API调试页面。
- 选择实际使用的Region和填写创建通用Git代码检查任务并获取任务ID中查询到的任务ID,其中hcloud CodeCheck RunTask --cli-region="cn-north-4" --task_id="9fd08c41a9824a69afdb9aca17590e29"即为生成的调用命令。
图2 生成API调用命令
- 参考4,依次获得查询任务执行状态(ShowProgressDetail)、查询缺陷概要(ShowTaskDetail)API的调用命令。
在Jenkins工具中调用代码检查API
- 编写流水线脚本,代码示例如下。
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" ''' } } } }
- 执行流水线任务。