gradle 从中断的任务停止处继续

yrdbyhpb  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(166)

我有一个应用程序,需要进行大量测试。实际上,我们必须在不同的输入上运行该应用程序数十万次。因此,我构建了一个自定义Gradle任务,用于管理分叉流程和收获已完成流程。数千次测试运行中的每一次都生成一个文件,并将其放入结果目录。如果分布在10个群集节点上,完整测试可能需要大约一周的时间。
问题是,无论出于何种原因,如果我需要停止测试,那么目前我无法从停止的地方开始备份。Gradle的增量构建和缓存功能(据我所知)实际上仅在任务完成时才起作用,如果之前的调用被中断,它将从头重新运行整个任务(ctrl-c)。
我可以构建一些结果文件的检测,并且只重新运行没有结果文件的片段,但是,当应用程序被重新构建时,这将不能正常工作,然后合法的测试必须从头开始。
那么,当前一个任务调用被中断时,我如何可靠地检测哪些测试片段是最新的呢?

m2xkgtsf

m2xkgtsf1#

带注解的任务

对于任何Gradle任务,如果其输出文件存在并且其输入(包括前置任务)都是最新的,Gradle会将该任务视为最新的,并且不会再次运行它。您可以通过注解为定义任务而编写的类的属性来告知Gradle有关输入和输出的信息。
您可以利用这一点,将自定义Gradle测试任务分解为多个较小的测试任务,并让每个任务定义声明带注解的输出。测试报告可能最适合这些输出。这样,如果您中途停止构建,则无需重新运行包含报告的测试任务。

整个应用程序的重新生成始终需要重新运行所有测试

然而,如果你的整个应用程序都被重建了,那么那些测试任务将不再是最新的,因为它们的前一个构建任务将不再是最新的。新的应用程序构建需要再次运行其测试以检查其是否仍按预期工作。

多模块构建可能意味着只有部分应用程序需要重新构建

可能是应用程序的某些部分没有重建,而测试任务完全依赖于应用程序的这些完整部分。如果任何先前已完成的测试任务的前置任务链都是最新的,则Gradle也不会再次重新运行这些测试。
如果您的应用在多模块构建中被分为不同的Gradle子项目(如果适用),则更多测试任务更有可能出现这种情况。每个子项目都将拥有自己的任务链,如果仅更改了应用的部分代码或其他输入,则无需重新运行这些任务。

相关问题