有这样一个应用场景:
当开发提交 merge request 时,gitlab 会自动触发 jenkins 任务去跑 sonar 扫描,如果扫描状态成功则允许 merge,否则拒绝。
这里有几个点需要解决:
1、jenkins 要拿到 sonar 扫描的结果状态,并把结果反馈给 gitlab
2、gitlab 要能够根据 pipeline 反馈的状态来决定是否允许 merge
gitlab 通过 webhook 触发 jenkins 任务的配置略
设置 gitlab,只有 pipeline 成功才允许 merge
部署 sonar 略,直接看 webhook 配置
点击创建,url 填"jenkins 地址/sonarqube-webhook/"
jenkins 要安装插件 Sonar Quality Gates Plugin
这样 pipeline 中就可以获取 sonar 执行后的状态了
updateGitlabCommitStatus
用来更新状态到 gitlab,只有成功 gitlab 才会允许 merge 就实现了
stage ('静态扫描') {
steps {
updateGitlabCommitStatus name: 'build', state: 'running'
script {
withSonarQubeEnv('sonar') {
sh "mvn validate sonar:sonar -Dsonar.java.binaries=target/sonar"
}
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
updateGitlabCommitStatus name: 'build', state: 'failed'
}
if (qg.status == 'OK') {
echo "通过Sonarqube的代码质量检测"
updateGitlabCommitStatus name: 'build', state: 'success'
}
}
}
}
如果想拿到 sonar 扫描后生成的 url 发邮件,可以通过一个脚本实现
maven 配置 sonar,修改 settings.xml
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>maven-release</id> <username>devOps</username> <password>devOps20190717</password> </server> <server> <id>maven-snapshots</id> <username>devOps</usernam> <password>devOps20190717</password> </server> </servers> <pluginGroups> <pluginGroup>org.sonarsource.scanner.maven</pluginGroup> </pluginGroups> <profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.host.url> http://sonar.hhotel.com </sonar.host.url> </properties> </profile> <profile> <id>NexusRepo</id> <repositories> <repository> <id>nexus</id> <name>Nexus3 Repository</name> <url>http://172.19.151.229:8082/nexus/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles> <activeProfiles> <activeProfile>sonar</activeProfile> <activeProfile>NexusRepo</activeProfile> </activeProfiles> <mirrors> <mirror> <id>NexusRepo</id> <!-- *号代表所有仓库,此处也可以单独设置,以逗号隔开 --> <mirrorOf>*</mirrorOf> <name>NexusRepo</name> <url>http://172.19.151.229:8082/nexus/repository/maven-public/</url> </mirror> </mirrors> </settings>
这样就可以通过 mvn 命令执行 sonar 扫描了
mvn sonar:sonar
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于