如何将单次Jenkins SonarQube扫描结果提交至两个不同服务器?
实现一次扫描提交至两个SonarQube实例的方案
嗨,这个需求完全可以实现,不用重复执行两次扫描浪费时间。结合你用的Maven+Jenkins+SonarQube的场景,我给你几个实用的解决方案:
方案一:复用Maven Sonar插件的分析结果(最适配你的场景)
因为你是Maven项目,Sonar的Maven插件支持复用已有的分析数据,只需要执行两次sonar:sonar目标,第二次跳过代码扫描直接提交结果到第二个实例:
第一步,在Jenkins的Post Step里先执行第一次扫描,提交到第一个Sonar实例:
mvn sonar:sonar -Dsonar.host.url=http://你的第一个Sonar实例地址 -Dsonar.login=你的第一个实例token(如果已经在Jenkins配置了Sonar实例,也可以用插件提供的
withSonarQubeEnv步骤自动注入参数,不用手动写URL和token)第二步,紧接着执行第二次提交,复用第一次的分析结果,提交到第二个实例:
mvn sonar:sonar -Dsonar.host.url=http://你的第二个Sonar实例地址 -Dsonar.login=你的第二个实例token -Dsonar.reuseExistingAnalysis=true关键参数
sonar.reuseExistingAnalysis=true会让插件跳过代码扫描,直接读取第一次扫描生成的.sonar目录下的分析数据,快速完成提交。
方案二:用SonarQube REST API二次提交
如果不想用Maven命令,也可以先完成一次完整扫描,再通过API把结果推送到第二个实例:
- 正常执行第一次Sonar扫描,确保生成了本地的分析报告(默认在
target/sonar或.sonar目录)。 - 添加一个「Execute shell」步骤,调用第二个Sonar实例的提交API,比如用curl:
注意:不同版本的SonarQube API可能略有差异,建议参考你使用的Sonar版本调整参数。curl -X POST -u 第二个实例的token: "http://第二个Sonar实例地址/api/ce/submit?projectKey=你的项目Key&projectName=你的项目名称" -F "report=@target/sonar/report-task.txt"
方案三:Jenkins Pipeline脚本(更灵活的流程控制)
如果你的任务是Pipeline类型,可以用脚本更优雅地实现:
pipeline { agent any stages { stage('Build Project') { steps { sh 'mvn clean package -DskipTests' } } stage('Sonar Scan & Dual Submit') { steps { // 第一次扫描提交到第一个Sonar实例 withSonarQubeEnv('First-Sonar-Instance') { sh 'mvn sonar:sonar' } // 复用分析结果提交到第二个Sonar实例 withSonarQubeEnv('Second-Sonar-Instance') { sh 'mvn sonar:sonar -Dsonar.reuseExistingAnalysis=true' } } } } }
这里的withSonarQubeEnv会自动加载你在Jenkins全局配置里定义的Sonar实例参数,不用手动写URL和token,非常方便。
注意事项
- 确认你的SonarQube和对应的Maven插件版本支持
sonar.reuseExistingAnalysis参数,旧版本可能需要用sonar.analysis.mode=publish替代。 - 两次提交的项目Key尽量保持一致,避免在Sonar实例中生成重复项目;如果需要区分,可以给第二个实例的项目Key加后缀。
- 确保第一次扫描生成的
.sonar或target/sonar目录在第二次提交前没有被清理(比如不要在两次命令之间执行mvn clean)。
内容的提问来源于stack exchange,提问作者Tim Pizey
相关产品推荐
相关产品推荐

