Java 如何通过pom运行pmd而不使Jenkins中的构建失败?

Java 如何通过pom运行pmd而不使Jenkins中的构建失败?,java,maven,jenkins,pmd,Java,Maven,Jenkins,Pmd,我正在通过pom.xml中的maven插件运行pmd(checkstyle和findbugs)。由于pmd报告的错误,Jenkins上的构建失败 构建阶段并行运行6个模块,我运行发布服务器和之后的另一个阶段。如果pmd失败,整个构建将失败并立即停止 这是my pom.xml中的一个片段: </properties> <failOnChecks>true</failOnChecks> </properties> <!-- ......

我正在通过pom.xml中的maven插件运行pmd(checkstyle和findbugs)。由于pmd报告的错误,Jenkins上的构建失败

构建阶段并行运行6个模块,我运行发布服务器和之后的另一个阶段。如果pmd失败,整个构建将失败并立即停止

这是my pom.xml中的一个片段:

</properties>
    <failOnChecks>true</failOnChecks>
</properties>
<!-- ...... -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.8</version>
    <dependencies>
        <dependency>
            <groupId>net.sourceforge.pmd</groupId>
            <artifactId>pmd-core</artifactId>
            <version>${version.pmd}</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.pmd</groupId>
            <artifactId>pmd-java</artifactId>
            <version>${version.pmd}</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.pmd</groupId>
            <artifactId>pmd-javascript</artifactId>
            <version>${version.pmd}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.pmd</groupId>
            <artifactId>pmd-jsp</artifactId>
            <version>${version.pmd}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>my.software</groupId>
            <artifactId>build-tools</artifactId>
            <version>${version.build-tools}</version>
        </dependency>
    </dependencies>
    <configuration>
        <rulesets>
            <ruleset>pmd/ruleset.xml</ruleset>
        </rulesets>
        <failOnViolation>${failOnChecks}</failOnViolation>
    </configuration>
    <executions>
        <execution>
            <phase>process-resources</phase>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
在到达第二阶段之前,它在构建中失败

插件不应该停止管道,而是完成管道,然后失败,然后运行发布服务器,这样我就可以在Jenkins中看到问题

到目前为止,我通过属性设置failOnViolation,但我不能让构建在最后失败。我想我需要检查一下那里的状态,然后打错电话


有没有更干净的方法来实现这一点?

您可以使用目标
pmd
而不是
检查
,它将分析代码并生成报告,但不会使构建失败。然后配置Jenkin's并根据报告中的违规数量将构建标记为失败或不稳定


注意,当手动运行时,更改目标也将停止Maven构建失败。我们通常在
中配置maven pmd插件,而不使用
,并创建两个maven配置文件:一个默认配置文件运行maven pmd插件,目标为
检查
,另一个配置文件为
jenkins
,目标为
pmd
。通过这种方式,开发人员可以手动运行构建,当存在PMD冲突时,构建将失败,而当在Jenkins上使用profile
Jenkins

运行时,构建不会失败。首先,为什么您定义了插件的依赖项?此外,您是否已经检查过通过以下方式调用Maven:
mvn--fail at end…
?1:这是由一位同事完成的。我想他这样做是有原因的。我可能会把它们拿走。2:--最终失败可能不起作用,因为每个构建都运行自己的mvn命令--fail never可能也不太好,因为它可能会抑制任何其他故障。将这些依赖项添加到插件中并没有真正意义,因为插件已经具有这些依赖项…您是否使用CI解决方案来运行这些生成?如果是,您可以更改maven调用的配置。
-fae
不会停止管道。如果生成有问题,则管道将停止。如果在这种情况下需要继续,则需要在管道中缓存错误…当您想要运行最新版本的PMD时,依赖项是有意义的。maven pmd插件通常落后于几个pmd版本,因为其更新频率低于pmd本身。到目前为止,maven pmd插件使用pmd 5.6.1,而pmd的最新版本是5.8.1。
stage('modules') {
  gitlabCommitStatus('modules') {
    parallel Config.stepsForParallel
  }
}

stage('Jenkins Code Analysis') {
  pmd canRunOnFailed: true, canComputeNew: false, defaultEncoding: '', healthy: '', pattern: '', unHealthy: ''
  checkstyle canRunOnFailed: true, canComputeNew: false, defaultEncoding: '', healthy: '', pattern: '', unHealthy: ''
  //findbugs canComputeNew: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', pattern: '', unHealthy: ''
}