如何拦截 Gradle 任务的失败?

How do I intercept failures of a Gradle task?

'我正在使用 net.foragerr.jmeter 插件编写构建脚本,版本 1.0.2-2.13。

我的任务主要是 1) 运行插件 JMeter 任务和 2) 收集应用程序日志。

task perfTest(dependsOn: ['jmClean', 'jmRun'],
  description:'Runs (cleanly) performance tests on a deployed application and collects the app log if available. ' +
  'Use --no-daemon to see progress. Use --info to see all JMeter command-line arguments.') << {

    if (logDir.isDirectory()) {
        copy {
            from "${logDir}"
            into "${buildDir}/jmeter-report"
            include 'iRePORT.log'
        }
    }
}

现在,即使jmRun失败,我也需要收集日志。当我尝试为此实施解决方案时,我真的被卡住了:

  1. 我无法修改jmRun任务,因为它是一个插件任务
  2. 我不能使用 try/finally 直接执行另一个任务,因为 Gradle 的设计不支持这个,例如见 How do I wrap a gradle task in another task?
  3. 我不能使用 --continue 标志 gradle.startParameter.continueOnFailure = true 因为它不会继续执行相关任务

我能想到的唯一可能的解决方法是分离日志收集,始终将其包含在命令行中,例如perfTest collectLogs 并在 perfTest.

中设置 gradle.startParameter.continueOnFailure = true

这远非理想。

有没有更好的解决办法? Gradle 不应该有一种方法来支持这样的场景吗?

您可以尝试创建这样的任务

task collectPerfTestLogs(type: Copy) {
   from "${logDir}"
   into "${buildDir}/jmeter-report"
   include 'iRePORT.log'
}

然后有perfTest.finalizedBy(collectPerfTestLogs).

引用Gradle:

Finalizer tasks will be executed even if the finalized task fails.

https://docs.gradle.org/current/userguide/more_about_tasks.html