Jenkins 渐变-不同的任务使用不同的参数

Jenkins 渐变-不同的任务使用不同的参数,jenkins,gradle,Jenkins,Gradle,我有两个任务,任务1应该压缩png文件,任务2不应该压缩png文件,所以我想添加一个参数来控制它 project.ext.set("compressPngs", 1); task taskCompressPngs(type:Exec){ commandLine "myshell.sh" args compressPngs } task task_1(dependsOn:'taskCompressPngs'){} task task_2(dependsOn:'taskCompr

我有两个任务,任务1应该压缩png文件,任务2不应该压缩png文件,所以我想添加一个参数来控制它

project.ext.set("compressPngs",  1);
task taskCompressPngs(type:Exec){
    commandLine "myshell.sh"
    args compressPngs
}

task task_1(dependsOn:'taskCompressPngs'){}
task task_2(dependsOn:'taskCompressPngs'){}

gradle.taskGraph.whenReady { taskGraph ->
    if (taskGraph.hasTask(task_1)) 
    {
        compressPngs=1
    }
    if (taskGraph.hasTask(task_2)) 
    {
        compressPngs=0
    }
}

但是,当我运行task_1或task_2时,在task'taskCompressPngs'中,“compressPngs”传递给我的脚本'myshell.sh'总是1,为什么?如何解决此问题?

在更改配置值之前配置taskCompressPngs。条件配置很少是一个好的解决方案。更好的方法是声明两个
Exec
任务。

正如其他人所提到的,可能最好使用并使用两个单独的任务,但如果您真的认为不能,这里有几个其他选项应该可以使用

1) 检查梯度起动参数 根据命令行上传递给gradle的任务配置可重用任务

task taskCompressPngs(type: Exec) {
    def compressPngs = 1
    if(gradle.startParameter.taskNames.toString().toLowerCase().contains("task_2")) compressPngs = 0
    commandLine "myshell.sh $compressPngs".tokenize()
}
这为您提供了一个在配置时可用的变量(
gradle.startParameter.taskNames

这里,只有在运行gradle时在命令行上指定了任务2时,我们才将compressPngs更改为0

也就是说,
gradlew task_1
将运行
myshell.sh 1
,但
gradlew task_2
(甚至
gradlew task_1 task_2
)将运行
myshell.sh 0

此逻辑还可以应用于taskCompressPngs任务之外的项目属性,例如,如果您也想更改其他任务

同样,只有在用于运行gradle的命令中指定了“task_2”时,这才有效

2) 使用DefaultExecAction而不是Exec任务 您可以编写自定义任务并检查其中的任务图,而不是使用类型为
Exec
的任务

task taskCompressPngs << {
    def compressPngs = 1
    if(gradle.taskGraph.hasTask(two)) compressPngs = 2
    org.gradle.process.internal.DefaultExecAction e = new org.gradle.process.internal.DefaultExecAction(getServices().get(org.gradle.api.internal.file.FileResolver.class))
    e.commandLine("myshell.sh $compressPngs".tokenize())
    e.execute()
}

task taskCompressPngs为什么task_2在不应该压缩时依赖于taskCompressPngs?整个任务图是这样的:task_2(task_1)->task'osbuild'->符号->包->taskCompressPngs,“->”的意思取决于。我只是想让任务图变得清晰。也许在doLast{}中移动“args compressPngs”就可以了。这样,在配置之后就可以进行设置。但正如聪明的彼得·尼德维泽所说;条件配置很少是一个好的解决方案。我遵从Peter N的建议,但如果您坚持尝试,下面的链接可能会很有用-我已经尝试过,但不适合我。