考虑具有以下结构的存储库:
parent
- subdir1
- subdir2
其中每个subdir
都是一个独立的项目,并且有自己的Jenkinsfile
。我们希望根据子目录中的任何文件是否发生了更改,有条件地从父管道调用这些项目。对于单个目录,这是非常简单的。
stage('build subdir') {
when {
changeset "subdir/**"
}
steps {
load "subdir/Jenkinsfile"
}
}
但是这个项目实际上有20个子目录。我已经按照https://www.zippyops.com/loops-in-pipeline20210420103750用一个循环替换了这个,但是没有用。
def final repos = ["subdir1", "subdir2", "subdir3"]
pipeline {
agent any
stages {
stage('Run builds') {
steps {
checkout scm
script {
repos.each {repo ->
stage(repo) {
when {
changeset "${repo}/**"
}
steps {
load "${repo}/Jenkinsfile"
}
}
}}}}}
它失败了,因为命令when
在step
块下无效。java.lang.NoSuchMethodError: No such DSL method 'when' found among steps...
-有什么办法可以避开这个问题吗?
主要用例是减少样板文件,并能够动态添加目录到这个monorepo,而不必每次接触Jenkinsfile。
1条答案
按热度按时间h5qlskok1#
当你在
Script
块中时。你不能再使用像when{}
这样的声明性语法。所以这里最好的选择是预处理changeSet并得到一个干净的目录列表。下面是我对这个的看法。为了进一步改进你的流水线,你可能也可以并行运行每个阶段。