groovy 根据由相关任务填充的变量提供任务输入

rwqw0loc  于 2022-11-28  发布在  其他
关注(0)|答案(1)|浏览(107)

使用案例

我们已经设置了一个预提交git钩子,用于lint声明性管道(Jenkinsfiles)。目前,每次发出git commit时,仓库中的所有Jenkinsfiles都会被lint。我希望通过只lint自上次Gradle执行以来发生更改的Jenkinsfiles来改进流程。我们正在使用Gradle(v7.5.1)来编排Spotless check/apply和Jenkinsfile lint等任务。

示例

我在build. gradle中注册了两个任务。一个任务收集存储库中的所有Jenkinsfiles,另一个任务对它们进行lint。为了简洁起见,我简化了下面列出的任务。

def jenkinsfiles = []

task getJenkinsfiles {
    doLast {
        jenkinsfiles = ['Jenkinsfile1', 'Jenkinsfile2', 'Jenkinsfile3']
        //println(jenkinsfiles)
    }
}

task lintJenkinsfiles {
    dependsOn getJenkinsfiles
    inputs.file(jenkinsfiles)
    outputs.file('lintJenkinsfile.cache')
    doLast {
        println(jenkinsfiles)
    }
}

结果

getJenkinsfiles首先执行,没有问题。如果我取消getJenkinsfiles任务中的println(jenkinsfiles)注解,该值将输出到控制台。但是,lintJenkinsfiles失败,并声明path may not be null or empty string. path='[]'.
如何引用task 1中填充的变量作为task 2中的输入?

kh212irz

kh212irz1#

我设法将这两个任务合并为一个任务,getJenkinsfiles中的脚本直接放在lintJenkinsfiles中的inputs.files(jenkinsfiles)之上,以获取所有Jenkinsfiles,inputsinputs.file更改为inputs.files,以处理字符串数组(Jenkinsfiles位置)。

task lintJenkinsfiles {
    def jenkinsfiles = ['Jenkinsfile1', 'Jenkinsfile2', 'Jenkinsfile3']
    inputs.files(jenkinsfiles)
    outputs.file('lintJenkinsfile.cache')
    doLast {
        println(jenkinsfiles)
    }
}

相关问题