关于C++静态代码扫描工具及基于jenkins流水线搭建vs报告分析工具开发的小总结

news2024/11/25 12:34:35

静态代码扫描)

  • 主要内容:
  • Tscancode 报告解析插件使用
    • 1.Tscancode linux使用命令介绍
    • 2.插件jar包
    • 3.tscancode扫描生成的文件
    • 4.解析报告插件执行方式与参数说明
    • 5.解析后生成报告样式
  • CPPCHECK报告解析
    • 1.cppcheck 代码扫描linux命令
    • 2.解析报告插件使用
  • 报告解析插件代码
  • Jenkins 构建

主要内容:

1.tscancode插件使用
2.cppcheck插件使用
3.解析两个插件报告文件为html的代码编写
4.jenkins流水线搭建

Tscancode 报告解析插件使用

1.Tscancode linux使用命令介绍

常用使用命令
–xml 将xml格式的结果写入错误流
-q, --quiet 不显示进度报告。
-h, --help 打印帮助信息
执行文件 从github下载最新代码包 下载地址https://github.com/Tencent/TscanCode,如下为下好的代码
暂时无法在飞书文档外展示此内容
Tscancode 扫描示例代码C++代码路径为 \tscancode-master\samples
可执行文件 /tscancode/tscancode-master/release/linux/TscanCodeV2.14.2395.linux/tscancode

#生成分析报告并导出到result.xml 命令

./tscancode /home/soft/tscancode/tscancode-master --xml 2> result.xml

2.插件jar包

code-scan-util.jar 见附件

3.tscancode扫描生成的文件

见附件

4.解析报告插件执行方式与参数说明

目前 code-scan-util.jar 三个必输参数
–stage :执行目标,目前只有两个选项
tscanreport 解析tscancode的报告
cppreport 解析cppcheck的报告
–basePath: 要解析的日志文件名全路径
–savePath: 解析后报告的存放路径(仅路径,名称默认为report or cppreport)

示例命令

java -jar code-scan-util.jar --stage=tscanreport --basePath=/home/soft/tscancode/tscancode-master/release/linux/TscanCodeV2.14.2395.linux/result.xml --savePath=./

5.解析后生成报告样式

report .html
在这里插入图片描述

下载用浏览器打开

CPPCHECK报告解析

1.cppcheck 代码扫描linux命令

cppcheck -q /home/soft/tscancode/tscancode-master/samples/cpp --xml 2>result.xml --enable=all

2.解析报告插件使用

java -jar '/automation/scripts/code-scan-util.jar' --stage=cppreport --basePath='/automation/report/cppcheck/result.xml' --savePath='/automation/report/cppcheck/analyse'

解析后报告
cppReport.html
在这里插入图片描述

报告解析插件代码

https://gitee.com/burebaobao/demo-work-space

Jenkins 构建

jenkins 脚本

def CustomizeRepos = ''
def Baseline = 'false'
def VersionInfo=''
def testMessage=''
def Pr_CustomizeRepos = ""

pipeline {
    agent {
        label 'le-node'
    }
    parameters {
        string(name: 'BRANCHNAME', defaultValue: 'develop', description: '代码分支名称')
    }

    environment {
        JENKINS_NODE_COOKIE = 'dontKillMe'
		project_path = '/automation/code/'
		pipeline_git_tool = '/automation/scripts/build_gitclone.sh'
		url = 'https://gitee.com/burebaobao/tscancode-master.git'
		code_scan_util = '/automation/scripts/code-scan-util.jar'
		tscancode_path = '/home/soft/tscancode/tscancode-master/release/linux/TscanCodeV2.14.2395.linux'
		tscan_report = '/automation/report/tscancode/result.xml'
		savePath_tscan = '/automation/report/tscancode/analyse'

		cppcheck_report = '/automation/report/cppcheck/result.xml'
		savePath_cppcheck = '/automation/report/cppcheck/analyse'


    }

    stages {
        stage("任务参数检测") {
            steps {
                println "JobName: " + env.JOB_NAME
                println "BuildNumber: " + env.BUILD_NUMBER

                script {
                    echo "任务参数检测"
                }
            }
        }

        stage("清理测试环境") {
            steps {
                script {



                    echo "删除之前代码库代码"
					sh "cd ${project_path}"
					sh "rm -rf /automation/code/*"

                    echo "删除之前测试报告"
					sh "rm -rf /automation/report/tscancode/result.xml"
					sh "rm -rf /automation/report/tscancode/analyse/*"
					sh "rm -rf /automation/report/cppcheck/result.xml"
					sh "rm -rf /automation/report/cppcheck/analyse/*"
                }
            }
        }


        stage("下载平台代码") {
            steps {
                script {
                    echo "开始克隆代码"
					sh "cd ${project_path}"
					def git_clone="git clone -b ${BRANCHNAME} --single-branch https://gitee.com/burebaobao/tscancode-master.git"
					echo "${git_clone}"
					sh "${env.pipeline_git_tool} '${project_path}' '${BRANCHNAME}' '${url}'"
                }
            }
        }

        stage("tscancode扫描并解析报告") {
            steps {
                script {
                    echo "tscancode扫描...."
					sh "'${tscancode_path}'/tscancode '${project_path}'/tscancode-master --xml 2> '${tscan_report}'"

					echo "tscancode扫描报告解析...."
					sh "java -jar '${code_scan_util}' --stage=tscanreport --basePath='${tscan_report}' --savePath='${savePath_tscan}'"

                }
            }

			post {
                success{
                    script{
                        publishHTML(target: [
                            allowMissing: false,
                            alwaysLinkToLastBuild: true,
                            keepAll: true,
                            reportDir: "${env.savePath_tscan}",
                            reportFiles: 'report.html',
                            reportName: "TSCANCODE-Report"
                        ])

                    }
                }
            }
        }

		stage("cppcheck扫描并解析报告") {
            steps {
                script {
					echo "cppcheck扫描...."

					sh "cppcheck '${project_path}'/tscancode-master/samples --xml 2>'${cppcheck_report}' --enable=all"

					echo "cppcheck扫描报告解析...."
					sh "java -jar '${code_scan_util}' --stage=cppreport --basePath='${cppcheck_report}' --savePath='${savePath_cppcheck}'"
                }
            }

			post {
                success{
                    script{
                        publishHTML(target: [
                            allowMissing: false,
                            alwaysLinkToLastBuild: true,
                            keepAll: true,
                            reportDir: "${env.savePath_cppcheck}",
                            reportFiles: 'cppReport.html',
                            reportName: "CPPCHECK-Report"
                        ])

                    }
                }
            }
        }


    }
}

git操作的shell脚本

#!/bin/bash

#########################################
#代码clone脚本
#参数:
# path 代码存储路径
# branch 代码分支名
# url 地址
#########################################


#参数判断 
if [ $# != 3 ]; then
  echo "参数输入错误,输入必须包括path、Branch、url参数!"
  exit -1
fi


path=$1
branch=$2
url=$3

echo "开始"
echo "切换路径到 $path"
cd ${path}

echo "克隆的代码分支为 ${branch}"

mcd="git clone -b ${branch} --single-branch https://gitee.com/burebaobao/tscancode-master.git"
git clone -b ${branch} --single-branch ${url}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArduPilot开源飞控之Companion Computers简单分析

ArduPilot开源飞控之Companion Computers简单分析 1. 源由2. 伴机系统2.1 APSync2.2 DroneKit2.3 FlytOS2.4 Maverick2.5 ROS2.6 Rpanion-server 3. 总结4. 参考资料 1. 源由 从稳定性,社区群体,以及开源方式的角度看,Ardupilot是不错的选择…

【Vue】使用print.js插件实现打印预览功能,超简单

目录 一、实现效果 二、实现步骤 【1】安装插件 【2】在需要打印的页面导入 【3】在vue文件中需要打印的部分外层套一层div,给div设置id。作为打印的区域 【4】在打印按钮上添加打印事件 【5】在methods中添加点击事件 三、完整代码 一、实现效果 二、实现步…

647. 回文子串

目录 一、题目 二、代码 一、题目 二、代码 双指针&#xff01;&#xff01;&#xff01; class Solution { public:bool Palindrome(string s,int i,int j){int begini;int end j;while(begin<end){if(s[begin]!s[end]){return false;}begin;end--;}return true;}int …

IPWorks S3 Delphi Edition Crack

IPWorks S3 Delphi Edition Crack IPWorksS3使集成基于云的文件存储变得容易。易于使用的组件可用于与任何S3兼容的存储提供商集成&#xff0c;如Amazon S3、Digital Ocean Spaces、Wasabi、Backblaze B2、IBM Cloud Object storage、Oracle Cloud、Linode等。强大的客户端加密…

解决Vue+Element-UI 进行From表单校验时出现了英文提示问题

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 问题描述 在使用form表单时&#xff0c;往往会对表单字段进行校验&#xff0c;字段为必填项时会添加required属性&#xff0c;此时自定义rules规则…

vue中全局状态存储 pinia和vuex对比 pinia比vuex更香 Pinia数据持久化及数据加密

前言 毕竟尤大佬都推荐使用pinia&#xff0c;支持vue2和vue3&#xff01; 如果熟悉vuex&#xff0c;花个把小时把pinia看一下&#xff0c;就不想用vuex了 支持选项式api和组合式api写法pinia没有mutations&#xff0c;只有&#xff1a;state、getters、actionspinia分模块不…

20个程序员接单平台分享

这题我会&#xff01;接单软件那么多&#xff0c;找到适合自己的最重要&#xff01; V2EX https://www.v2ex.com/ 先给一个“非正常选项”&#xff0c;v2ex上有一个“酷工作”板块&#xff0c;运气好的话可以在这里找到不错的单子&#xff0c;最重要的是带你开启新世界的大门…

新型声学攻击通过键盘击键窃取数据,准确率高达 95%

来自英国大学的一组研究人员训练了一种深度学习模型&#xff0c;该模型可利用麦克风记录并分析键盘击键的声音&#xff0c;以此来窃取目标设备中的数据&#xff0c;准确率高达 95%。 不同于其他需要特殊条件并受到数据速率和距离限制的旁道攻击&#xff0c;由于现有大量场景都拥…

LeetCode:Hot100的python版本

94. 二叉树的中序遍历

Python爬虫的Selenium(学习于b站尚硅谷)

目录 一、Selenium  1.为什么要学习Selenium  &#xff08;1&#xff09;什么是Selenium  &#xff08;2&#xff09;为什么使用selenium?  &#xff08;3&#xff09;代码演示 2. selenium的基本使用  &#xff08;1&#xff09;如何安装selenium  &#xff08;2…

jmeter如何压测和存储

一、存储过程准备&#xff1a; 1、建立一个空表&#xff1a; 1 CREATE TABLE test_data ( id NUMBER, name VARCHAR2(50), age NUMBER ); 2、建立一个存储过程&#xff1a; 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE PROCEDURE insert_test_data (n IN NUMBER) AS BEGIN --E…

【工程优化问题】基于多种智能优化算法的压力容器设计问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux内核应该怎么去学习?

通过阅读源码来学习操作系统要注意区分共性与平台特性。 1. 中断响应是共性&#xff0c;8259 中断控制器和 IDT 是 x86 的特性。 2. 虚拟内存管理是共性&#xff0c;x86 的 GDT 和 LDT 是特性&#xff0c;而且现在的系统也只是走个过场而已。 3. 任务调度与上下文切换是共性&am…

44.实现爱尔兰B公式计算并输出表格(matlab程序)

1.简述 1.话务量定义 话务量指在一特定时间内呼叫次数与每次呼叫平均占用时间的乘积。 话务量反映了电话负荷的大小&#xff0c;与呼叫强度和呼叫保持时间有关。呼叫强度是单位时间内发生的呼叫次数&#xff0c;呼叫保持时间也就是占用时间。 话务量计算方法 话务量公式为…

智安网络|恶意软件在网络安全中的危害与应对策略

恶意软件是指一类具有恶意目的的软件程序&#xff0c;恶意软件是网络安全领域中的一个严重威胁&#xff0c;给个人用户、企业和整个网络生态带来巨大的危害。通过潜伏于合法软件、邮件附件、下载链接等途径传播&#xff0c;破坏用户计算机系统、窃取敏感信息、进行勒索等不法行…

C语言经典小游戏之扫雷(超详解释+源码)

“少年气&#xff0c;是历尽千帆举重若轻的沉淀&#xff0c;也是乐观淡然笑对生活的豁达&#xff01;” 今天我们学习一下扫雷游戏怎么用C语言来实现&#xff01; 扫雷小游戏 1.游戏介绍2.游戏准备3.游戏实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2打印棋盘3.3布置雷…

Linux root用户执行修改密码命令,提示 Permission denied

问题 linux系统中&#xff08;ubuntu20&#xff09;&#xff0c;root用户下执行passwd命令&#xff0c;提示 passwd: Permission denied &#xff0c;如下图&#xff1a; 排查 1.执行 ll /usr/bin/passwd &#xff0c;查看文件权限是否正确&#xff0c;正常情况是 -rwsr-xr…

VAE、 EM、KL散度

文章目录 VAEVAE额外的损失函数 EMKL散度 VAE 左图相当于变量x&#xff0c;右图相当于z 假如在AE中&#xff0c;一张满月的图片作为输入&#xff0c;模型得到的输出是一张满月的图片&#xff1b;一张弦月的图片作为输入&#xff0c;模型得到的是一张弦月的图片。当从满月的code…

SpringBoot复习:(22)ConfigurationProperties和@PropertySource配合使用及JSR303校验

一、配置类 package cn.edu.tju.config;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component;Component ConfigurationPropertie…

C++初阶——函数重载

前言&#xff1a;C中除了可以在不同的命名空间中使用同名函数&#xff0c;还有一种支持在同一个作用域中同名函数的方式——函数重载。 函数重载 一.什么是函数重载&#xff1f;二.函数重载的3种规则三.特殊情况 一.什么是函数重载&#xff1f; C允许同样同一作用域中声明几个功…