Дочерний модуль 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 в качестве входных данных задачи. Эти два параметра не являются обязательными для проекта с одним модулем, но необходимы для проектов с несколькими модулями.

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

Судя по вашему описанию, вы имеете в виду, что версия 3 задачи maven может работать должным образом для вашего проекта? Если да, можете ли вы поделиться определением задачи maven версии 3? А можете подробнее рассказать о журнале ошибок?

Kevin Lu-MSFT 30.08.2024 03:31

И когда вы используете maven@3, он использует файл -f /home/vsts/work/1/s/usermanagement-service/pom.xml, а maven@4 — файл -f /home/vsts/work/1/s/service/pom.xml. Кажется, они используют другой файл pom.xml. Можете ли вы это подтвердить?

Kevin Lu-MSFT 30.08.2024 04:12

Я сделал это как маскировку для нашего проекта, кажется, я просто забыл об этом. Это те же помпоны

Joost Luijben 03.09.2024 11:11

Старую задачу maven можно найти здесь: Learn.microsoft.com/en-us/azure/devops/pipelines/tasks/…. Я добавлю еще в журнал ошибок

Joost Luijben 03.09.2024 11:12
Не удалось выполнить цель org.apache.maven.plugins
Не удалось выполнить цель org.apache.maven.plugins
Опишу, что когда я только начинал изучать Maven, у меня не получалось компилировать и упаковывать.
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, поэтому пока это не кажется такой уж большой проблемой, если не считать вот этой хлопоты.

Другие вопросы по теме