【发布时间】:2021-06-10 08:58:08
【问题描述】:
我有一个 Jenkins 构建,其中“目标”(或 Gradle 中的任务)作为环境变量传递给我的 Jenkinsfile。
例如sh "gradle ${GRADLE_TASKS}" 其中GRADLE_TASKS 的值为"clean build" 将运行gradle clean build。
在我进入子项目之前,这非常有效。
假设我有子项目
root
|-- com.mycompany
|-- com.mycompany.api
\-- com.mycompany.ui
据我所知,如果我想在 com.mycompany.api 上运行干净的构建,我需要以下命令:
gradle :com.mycompany.api:clean :com.mycompany.api:build
我的问题是传递的变量可能代表一个(或多个)要运行的任务。clean、build、clean build、deploy、clean deploy、clean publish deploy 等。
注意:我需要将此保留在使用 Jenkinsfile(例如,不是 Gradle 插件)的解决方案中,因为它是一个混合构建,不仅使用 Gradle。
我的第一直觉是循环执行任务(如下所示),但 Jenkins 似乎不允许您像这样运行循环。
def tasks = GRADLE_TASKS.split(' ')
tasks.each { task ->
sh "gradle :com.mycompany.api:${task}"
}
我该怎么办?
[edit] 我也应该指定,有没有办法运行这个嵌套,这样我就可以clean所有子项目然后build?
例如相当于:
gradle :com.mycompany.api:clean :com.mycompany.ui:clean
gradle :com.mycompany.api:build :com.mycompany.ui:build
我会这样做(如下),但显然 Jenkins 不喜欢 groovy 闭包...
tasks.each { task ->
subprojects.each {project ->
gradle :${project}:${task}
}
}
【问题讨论】:
-
sh "gradle ${GRADLE_TASKS.split(' ').collect { ":com.mycompany.api:${it}" }.join(' ')}" -
@tim_yates 非常感谢!那太棒了。值得注意的是,如果分布在多行中,这些闭包似乎需要三引号(您的示例不需要,但值得尝试的人了解)。有没有一种简单的方法可以轻松适应我在问题中的新示例?一组项目,每个项目都需要运行一个任务,然后再运行另一个......?
标签: java jenkins gradle groovy build