Jenkins是一款由Java编写的开源的持续集成工具,它运行在Servlet容器中(例如Apache Tomcat),可以通过各种方式触发构建。例如提交给版本控制系统时被触发、通过类似Cron的机制调度、或在其他的构建已经完成时通过一个特定的URL进行请求。
利用Jenkins工具现有能力,实现代码检查服务的快速集成,包含执行检查、状态查询、报告输出等基本扫描流程。用户可根据基础方案进行自定义开发。
本文介绍如何通过Jenkins工具及CodeArtsCheck API,实现代码检查服务集成与调度。本示例将以通用Git为例,进行方案介绍。
代码源为非同一CodeArts项目下的Repo仓时需使用扩展点进行代码源接入。
每个通用Git扩展点仅能对接单个代码仓地址。
1个CodeArts项目下的扩展点数量限制为1000。
实行本实践需了解Jenkins工具的使用与基础开发。
已
开通并授权使用代码检查服务
。
表1
操作流程
使用华为云账号
登录华为云控制台页面
。
单击页面左上角
,在服务列表中选择
。
单击
“立即使用”
,进入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"
执行流水线任务。