使用Maven构建SonarCloud多模块项目

5

我第一次为SonarCloud构建X个模块的maven项目。因为sonar.projectKey值需要是唯一的,所以我将其设置为${project.groupId}:{$project.artifactId},以便每个模块生成一个键。随后运行CI,这是响应信息:

[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.7.0.1746:sonar (default-cli) on project ${project.groupId}:${project.artifactId}: Could not find a default branch to fall back on. -> [Help 1]

我怀疑这是因为我在“组织”中没有使用该密钥创建项目,但问题在于我有多个模块。实际上,我有 X 个模块。我是否仍应为每个我想要扫描的模块创建一个项目?难道sonarqube插件不能处理吗?

你能分享一下代码仓库吗?当我第一次在不同分支中推送代码(然后提PR)时,会出现这种情况。直接推送到主分支可以解决我的问题。你不需要指定 sonar.projectKey 它会直接从 maven 坐标的 groupId 和 artifactId 中获取。可以看看这个代码仓库 - Carlos Cavero
1
是的,我解决了我的问题,通过在Sonar Cloud上创建一个与我的Maven坐标相匹配的项目,而不是GitLab名称。这让我感到困惑。参考链接 https://gitlab.com/Dragas/eternal-witness 和 https://sonarcloud.io/code?id=lt.saltyjuice.dragas%3Aeternal-witness-bom。由于我的主要POM具有“lt.saltyjuice.dragas:eternal-witness-bom”坐标,所以我需要一个名为该名称的项目,而不是GitLab的“Eternal Witness”。 - Dragas
3个回答

10
对于那些在使用Maven多模块项目管理Java应用程序时,很难使sonarcloud.io与Github action配合工作的人。
我创建了一个Spring Maven多模块项目,并希望能够在特定的Github action中使用来自sonarcloud.io的sonar。
Github项目:https://github.com/MagicSoup/SpringJOOQ Sonar Cloud项目:https://sonarcloud.io/dashboard?id=MagicSoup_SpringJOOQ 你可以在这里找到我的Github action: https://github.com/MagicSoup/SpringJOOQ/blob/master/.github/workflows/maven-master.yml
sonar:
    name: Test - SonarCloud Scan
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: SonarCloud Scan
        run: mvn -B clean verify -Psonar -Dsonar.login=${{ secrets.SONAR_TOKEN }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

我的根pom.xml文件中有Sonar配置文件: https://github.com/MagicSoup/SpringJOOQ/blob/master/pom.xml

 <profile>
            <id>sonar</id>
            <properties>
                <sonar.host.url>https://sonarcloud.io</sonar.host.url>
                <sonar.organization>magicsoup</sonar.organization>
                <sonar.projectKey>MagicSoup_SpringJOOQ</sonar.projectKey>
                <sonar.moduleKey>${project.groupId}:${project.artifactId}</sonar.moduleKey>
            </properties>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.sonarsource.scanner.maven</groupId>
                        <artifactId>sonar-maven-plugin</artifactId>
                        <version>${sonar.version}</version>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sonar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

这里重要的信息是以下关键字:

  • <sonar.projectKey>MagicSoup_SpringJOOQ</sonar.projectKey>
  • <sonar.moduleKey>${project.groupId}:${project.artifactId}</sonar.moduleKey>
没有定义sonar.moduleKey,我在多个具有相同键的项目上都遇到了问题。
在sonarcloud.io https://sonarcloud.io/projects/create中创建项目时,使用分析github存储库会显示一条消息,提示您应该使用其他方式而不是自动方式,因为它对于Java应用程序无效。然后,您将选择提供“maven,gradle,…”的选项,并找到需要添加到maven pom.xml中的所有强制属性,包括您应该将其导出为github中的秘密令牌的sonar.login)。
您可以在此处创建您的秘密令牌:https://github.com/User/Project/settings/secrets 您需要进行身份验证并根据用户和项目进行更改。
关于这个主题的一篇很棒的文章:https://medium.com/faun/continuous-integration-of-java-project-with-github-actions-7a8a0e8246ef

你的回答比我的解释更完整。关于项目键,Sonar插件具有聚合目标,这意味着该目标仅在调用它的POM上运行,并且不会级联到子“模块”,但是有一个限制,即每个模块的项目键必须是唯一值。您是否介意链接Sonar Maven文档,提及模块键属性? - Dragas
1
这在官方文档中找不到。我在互联网上的一些主题中发现了这个问题,人们正在努力解决maven多模块和sonar集成的问题。像这样的主题:
  • https://groups.google.com/forum/#!topic/sonarqube/WR726lPeLXk
  • https://stackoverrun.com/fr/q/9884285#40217736
- MagicSoup
按照SonarCloud的文档,我遇到了这个问题。您的解决方案解决了我的问题,谢谢! - jaivalis
在撰写本文时,如果您关闭SonarCloud上的自动分析功能,您将获得一个非常详细的指南,具体取决于您的编程语言,以便您可以轻松地集成扫描。 - Catalin Pirvu

2

看起来我的问题与此无关,但是在SonarCloud中的gitlab导入器会创建一个与GitLab上项目名称匹配的键的项目。因此,您应该手动创建一个项目,并将其分配给{groupId}:{artifactId}名称以防止混淆。

错误消息出现是因为该键下没有项目,结果SonarCloud没有默认设置。


0
对于我来说,我需要进入我的项目的SonarCloud管理设置,然后进入分析方法并关闭SonarCloud自动分析,因为我已经通过CI运行了分析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接