Мы переходим с задачи 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 в качестве входных данных задачи. Эти два параметра не являются обязательными для проекта с одним модулем, но необходимы для проектов с несколькими модулями.
Мне неясно, что происходит и как это следует решить/обойти. Интересно, может у кого-нибудь есть идея? заранее спасибо
И когда вы используете 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. Можете ли вы это подтвердить?
Я сделал это как маскировку для нашего проекта, кажется, я просто забыл об этом. Это те же помпоны
Старую задачу maven можно найти здесь: Learn.microsoft.com/en-us/azure/devops/pipelines/tasks/…. Я добавлю еще в журнал ошибок
Мне удалось ответить на свои вопросы, используя этот обходной путь, упомянутый здесь.
- 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
<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>
<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>
- 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, поэтому пока это не кажется такой уж большой проблемой, если не считать вот этой хлопоты.
Судя по вашему описанию, вы имеете в виду, что версия 3 задачи maven может работать должным образом для вашего проекта? Если да, можете ли вы поделиться определением задачи maven версии 3? А можете подробнее рассказать о журнале ошибок?