Дочерний модуль CCReport43F6D5EF не найден при использовании задачи конвейеров Azure Maven@4

Мы переходим с задачи Maven@3 на Maven@4 см. здесь. Это отлично работает для большинства репозиториев, за исключением репозитория с несколькими моделями. Это дает мне следующую ошибку:

[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] Child module /home/vsts/work/1/s/service/CCReport43F6D5EF of /home/vsts/work/1/s/service/pom.xml does not exist @ 
 @ 
[ERROR] The build could not read 1 project -> [Help 1]
org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[ERROR] Child module /home/vsts/work/1/s/service/CCReport43F6D5EF of /home/vsts/work/1/s/service/pom.xml does not exist @ 

    at org.apache.maven.project.DefaultProjectBuilder.build (DefaultProjectBuilder.java:397)
    at org.apache.maven.graph.DefaultGraphBuilder.collectProjects (DefaultGraphBuilder.java:414)
    at org.apache.maven.graph.DefaultGraphBuilder.getProjectsForMavenReactor (DefaultGraphBuilder.java:405)
    at org.apache.maven.graph.DefaultGraphBuilder.build (DefaultGraphBuilder.java:82)
    at org.apache.maven.DefaultMaven.buildGraph (DefaultMaven.java:535)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:220)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:963)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:296)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:199)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:569)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
[ERROR]   
[ERROR]   The project nl.XXX:service:1.0.0-SNAPSHOT (/home/vsts/work/1/s/service/pom.xml) has 1 error
[ERROR]     Child module /home/vsts/work/1/s/service/CCReport43F6D5EF of /home/vsts/work/1/s/service/pom.xml does not exist
[ERROR] 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException

##[warning]No code coverage found to publish. There might be a build failure resulting in no code coverage or there might be no tests.
##[error]Build failed

Моя задача в лазурных конвейерах выглядит так

    - task: Maven@4
      displayName: 'Maven Package'
      inputs:
        mavenPomFile: 'service/pom.xml'
        javaHomeOption: 'JDKVersion'
        jdkVersionOption: '1.17'
        jdkArchitectureOption: 'x64'
        codeCoverageToolOption: jaCoCo
        publishJUnitResults: true
        testResultsFiles: '**/surefire-reports/TEST-*.xml'
        goals: 'clean package'
        isJacocoCoverageReportXML: true
        sonarQubeRunAnalysis: true

Структура файла выглядит следующим образом:

project-root/
│
├── service/
│   ├── pom.xml
│   ├── service-impl/
│   │   └── pom.xml
│   └── service-model/
│       └── pom.xml
│
└── azure-pipelines.yml

Затем в файле service-impl pom.xml есть файл core-libraries/pom.xml, который содержит конфигурацию плагина jacoco для всех репозиториев. Это выглядит следующим образом:

            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>${jacoco-maven-plugin.version}</version>
                <configuration>
                    <excludes>**/*IT, **/CCReport43F6D5EF/</excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <phase>initialize</phase>
                    </execution>
                    <execution>
                        <id>report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <phase>prepare-package</phase>
                        <configuration>
                            <formats>
                                <format>XML</format>
                            </formats>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-unit-test</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <phase>test</phase>
                    </execution>
                </executions>
            </plugin>

Я заметил, что при переходе с Maven@3 на Maven@4 команда, которую выполняет конвейер, немного меняется.

От

/usr/bin/mvn -f /home/vsts/work/1/s/service/pom.xml clean package -Dsonar.jacoco.reportPaths=/home/vsts/work/1/s/service/CCReport43F6D5EF/jacoco.exec -Dsonar.coverage.jacoco.xmlReportPaths=/home/vsts/work/1/s/service/CCReport43F6D5EF/jacoco.xml org.sonarsource.scanner.maven:sonar-maven-plugin:RELEASE:sonar

К:

/usr/bin/mvn -f /home/vsts/work/1/s/service/pom.xml clean package org.sonarsource.scanner.maven:sonar-maven-plugin:RELEASE:sonar

Таким образом, reportPaths и xmlReportPaths удалены, что, по-видимому, и вызывает проблему. Добавление их обратно в задачу Maven с атрибутом options в конвейере Azure, похоже, не решило проблему. Обратите внимание, что в sonarcloud мы получаем это сообщение об ошибке, которое, похоже, связано:

Property 'sonar.jacoco.reportPaths' is no longer supported. Use JaCoCo's xml report and sonar-jacoco plugin.

Я много искал в Интернете, и проблема, похоже, возникала и для Maven@3, но у нас это продолжало работать. Теперь, когда мы перешли на Maven@4, он сломался. Что я на нем нашел:

Убедитесь, что вы указали #codeCoverageClassFilesDirectories и #codeCoverageSourceDirectories в качестве входных данных задачи. Эти два параметра не являются обязательными для проекта с одним модулем, но необходимы для проектов с несколькими модулями.

Мне неясно, что происходит и как это следует решить/обойти. Интересно, может у кого-нибудь есть идея? заранее спасибо


50
1

Ответ:

Решено

Мне удалось ответить на свои вопросы, используя этот обходной путь, упомянутый здесь.

  1. Я изменил покрытие JaCoCo на «Нет». Теперь это выглядит так:
    - task: Maven@4
      displayName: 'Maven Package with Code Coverage'
      inputs:
        mavenPomFile: 'service/pom.xml'  # Parent POM file
        javaHomeOption: 'JDKVersion'
        jdkVersionOption: '1.17'
        jdkArchitectureOption: 'x64'
        mavenVersionOption: 'Default'
        codeCoverageToolOption: 'None'
        sonarQubeRunAnalysis: true
  1. Я настроил плагин jacoco в родительском pom следующим образом:
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>${jacoco-maven-plugin.version}</version>
                <configuration>
                    <excludes>**/*IT</excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <phase>test</phase>
                        <configuration>
                            <formats>
                                <format>XML</format>
                            </formats>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-unit-test</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <phase>test</phase>
                    </execution>
                </executions>
            </plugin>
  1. Я добавил агрегатор-pom.xml на том же уровне, что и сервис. Это вдохновлено обходным решением в github. Я изменил его в соответствии со своими потребностями
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.company.awesome-app.pipeline</groupId>
    <artifactId>code-coverage-merge</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>Awesome App Code Coverage Merge</name>
    <description>Merge Code Coverage from all modules</description>
    <properties>
        <maven.install.skip>true</maven.install.skip>
        <maven.deploy.skip>true</maven.deploy.skip>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <echo message = "Generating JaCoCo Reports" />
                                <taskdef name = "report" classname = "org.jacoco.ant.ReportTask">
                                    <classpath path = "{basedir}/target/jacoco-jars/org.jacoco.ant.jar" />
                                </taskdef>
                                <report>
                                    <executiondata>
                                        <file file = "${project.basedir}/service-impl/target/jacoco.exec" />
                                    </executiondata>
                                    <structure name = "Jacoco report">
                                        <group name = "service-impl">
                                            <classfiles>
                                                <fileset dir = "${project.basedir}/service-impl/target/classes" />
                                            </classfiles>
                                            <sourcefiles encoding = "UTF-8">
                                                <fileset dir = "${project.basedir}/service-impl/src/main/java" />
                                            </sourcefiles>
                                        </group>
                                        <group name = "service-model">
                                            <classfiles>
                                                <fileset dir = "${project.basedir}/service-model/target/classes" />
                                            </classfiles>
                                        </group>
                                    </structure>
                                    <html destdir = "${project.build.directory}/site/jacoco" />
                                    <xml destfile = "${project.build.directory}/site/jacoco/jacoco.xml" />
                                    <csv destfile = "${project.build.directory}/site/jacoco/jacoco.csv" />
                                </report>
                            </target>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.jacoco</groupId>
                        <artifactId>org.jacoco.ant</artifactId>
                        <version>0.8.7</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
  1. В файл azure-pipelines.yml я добавил задачу для запуска pom покрытия кода и задачу для добавления его в конвейер. Теперь это выглядит так:
    - task: SonarCloudPublish@2
      inputs:
        pollingTimeoutSec: '300'

    - task: Maven@4
      displayName: 'Run code coverage maven'
      inputs:
        mavenPomFile: 'service/aggregator-pom.xml'
        javaHomeOption: 'JDKVersion'
        jdkVersionOption: '1.17'
        jdkArchitectureOption: 'x64'
        mavenVersionOption: 'Default'

    - task: PublishCodeCoverageResults@2
      inputs:
        summaryFileLocation: $(System.DefaultWorkingDirectory)/service/target/site/jacoco/jacoco.xml
        pathToSources: $(System.DefaultWorkingDirectory)/service

После всего этого все работает. Я только заметил, что в новой задаче изменился пользовательский интерфейс CodeCoverage (я использую @2 вместо @1 по сравнению с примером обходного решения). Проблема в том, что в новом пользовательском интерфейсе отсутствуют некоторые функции. Некоторые люди также упоминали эту проблему здесь, но Microsoft, похоже, не собирается ее исправлять. Мы используем покрытие кода sonarcloud, поэтому пока это не кажется такой уж большой проблемой, если не считать вот этой хлопоты.