JenKins结合cppcheck及cpplint

最近公司需要在Jenkins上安装cppcheck及cpplint进行代码风格及静态代码检测,这里记录下过程。

前提条件

  • 安装了Jenkins

步骤如下


第一步:安装cppcheck并配置环境

通过源码安装

下载地址: 
https://github.com/danmar/cppcheck/releases/ 
https://sourceforge.net/projects/cppcheck/files/cppcheck/1.77/

例如下载 1.77的版本

解压后,进入目录运行以下命令进行安装

sudo make SRCDIR=build CFGDIR=/usr/share/cppcheck/
sudo make install CFGDIR=/usr/share/cppcheck/

通过apt安装

sudo apt-get install cppcheck

验证

cppcheck --version

第二步:安装cpplint并调整

因为cpplint默认只支持C++语言的风格代码检测,所以要修改代码以支持c语言代码。

下载地址: https://github.com/google/styleguide

修改代码以支持c语言代码

下载完后进入cpplint目录,打开cpplint.py文件,将下面这行的代码

_valid_extensions = set(['cc', 'h', 'cpp', 'cu', 'cuh')
修改为
_valid_extensions = set(['cc', 'h', 'cpp', 'cu', 'cuh','c'])

新增代码以支持检测目录

因默认的代码只支持单个文件,所以要新增一个代码文件来支持检测目录 
在cpplint.py文件的同目录下,新增一个文件cpplintdir.py,内容如下

#!/usr/bin/env python
import os
import fnmatch
import sys
def all_files(root,patterns = '*', single_level = False, yield_folders=False):
patterns = patterns.split(';')
for path, subdirs, files in os.walk(root):
if yield_folders:
files.extend(subdirs)
files.sort()
for name in files:
for pattern in patterns:
if fnmatch.fnmatch(name, pattern):
yield os.path.join(path,name)
break
if single_level:
break if __name__ == '__main__':
if len(sys.argv) < 2:
print 'Please set the absolute path as the first parameter for parse.'
sys.exit()
for path in all_files(sys.argv[1],'*.cpp;*.h;*.c'): os.system("python cpplint.py %s"%(path))

增加文件执行权限

sudo chmod +x cpplint.py
sudo chmod +x cpplintdir.py

第三步:Jenkins安装cppcheck及Warnings Plug-in插件

因为JenKins目前没有cpplint的插件,所以通过Warnings Plug-In来搜集cpplint的报告。

安装cppcheck及Warnings Plug-in插件

进入Jenkins的系统管理>插件管理>可选插件

cppcheck安装过程如下图所示,Warnings Plug-in的过程是一样的 

第四步:Jenkins配置Jobs

添加以下命令

cd /var/lib/jenkins/jobs/styleguide/cpplint
python goodixlint.py /var/lib/jenkins/jobs/TestProjectSrc/workspace 2>&1 | tee cpplint-style.xml cp cpplint-style.xml /var/lib/jenkins/jobs/TestProjectSrc/workspace/cpplint-style.xml
cd /var/lib/jenkins/jobs/TestProjectSrc/workspace
mkdir static_analysis
cppcheck 4 --enable=all --inconclusive --xml --xml-version=2 -q ./src 2>static_analysis/src-cppcheck.xml
exit
cd /var/lib/jenkins/jobs/TestProjectSrc/workspace
pwd

例子:

JenKins结合cppcheck及cpplint进行代码风格及静态代码检测的更多相关文章

  1. 10、代码块、构造代码块、静态代码块及main方法之间的关系

    1.普通代码块: 在方法或语句中出现在{}之间的类容就称为普通代码块,简称代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”,即顺序执行. /*下面第一个类时合法的 ...

  2. 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例

    Java中普通代码块,构造代码块,静态代码块区别及代码示例.Java中普通代码块,构造代码块,静态代码块区别及代码示例 执行顺序:静态代码块>静态方法(main方法)>构造代码块>构 ...

  3. Java:构造代码块,静态代码块

    本文内容: 局部代码块 构造代码块 静态代码块 补充 首发日期:2018-03-28 局部代码块: 局部代码块用于限制变量的生命周期,如果希望某些变量在某一过程之后直接失效而不希望被后面继续操作时,可 ...

  4. java-代码块-局部代码块、构造代码块、静态代码块

    1.代码块概述: 在Java中,使用{ }括起来的代码被称为代码块. 2.代码块分类: 根据其位置和声明的不同,可以分为局部代码块,构造代码块.静态代码块和同步代码块(多线程). 3.常见代码块的应用 ...

  5. java 代码块,静态代码块,构造器等的执行顺序

    写了一段测试代码,如下: public class ExecutionSequence extends fatherClass{    static{        System.out.printl ...

  6. Java 代码块:静态代码块、构造代码块、构造函数块

    Class : StaticFa package edu.bai.du.lime.staticCode; public class StaticFa { // 随着类的声明而执行 static { S ...

  7. Java非静态代码块和静态代码块

    类中存在两种特殊的代码块,即非静态代码块和静态代码块,前者是直接由 { } 括起来的代码,而后者是由 static{ } 括起来的代码. 非静态代码块在类初始化创建实例时,将会被提取到类的构造器中执行 ...

  8. 牛客网Java刷题知识点之代码块(局部代码快、构造代码块、静态代码块)

    不多说,直接上干货! 代码块包括局部代码快.构造代码块.静态代码块. 代码块,就是一段独立的代码空间. 1.局部代码快 对局部变量的生命周期进行控制. 2.构造代码块 对所有对象进行初始化. 3.静态 ...

  9. 2.java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

    1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名. ...

随机推荐

  1. Neo4j:图数据库GraphDB(四)Python中的操作

    本文总结下Python中如何操作Neo4j数据库,用到py2neo包,Pip install 一下. 1 连接neo4j数据库:跟其它数据库一样,操作前必须输入用户名和密码及地址连接一下. from ...

  2. margin与padding的区别与用法—以及出现bug的解决方法

    margin(外边距) padding(内边距)   一.语法结构 (1)margin-left:10px; 左外边距 (2)margin-right:10px; 右外边距 (3)margin-top ...

  3. [Luogu2323] [HNOI2006]公路修建问题

    题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 输入输出样例 输入样例#1: 复制 4 2 5 1 2 6 5 1 3 3 1 2 3 9 4 2 4 6 1 输出 ...

  4. ‎Cocos2d-x 学习笔记(19) Control Invocation

    [Cocos2d-x 学习笔记 目录链接] 1. 简介 control为其子类提供了touch回调函数,当子类触发EventType相关事件时,会调用相关的回调函数. control对象接收到的事件类 ...

  5. 【Spring Cloud】服务注册与发现组件——Eureka(二)

    一.Eureka原理 1.架构图 首先来看eureka的官方结构图 所有应用作为Eureka Client和Eureka Server交互,服务提供者启动时向Eureka Server注册自己的IP. ...

  6. 解决Zend OPcache huge_code_pages: mmap(HUGETLB) failed: Cannot allocate memory报错

    前几日看到鸟哥介绍的 <让你的PHP7更快之Hugepage>, 于是想试试手给服务器加上,参照格式安装好扩展,调整好配置文件,然后重启php-fpm,结果启动一直报Zend OPcach ...

  7. [洛谷P2425]小红帽的回文数

    原题传送门 这道题需要枚举.如果直接枚举会$TLE$. 考虑进制的转换:对于$> x$的进制下,一定是回文数 回文长度$2$位:设每一位为$i$,进制为$x$,则该数为$i*x+i$.反之,如果 ...

  8. webpack知识分享

    webpack 4 webpack 四大核心概念: 入口(entry) // 打包入口 输出(output) : 打包后输出的位置配置 loader  : loader 让 webpack 能够去处理 ...

  9. 新的服务器安装的mysql使用navcat连接不上

    首先出现问题 然后在防火墙添加3306端口 /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT 又出现了问题 ERROR 1130: Host ...

  10. 配置Docker镜像加速

    1.在docker toolbox执行下面的命令进入VM bash docker-machine ssh default 2.执行下面的命令修改profile文件: sudo vi /var/lib/ ...