最近公司需要在Jenkins上安装cppcheck及cpplint进行代码风格及静态代码检测,这里记录下过程。
前提条件
步骤如下
下载地址:
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/
sudo apt-get install cppcheck
cppcheck --version
因为cpplint默认只支持C++语言的风格代码检测,所以要修改代码以支持c语言代码。
下载地址: https://github.com/google/styleguide
下载完后进入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目前没有cpplint的插件,所以通过Warnings Plug-In来搜集cpplint的报告。
进入Jenkins的系统管理>插件管理>可选插件
cppcheck安装过程如下图所示,Warnings Plug-in的过程是一样的
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 0
cd /var/lib/jenkins/jobs/TestProjectSrc/workspace
pwd