首页 > 解决方案 > 使用 SonarScanner 在 Google Cloud Build 上构建 Maven 依赖项项目

问题描述

我会尽量保持描述简短。我们有几个项目。其中一些是成熟的 Spring Boot 应用程序,其中一些是 Maven 依赖项项目(用于那些 Spring Boot 应用程序)。我已经建立了一个用于自动化管道的 Jenkins 服务器。Jenkins 调用 Google Cloud Build 来构建项目/docker 镜像和缓存依赖项。它还一步调用 SonarQube。这一切都适用于 Spring Boot 应用程序,但 SonarQube 步骤对于依赖项项目失败。错误是Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.7.0.1746:sonar (default-cli) on project projectname: Not inside a Git work tree: / -> [Help 1]

项目的 Dockerfile:

FROM maven:3.5-jdk-8-alpine

# Copy local code to the container image.
COPY pom.xml settings.xml ./

RUN mvn -s settings.xml dependency:go-offline

COPY src ./src

# Build a release artifact.
RUN mvn verify -DskipTests -s settings.xml

cloudbuild.yaml:

substitutions:
  _IMAGE_NAME: "projectname"
steps:
  - name: "docker"
    entrypoint: "sh"
    args:
      - "-c"
      - |-
        docker pull gcr.io/gcp-project/${_IMAGE_NAME}:$_TAG
        docker pull gcr.io/gcp-project/${_IMAGE_NAME}:latest || true

  - name: "docker"
    args:
      - "build"
      - "-t"
      - "gcr.io/gcp-project/${_IMAGE_NAME}"
      - "-t"
      - "gcr.io/gcp-project/${_IMAGE_NAME}:$_TAG"
      - "--cache-from"
      - "gcr.io/gcp-project/${_IMAGE_NAME}:latest"
      - "--cache-from"
      - "gcr.io/gcp-project/${_IMAGE_NAME}:$_TAG"
      - "."

  - name: "gcr.io/gcp-project/${_IMAGE_NAME}"
    entrypoint: "bash"
    args:
      - "-ce"
      - |-
        mvn -f /pom.xml -s ./settings.xml sonar:sonar -Dsonar.host.url=https://sonar.server.com -Dsonar.login=${_SONAR_KEY}

  - name: "gcr.io/gcp-project/${_IMAGE_NAME}"
    args:
      - "mvn"
      - "deploy"
      - "-s"
      - "/settings.xml"

images: ["gcr.io/gcp-project/${_IMAGE_NAME}"]

有两件非常令人困惑的事情。如果我在本地运行 maven 命令,则分析成功完成。此外,如果我运行本地 Google Cloud Build 工具 ( cloud-build-local),它也会通过。我已验证该.git文件夹未上传。Spring Boot 应用程序都不是。我从本地 Jenkins 服务器复制settings.xml并使用了那个。Spring Boot 应用程序或依赖项都没有定义sonar-project.properties.

有没有人可以对此有所了解?提前致谢!

编辑

我创建了 2 个能够复制此问题的存储库:

非工作:https ://github.com/claystation/mvnsonarapp

工作:https ://github.com/claystation/mvnsonarappworking

我认为主要区别是依赖项目没有@SpringBootApplication

标签: mavensonarqubegoogle-cloud-build

解决方案


好的,所以我终于弄清楚了如何通过执行 MCVE 来解决这个问题。不幸的是,这不是为什么存在问题。

项目之间的主要区别在于@SpringBootApplication注释。我认为这可能与spring-boot-starter-parent定义父级有关。

我删除了父部分,现在我的项目正在通过声纳。如果有人可以解释为什么 Sonar 在定义父级但没有@SpringBootApplication注释的情况下给出此错误,那将非常有帮助。

谢谢!


推荐阅读