因此,我想在Pull Request阶段添加C/C++静态代码扫描的集成,但很多工具只要涉及到C/C++往往都是收费的。比如这里首选的SonarQube,Community版本不支持C/C++代码扫描。仅支持付费版本,例如Developer 和Enterprise。在静态扫码带来好处之前,盲目支付只会给产品带来更多成本,所以我们决定寻找其他开源工具来替代。
最终我选择了CPPCheck,原因如下:
这是少数可以与Jenkins 集成的C/C++ 开源静态代码扫描工具之一。结果报告可以在Jenkins中查看。支持Linux 上安装的Jenkins Pipeline
安装 Cppcheck
。
sudo yum install cppcheck.x86_64 其他平台安装请参考cppcheck官网
如果在Linux上无法一键安装,也可以通过下载源码的方式构建cppcheck。以下是从代码手动构建cppcheck 可执行文件的步骤
cd opt mkdir cppcheck cd cppcheck# 下载代码wget https://github.com/danmar/cppcheck/archive/1.90.tar.gz# 解压tar -xvf 1.90.tar.gz# make buildcd cppcheck-1.90mkdir buildcd buildcmake .cmake --build .# linksudo ln -s /opt/cppcheck/cppcheck-1.90/cppcheck /usr/bin/cppcheck# 检查是否安装成功which cppcheck /usr/bin/cppcheckcppcheck --versionCppcheck 1.90
使用 cppcheck 静态代码扫描
在与Jenkins集成之前,首先阅读了解如何使用此工具。通过查阅Cppcheck官方文档,一般用法如下:
# 比如扫描src下的public和themes目录下的代码,将结果输出到cppcheck.xmlcppcheck src/public src/themes --xml 2 cppcheck.xml
Cppcheck 与 Jenkins 集成
首先下载Cppcheck Jenkins插件并生成这通过管道语法代码publishCppcheck pattern:'cppcheck.xml'
但是在读取报表显示的xml文件时,遇到了两个问题:
问题1:分析cppcheck.xml 我在某些Linux 计算机上成功,但在其他计算机上失败。我怀疑这是由于JDK版本不同造成的。我还在Jenkins JIRA 中发现了JENKINS-60077 问题,但尚未有人解决。
我没有继续尝试解决问题1的主要原因是它对我来说有一个更致命的缺陷,那就是下面提到的问题。
问题2:无法通过Cppcheck Results报告直接查看代码。这样即使扫描到问题,仍然需要去git或者本地IDE去查看具体问题,大大降低了效率。
# 查看代码文件时出现错误Can't read file: Can't access the file: file:/disk1/agent/workspace/cppcheck-ud113/src/public/dummy/err_printf.c 并且官方票证也记录了该问题JENKINS -42613 和JENKINS-54209、JENKINS-42613 一直在等待合并。截至文章发表,仍无解决方案。
最后我发现Warnings Next Generation插件将会取代整个Jenkins静态分析套件,其中包括Android Lint、CheckStyle、Dry、FindBugs、PMD、Warnings、Static Analysis Utilities、Static Analysis Collector这些插件,最后通过Warnings Next Generation插件解决了这个问题。报告显示问题。
这里可以使用Pipeline Syntax生成读取报告代码recordIssues(tools:[codeAnalysis(pattern:'cppcheck.xml')])
有关使用警告下一代插件的更多信息,请参阅文档
最终 Pipeline 示例如下
pipeline{ agent { node { label 'cppcheck' customWorkspace '/agent/workspace/cppcheck' } }parameters { string(name: 'Branch', defaultValue: 'develop', description: '您想要执行哪个分支cppcheck?' ) } 选项{ 时间戳() buildDiscarder(logRotator(numToKeepStr:'50')) } 阶段('Checkout'){ 步骤{ checkout([$class: 'GitSCM',branches: [[name: '*/${Branch}']] , browser: [$class: 'BitbucketWeb',repoUrl: 'https://git.yourcompany.com/projects/repos/cppcheck-example/browse'],doGenerateSubmoduleConfigurations: false,extensions: [ [$class: 'LocalBranch',localBranch: '**'],[ $ class: 'CheckoutOption',timeout: 30],[$class: 'CloneOption',深度: 1,noTags: false,reference: '',shallow: true,timeout: 30]],submoduleCfg: [],userRemoteConfigs: [[credentialsId33 360'd1cbab74-823d-41aa- abb7 ', url: 'https://git.yourcompany.com/scm/cppcheck-example.git']]]) } } stage('Cppcheck'){ 步骤{ 脚本{ sh 'cppcheck src/public src/themes --xml 2 cppcheck 。 xml' } } } stage('Publish results'){ steps { recordIssues(tools: [cppCheck(pattern: 'cppcheck.xml')]) } }}
报告展示
当开发提交时,我将CPPCheck 应用于每个Pull 请求添加新代码后,CPPCheck 会扫描该代码并与之前的历史记录进行比较。 CPPCheck执行成功并生成报告。这里会出现一个按钮,点击进入。
CPPCheck 报告门户
打开后会显示当前分支码的扫描结果。
CPPCheck 报告仪表板
CPPCheck有三个维度展示静态扫码结果:
严重性分布:分为三个级别:高、中、低。参考比较:会参考之前的数据进行比较。如果有新数据,则会显示“新建”。如果存在,则会显示出来。对于Outstanding,如果减少,会显示Fixed History(历史记录):随着代码的添加和修改,这里会显示一条历史记录趋势。注意:cppcheck相关的xml存储在Jenkins master上,只有当前的Jenkins Job是手动删除的,那么cppcheck xml就会被删除。
-sh-4.2$ ls -l cppcheck*-rw-r--r-- 1 jenkins jenkins 418591 二月27 05:54 cppcheck-blames.xml-rw-r--r-- 1 jenkins jenkins 219 二月27 05:54 cppcheck-fixed -issues.xml-rw-r--r-- 1 jenkins jenkins 142298 二月27 05:54 cppcheck-forensics.xml-rw-r--r-- 1 jenkins jenkins 219 二月27 05:54 cppcheck-new-issues.xml-rw -r--r-- 1 jenkins jenkins 488636 二月27 05:54 cppcheck-outstanding-issues.xmlCPPCheck 报告详细信息
标签:
用户评论
第一次用Cppcheck,感觉真的很好用,Jenkins集成之后,代码质量提升了不少,强烈推荐给其他开发者。
有5位网友表示赞同!
我之前用过的静态代码分析工具都不如Cppcheck,Jenkins集成后,代码审查流程顺畅多了。
有19位网友表示赞同!
用了Cppcheck和Jenkins结合的方式,发现很多潜在的问题,感觉这个组合真的很强大。
有15位网友表示赞同!
之前对静态代码分析不太重视,用了Cppcheck后,才发现它的重要性,Jenkins集成更方便。
有13位网友表示赞同!
Cppcheck配合Jenkins,简直是开发者的福音,代码质量提升明显,再也不用担心bug了。
有12位网友表示赞同!
我之前用的工具都比较贵,现在发现Cppcheck是免费的,还能和Jenkins结合,太棒了。
有12位网友表示赞同!
静态代码分析是每个项目都需要的,Cppcheck免费又好用的特点,让我毫不犹豫地推荐给了团队。
有19位网友表示赞同!
Jenkins集成Cppcheck后,开发效率提高了很多,代码质量也有了保证。
有19位网友表示赞同!
Cppcheck在Jenkins上的表现真的很出色,几乎找不出它的缺点。
有13位网友表示赞同!
作为一个C++开发者,我对Cppcheck和Jenkins的结合感到非常满意,推荐给所有同行。
有14位网友表示赞同!
免费工具确实很难找到这么好的,Cppcheck在Jenkins上的表现让我刮目相看。
有9位网友表示赞同!
我之前对C/C++代码分析工具不太了解,现在用了Cppcheck,发现它真的很实用。
有16位网友表示赞同!
Jenkins集成Cppcheck后,代码审查流程变得简单高效,再也不用担心遗漏bug了。
有9位网友表示赞同!
Cppcheck在Jenkins上的表现让我重新认识了免费工具的价值,太惊喜了。
有20位网友表示赞同!
作为一个新手,我觉得Cppcheck很容易上手,Jenkins集成也很方便,推荐给大家。
有13位网友表示赞同!
用了Cppcheck和Jenkins结合的方式,发现了很多潜在的问题,感谢这个强大的组合。
有7位网友表示赞同!
Cppcheck在Jenkins上的表现让我对静态代码分析有了新的认识,强烈推荐。
有10位网友表示赞同!
作为一个老开发者,我觉得Cppcheck是近年来发现的最实用的代码分析工具之一。
有18位网友表示赞同!
Jenkins集成Cppcheck后,代码质量有了质的飞跃,感谢这个免费的好工具。
有20位网友表示赞同!
Cppcheck和Jenkins的结合,让我对免费工具有了全新的看法,太实用了。
有9位网友表示赞同!