静态代码分析是指在不允许程序的前提下,对源代码进行分析或检查,范围包括代码风格、可能出现的空指针、代码块大小、重复的代码等。
没有通过编译,静态代码分析就没有意义。所以在整个pipeline中,静态代码分析通常被安排在编译阶段之后。非编译型语言就另当别论了。
写代码时大括号该不该换行?对于这样的问题很容易引起争议,如果公司对代码定标准,那符合与否不可能找一个人总盯着,开发组着虽然管理代码合并,也不可能逐行去看检查是否符合标准。
代码检查规范的方案是使用构建工具或者代码分析器进行代码检查,不通过,pipeline就中止。
PMD(https://pmd.github.io)是一款可扩展的静态代码分析器,它不仅可以对代码风格进行检查,还可以检查设计、对线程、性能等方面的问题。 Maven的PMD插件,是我们能在Maven上使用PMD
1.在Maven项目的pom.xml中加入PMD插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.8</version>
<configuration>
<rulesets>
<ruleset>rulesets/java/ali-comment.xml</ruleset>
<ruleset>rulesets/java/ali-concurrent.xml</ruleset>
<ruleset>rulesets/java/ali-exception.xml</ruleset>
<ruleset>rulesets/java/ali-flowcontrol.xml</ruleset>
<ruleset>rulesets/java/ali-naming.xml</ruleset>
<ruleset>rulesets/java/ali-oop.xml</ruleset>
<ruleset>rulesets/java/ali-orm.xml</ruleset>
<ruleset>rulesets/java/ali-other.xml</ruleset>
<ruleset>rulesets/java/ali-set.xml</ruleset>
</rulesets>
<printFailingErrors>true</printFailingErrors>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.alibaba.p3c</groupId>
<artifactId>p3c-pmd</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
</plugin>
maven-pmd-plugin插件并不会自动使用p3c-pmd,需要在引入dependencies部分手动加入p3c-pmd依赖,然后在rulesets属性中引入p3c的规则。
2.安装Jenkins PMD插件,作用是将PMD报告呈现在任务详情页中。
3.在Jenkkinsfile中加入pmd步骤
pipeline {
agent any
tools {
maven 'mvn-3.5.4'
}
stages {
stage('pmd')
{
steps {
sh "mvn pmd:pmd"
}
}
}
post {
always {
pmd(canRunOnFailed: true, pattern:
'**/target/pmd.xml')
}
}
}
执行完成后,可以在任务详情页看到PMD报告的链接
单机链接进入报告页面,可以看到更详细的信息
目前每种语言基本都有自己的静态代码分析器,比如JAVA语言,除了PMD外,还有Check-style、FindBugs等。但是没有一款能“大统一”,实现对所有语言和场景的支持。
另外,同一种语言下的不同分析器,他们在功能上既有区别,又有重叠,读者需要根据自己团队的情况进行选择。但是不论选择哪款分析器,所有进行静态代码分析的地方都必须统一分析规则。比如我们决定使用阿里巴巴的开发规范,那Maven插件、IDE插件以及SonarQube都必须使用;否则,分析结果可能会不一致,进而影响分析结果的可信度。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。