我有一个 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}"
}
我应该怎么做?
[编辑] 我还应该指定,有没有办法运行这个嵌套,以便我可以clean
所有子项目,然后build
?
例如,相当于:
gradle :com.mycompany.api:clean :com.mycompany.ui:clean
gradle :com.mycompany.api:build :com.mycompany.ui:build
我会这样做(下面),但显然詹金斯不喜欢时髦的闭合......
tasks.each { task ->
subprojects.each {project ->
gradle :${project}:${task}
}
}
看起来@tim_yates提供的答案在某种程度上以一种非常"时髦"的方式回答了这个问题。
sh "gradle ${GRADLE_TASKS.split(' ').collect { ":com.mycompany.api:${it}" }.join(' ')}"