如何在构建失败后才在gradle中执行任务

时间:2016-12-08 15:27:37

标签: gradle allure

我在biuld.gradle中有以下代码:

task generateReport(type: Exec){
    onlyIf{
        project.getState().failure
    }
    doLast{
        executable "generateReport.bat"
    }
}

tasks.withType(Test)*.finalizedBy generateReport

我之前尝试过:

task generateReport(type: Exec){
    executable "generateReport.bat"
}

tasks.withType(Test)*.finalizedBy generateReport

gradle.afterProject {project, projectState ->
    if (projectState.failure) {
        doLast{
            generateReport
        }
    }
}

还有其他例子,但都没用。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

您需要挂钩buildFinished生命周期事件,如下所示:

gradle.buildFinished { buildResult ->
    if (buildResult.failure) {
        println "Build Failed!"
    } else {
        println "Build Succeeded!"
    }
}

答案 1 :(得分:1)

首先,您必须使用其他答案中提到的BuildListener。但是还有一点需要注意,你不能像generateReport那样按照你的方式调用某个任务。所以你宁愿在监听器的闭包中使用exec权限,如:

gradle.buildFinished { buildResult ->
    if (buildResult.failure) {
        exec {
            executable "generateReport.bat"
        }
    }
}

答案 2 :(得分:0)

Project.state是项目的评估状态,而不是某些执行状态。如果您想在构建失败时执行某些操作,则应该gradle.addBuildListener()并在BuildListener中实现方法buildFinished(),您可以在其中检查result.failure以查看构建是否失败。如果要为每个失败的测试尝试执行某些操作,则应使用gradle.addListener()并为其提供TestListener的实现,您可以在其中对失败的测试或测试套件执行操作。或者,您也可以仅使用testTask.addTestListener()将测试侦听器添加到特定测试任务。或者为了让它更好,您可以testTask.afterTest { ... }testTask.afterSuite { ... }