Maven 发布插件执行两次测试

Posted

技术标签:

【中文标题】Maven 发布插件执行两次测试【英文标题】:Maven release plugin executes tests twice 【发布时间】:2021-03-24 08:13:37 【问题描述】:

当 release:clean release:prepare release:perform 执行时,测试执行两次

发布一次:prepare ,stage run-preparation-goals ,task clean verify

还有一次发布:perform ,stage run-perform-goals , task deploy

是否有任何配置选项可以使测试仅在第一个时运行而不在执行时执行?

BR

玉莲欧法

【问题讨论】:

【参考方案1】:

您可以使用明确指定的参数-DskipTests 跳过运行测试(由surefire 插件管理):

类似这样的:

mvn release:perform -DskipTests 

对于集成测试(由故障安全插件管理),您可以使用类似的标志:-DskipITs

如果您甚至不想编译测试,您可以使用-Dmaven.test.skip=true(用于单元测试和集成测试)

【讨论】:

这将取消 release:prepare 和 release perform 中的测试,目标是让测试只执行一次 我几乎没有使用过发布插件,但总的来说:您正在运行两个单独的命令,mvn release:preparemvn release:perform,对吧?如果是这样,我建议仅以“执行”目标运行 -DskipTests:“mvn release:prepare”,然后是“mvn release:performa -DskipTests 不,我通过 jenkins CI 将它们作为单个命令运行。所以完整的命令是 mvn release:clean release:prepare release:perform【参考方案2】:

这是因为在您发出的命令中运行了 2 个完整版本。

release:prepare 部分对代码和存储库执行大量检查,并执行完整构建以确保所有测试通过。

release:perform 部分标记 repo,然后提取该标记。它基于该标签执行构建 以及构建到您选择的人工制品商店(Nexus/Artifactory/wherever)的版本。

这些步骤是这样设计的,以确保您不会在未构建的代码上使用标签污染您的存储库,并且测试是您构建的一个组成部分。一旦 maven 对你的代码感到满意,它就会创建标签并拉取它,这样它就可以确定要发布的代码是标签引用的代码,而不是其他任何东西。为发布构建该标签需要完整构建,包括测试。

您可以跳过其中一个或其他步骤的测试,或同时跳过这两个步骤,但如果这样做,您将错过测试和发布插件的要点。

【讨论】:

嗨,我明白如果 release:prepare 和 release perform 分别执行,它们之间可能会发生代码更改。但是,由于两者都在 jenkins 上有效地作为单次执行运行,因此没有理由让测试运行两次,因为它的相同代码,在准备 jenkins 时运行测试会修改 poms 并准备标签,而在发布时它将工件推送到 nexus 。存储库。因此我认为最好在发布阶段禁用测试以减少作业执行时间(我们的一些项目正在运行几个小时的测试) 这是您的代码,因此您可以随心所欲地使用它。我不同意你的看法,但这在这里不重要。不过,我要指出,如果您的测试运行了几个小时,那么您的测试方法就有问题。您应该考虑将它们划分为更好的阶段,并在生命周期的适当阶段运行它们。【参考方案3】:

您可以覆盖goals 参数并添加-DskipTests=true

此参数将仅跳过perform 部分的测试。

【讨论】:

嗨。当我添加 -DskipTests=true 时,测试仍在执行完整的 maven 命令是 mvn -s $MAVEN_SETTINGS -DskipTests=true release:clean release:prepare release:perform -DreleaseVersion=$releaseVersion -DdevelopmentVersion=$developmentVersion 这不是我的建议。我建议更改goals 参数,即添加类似-Dgoals="clean verify -DskipTests"【参考方案4】:

最终我不得不改变一个逻辑。

我已经执行了 mvn clean install release:clean release:prepare release:perform -Pmaven-release

并创建一个 maven-release。结果测试只在安装时执行

BR

玉莲欧法

<profile>
        <id>maven-release</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-release-plugin</artifactId>
                    <configuration>
                        <autoVersionSubmodules>true</autoVersionSubmodules>                         
                        <arguments>-Dmaven.test.skip</arguments>                        
                    </configuration>
                </plugin>
            </plugins>
        </build>        
    </profile>

【讨论】:

以上是关于Maven 发布插件执行两次测试的主要内容,如果未能解决你的问题,请参考以下文章

Maven 发布插件失败:源工件被部署两次

是否可以在另一个插件的两次执行之间运行一个插件?

Hudson 和 Maven 测试运行两次

maven项目中junit测试同一方法, 运行一次却重复执行了两次?

Maven JavaDoc 列出了两次类

如何使 maven cobertura 和 surefire 插件一起工作?