Jenkins与SonarQube
参考文档
Jenkins + SonarQube 工作流
- Jenkins pipeline启动;
- SonarQube Scanner分析代码,并将报告发送至SonarQube Server;
- SonarQube Server分析代码检测的结果是否符合预定义的质量阈;
- SonarQube Server将通过(passed)或者失败(failed)的结果发送回Jenkins上的SonarQube Scanner插件暴露的Webhook;
- 质量域相关的阶段成功通过或可选地失败时,则Jenkins pipeline续费后面的Stage;否则,pipeline将终止;
配置 Jenkins 使用 SonarQube
- 实现配置 Jenkins 使用 sonar-scanner 进行代码质量扫描, 并将结果报告给 SonarQube Server
流程概述
- 在Jenkins上安装SonarQube插件
- 在SonarQube上生成令牌
- 配置Jenkins对接到SonarQube Server
- 配置Jenkins的全局工具sonar-scanner
- 在SonarQube上添加回调Jenkins的Webhook
- 在Jenkins项目上调用sonar-scanner进行代码质量扫描
- 通过SonarQube确认扫描结果的评估;
在 SonarQube 上生成令牌
在SonarQube上以相应的用户生成令牌,该令牌将被 Jenkins 用于通过相应的 URL 打开 SonarQube
- SonarQube Web UI –> 配置 –> 权限 –> 用户 –> 令牌 –> 更新令牌 –> 填写名称后生成令牌
- 假设设置的令牌名称为:jenkins
- 对应的令牌为:255faa25ad464db26c20cdba87710d35a04ae716
Jenkins 相关配置
- 配置 Jenkins 对接到 SonarQube Server
安装 SonarQube 插件
Jenkins 借助于 SonarQube Scanner 插件 将 SonarQube 提供的 代码质量检查能力集成到 pipeline上,从而确保质量阈检查失败时,能够避免继续进行后续的操作,例如发布等。
- 安装 SonarQube Scanner 插件
将 SonarQube 令牌存储为凭证
- Jenkins Dashboard –> 系统管理 –> Manage Credentials –> 添加新的全局凭据
- **类型:**Secret text
- **范围:**全局
- Secret: 贴入 sonarqube 中生成的令牌
- **ID:**例如:sonarqube-admin-user-token
添加SonarQube Server
- Jenkins Dashboard –> 系统管理 –> 系统配置 –> SonarQube Servers
- Environment variables √
- **Name:**例如:sonarqube-server
- **Server URL:**例如:http://10.0.0.103:9000/
- **Server authentication token:**选择创建的凭据,sonarqube-admin-user-token
添加全局工具 sonar-scanner
以便在构建任务中调用
- Jenkins Dashboard –> 系统管理 –> 全局工具配置 –> SonarQube Scanner
- **Name:**例如:sonarqube-scanner
- 工具如果事先已经在Jenkins所处的主机安装了 则可以直接指定
SONAR_RUNNER_HOME;也可以使用其他自动安装方式
在 SonarQube 添加 Jenkins 的回调接口
在 SonarQube 上添加回调 Jenkins 的 Webhook,以实现将代码检测的结果(成功或失败)发送给Jenkins
- SonarQube Web UI –> 配置 –> 网络调用 –> 创建
- **名称:**例如:jenkins
- **URL:**例如:http://jenkins.xiangzheng.com:8080/sonarqube-webhook/
- /sonarqube-webhook 是由 Jenkins 的 SonarQube Scanner 插件的回调接口固定使用的PATH;
- **密码:**可以使用
openssl rand -hex 20等命令生成随机密码而后贴入其中- 密码可自行生成通信时的签名密钥,以防止中间人攻击;
pipeline
- 在 Jenkins 项目上调用 sonar-scanner 进行代码质量扫描,而后通过 SonarQube 确认扫描结果的评估
pipeline {
agent any
tools {
maven 'maven-3.8.6'
}
stages {
stage('Pull Source Code') {
steps {
git branch: 'main', url: 'git@github.com:JamesAzheng/spring-boot-helloWorld.git'
}
}
stage("Build") {
steps {
sh 'mvn clean package'
}
}
stage("SonarQube analysis") {
steps {
withSonarQubeEnv('sonarqube-server') { // 需与jenkins系统配置中的名称保存一致
sh 'mvn sonar:sonar' // mvn可使用"sonar:sonar"这一target直接调用SonarQube进行代码质量分析
}
}
}
stage("Quality Gate") {
steps {
timeout(time: 5, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
}
}