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. webshell检测方法归纳

    背景 webshell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB ...

  2. 关于seaJs合并压缩(gulp-seajs-combine )路径与文件ID匹配问题。

    前段时间和有大家介绍过用 gulp-seajs-combine 来打包seaJs文件.大家会发现合并seaJs一个很奇怪的现象,那就是它的 ID和路径匹配原则.使得有些文件已经合并过去了,但还是会提示 ...

  3. Python开发【第四篇】语句与函数

    语句 statement 语句是由一些表达式组成,通常一条语句可以独立的执行来完成一部分事情,并且形成结果. 多条语句写在一行内要用分号分开 例子: print('hello world') #这是一 ...

  4. Libevent::evhttp服务器下载

    void http_handler_Get_Download(struct evhttp_request *req, void *arg) { if (req == NULL) { return; } ...

  5. moloch1.8.0简单操作手册

    moloch1.8.0简单操作手册 Sessions 页面:Sessions主要通过非常简单的查询语言来构建表达式追溯数据流量,以便分析. SPIView 页面: SPIGraph页面:SPIGrap ...

  6. API设计中防重放攻击

    HTTPS数据加密是否可以防止重放攻击? 否,加密可以有效防止明文数据被监听,但是却防止不了重放攻击. 防重放机制 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击.重放攻击是什么呢?就是把你 ...

  7. Python编程系列---Python中装饰器的几种形式及万能装饰器

    根据函数是否传参  是否有返回值 ,可以分析出装饰器的四种形式: 形式一:无参无返回值 def outer(func): def wrapper(): print("装饰器功能1" ...

  8. markdown数学公式大全

    目录 Cmd Markdown 公式指导手册 一.公式使用参考 1.如何插入公式 2.如何输入上下标 3.如何输入括号和分隔符 4.如何输入分数 5.如何输入开方 6.如何输入省略号 7.如何输入矢量 ...

  9. excel函数--笔记

    1: =DATE(MID(A1,1,4),MID(A1,5,2),MID(A1,7,2)) 字符串返回日期类型 2:  WEEKDAY(serial_number,return_type) ▪ ser ...

  10. 获取gps信息

    (一)plist修改 添加如下变量 (二)新建视图用来启动Gps 此视图控制器继承CLLocationManagerDelegate #import <UIKit/UIKit.h> #im ...