三.持续代码质量检测
SonarQube是一个代码质量管理工 具,能对20多种编程语言源码进行代码味道( Code Smells)、Bug、 安全漏洞方面的静态分析。SonarQube有4个版本:开源版、开发者版、企业版、数据中心版( Data Center Edition)。
详细的区别,可前往官方网站进行了解,本篇使用的是开源版6.7.5LTS,假设读者已经安装此版本。
Maven与SonarQube集成
为方便起见,我们就不自己写例子了而是直接使用JUnit 4源码来做示例。将JUnit 4从GitHub克隆下来后,在pom.xml中加入SonarQube插件依赖。
<build>
-
<plugins>
-
<plugin>
-
<groupId>org . codehaus . mojo</ groupId>
-
<artifactId>sonar-maven-plugin</artifactId>
-
<version>3.4.1.1168<
/version>
-
</plugin>
-
</plugins>
</build>
执行命令:
mvn clean org.sonarsource.scanner.maven
3.4.1.1168:sonar -Dsonar.host.url=http://127.0.0.1:9000
sonar.host.url参数用于指定SonarQube服务的地址。这时,就可以在SonarQube的”Projects” 中看到JUnit 4的分析结果,可以看到JUnit 4有11个Bug。
SonarQube服务默认允许任何人执行源码分析,因此在生产环境中使用会有安全隐患,以下几步可以提高其安全性: 1.设置SonarQube禁此非登录用户使用
2.为用户生成Token,Jenkins只能通过Token与SonarQube集成。登陆SonarQube,进入个人设置页面中的Security tab页
3.在执行mvn命令时加入相应的sonar.login参数
mvn clean package org.sonarsource.scanner.maven:sonar-maven- plugin:3.4.1.1168:sonar -Dsonar.host.url=http://192.168.1.8:9000 -Dsonar.login=e2f92b48d047be825fe3c2c06dec818788855a3e
Jenkins与SonarQube集成
将Maven与SonarQube集成,这时SonarQube对于Jenkins来说还是透明的,Jenkins并不知道代码质量如何。将集成Jenkins与SonarQube ,以实现当代码质量不合格时, Jenkins pipeline失败。
具体步骤如下: 1.Jenkins安装SonarQube Scanner插件
2.Jenkins配置SonarQube Scanner插件
3.SonarQube设置Webhooks,不同代码规模的源码,分析过程的耗时是不一样的。所以当分析完成时,由SonarQube主动通知Jenkins。设置方法就是进入SonarQube的Adminstration -》Configuration -》 Webhooks页 ,加入http://jenkins地址/sonarqube-webhook 这个接口地址由SonarQube插件提供
4.在Jenkinsfile中加入SonarQube的stage
pipeline {
angent any
tools {
maven ' mvn- -3.5.4
}
stages {
stage( 'Code
Analysis') {
steps {
withSonarQubeEnv(' sonarqube') {
sh """
mvn clean package org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.1.1168:sonar
-Dsonar.host.url=${SONAR_ HOST_ URL}
-Dsonar.login=${ SONAR_ AUTH_ TOKEN}
"""
}
}
}
stage("Quality Gate" ) {
steps {
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
}
}
}
withSonarQubeEnv是一个环境变量包装器,读取的是我们所配置的变量。在它的闭包内,我们可以使用以下变量。
- SONAR_HOST_URL : SonarQube服务的地址
- SONAR_AUTH_TOKEN : SonarQube认证所需要的Token
waitForQualityGate步骤告诉Jenkins等待SonarQube返回的分析结果。当它的abortPipeline参数为true时,代表当质量不合格,将pipeline的状态设置为UNSTABLE。
我们同时使用了timeout包装器来设置waitForQualityGate步骤的超时时间,避免当网络出问题时, Jenkins任务-直处于等待状态。
5.设置Quality Gates(质量阈值)。 在SonarQube的”Quality Gates”下,我们可以看到系统自带的质量阈值,如图所示。可以看出它是针对新代码的。所以,在初次及没有新代码加入的情况下,执行代码分析是不会报出构建失败的。