GitLab CI/CD中SonarQube分析与构建分离的实现方案咨询
问题描述
我正在为Java 8项目搭建GitLab CI/CD流水线,需加入SonarQube分析阶段,项目采用Maven构建。当前定义的作业如下:
sonarqube-check: stage: analyze image: maven:3.6.3-jdk-11 variables: # script: - mvn verify sonar:sonar -Dsonar.projectKey=myproject -Dsonar.java.source=1.8 allow_failure: true
但该作业执行失败,原因是所用SonarQube版本要求Java 11,而Java 8项目的相关依赖jar包并未默认包含。根据SonarSource社区线程的最后一条评论,sonar步骤依赖编译阶段,但可借助流水线前期阶段生成的构建产物,跳过构建直接执行SonarQube分析。现咨询:
- 能否在Maven命令中排除构建阶段?
- 能否实现构建与分析使用不同版本的Java?
解决方案
1. 可以在Maven命令中排除构建阶段
只要流水线前期已经完成项目构建并保留了编译产物(比如target/classes下的class文件),就能直接跳过构建环节,只执行SonarQube分析。具体操作:
执行mvn sonar:sonar时添加参数,跳过编译、测试等构建步骤:
mvn sonar:sonar -Dsonar.projectKey=myproject -Dsonar.java.source=1.8 -Dsonar.java.binaries=target/classes -Dmaven.main.skip=true -Dmaven.test.skip=true
-Dsonar.java.binaries=target/classes:指定SonarQube直接读取已有的编译产物,无需重新编译;-Dmaven.main.skip=true:跳过主代码编译;-Dmaven.test.skip=true:跳过测试代码编译与执行。
2. 完全可以实现构建与分析用不同版本的Java
这是GitLab CI多阶段流水线的典型用法,分两个阶段处理:
构建阶段(使用Java 8)
用Java 8的Maven镜像完成项目构建,同时将target目录保存为流水线artifact,供后续分析阶段调用:
build-with-java8: stage: build image: maven:3.6.3-jdk-8 script: - mvn clean verify -DskipTests artifacts: paths: - target/ expire_in: 1 day
分析阶段(使用Java 11)
依赖前面的构建阶段,下载保存的target artifact后,用Java 11的Maven镜像执行SonarQube分析,跳过构建步骤:
sonarqube-check-with-java11: stage: analyze image: maven:3.6.3-jdk-11 variables: SONAR_PROJECT_KEY: myproject script: - mvn sonar:sonar -Dsonar.projectKey=$SONAR_PROJECT_KEY -Dsonar.java.source=1.8 -Dsonar.java.binaries=target/classes -Dmaven.main.skip=true -Dmaven.test.skip=true allow_failure: true needs: - build-with-java8
这个配置通过needs让分析阶段依赖构建阶段,确保能获取最新编译产物,同时用不同Java版本完成对应任务,既满足SonarQube对Java 11的要求,又兼容Java 8项目的构建。
内容的提问来源于stack exchange,提问作者D. Walker
相关产品推荐
相关产品推荐

