我可以阻止javaexec失败杀死Gradle任务吗?

时间:2015-05-07 02:20:55

标签: multithreading gradle geb

我有一个gradle任务迭代文件树并对每个匹配的文件进行javaexec调用:

task runFeatures {
    doLast {
        fileTree(dir: 'src/test/resources/features', include:'**/*.feature').each { file ->
            javaexec {
                main = "cucumber.api.cli.Main"
                classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
                args = [
                   ...
                   '--plugin', json:build/reports/cucumber/${file.filename}",
                   ...
                   file.absolutePath
                ]
            }
            generateReportFromJson()
        }
    }

这样做的原因是使用GPars同时运行黄瓜/ geb测试。

调用黄瓜时,预计这些javaexecs会返回错误,而且测试框架需要响应错误而不是当场死亡这一点显而易见。

但据我所知,一旦一个特征文件从javaexec返回错误代码,gradle立即终止整个任务(即在这种情况下整个测试运行),而不是给出关于它的任务选项回应失败。

在这种情况下,如果单个场景失败,generateReportFromJson()永远不会被调用。

有一篇帖子here,作者为javaexec写了一个补丁来解决这个问题。这是在2012年,但我找不到那个故事的结尾,如果有的话。

所以我可以看到绕过它的唯一方法是从shell中调用gradle子任务并让子任务执行autoexec like this。但这至少可以说是笨拙的,特别是因为我的代码需要在Linux和Windows上运行。

我有什么遗失的吗?

2 个答案:

答案 0 :(得分:1)

您可以使用ignoreExitValue属性配置javaexec不会导致构建失败:

javaexec {
    ...
    ignoreExitValue = true
}

答案 1 :(得分:0)

任务失败时的Gradle行为是停止此任务,然后在整个构建失败或继续,以防提供命令行选项--continue(文档 Wiki )。

如果您希望单独为每个文件执行javaexec,那么如果一次执行失败,另一次将尝试执行,那么您必须为每次执行动态定义不同的任务,可能使用<强> here

现在,关于您的以下评论:

  如果单个场景失败,

generateReportFromJson()永远不会被调用。

然后generateReportFromJson()位于doLast块之外。这意味着它将在gradle配置阶段被调用,即在调用javaexec之前调用它,因此我不确定它是否与任务失败有关。 但是,要在任务generateReportFromJson()之后调用runFeatures,您只需将其移至单独的任务,然后在runFeatures使其依赖--continue以防runFeatures使用{{1} }}选项并希望整个构建继续或者将新任务定义为 task rules thw并执行新任务而不是image.src = canvas.toDataURL("image/png");