仅当更改特定文件但使用函数时才在 Jenkins 中构建阶段
Build stages in Jenkins only when specific files are changed but use a function
我想更新我的 Jenkins 管道,使某些阶段仅在更改某些特定文件时构建(git 已集成到管道中)。我在这个 site 上找到了一个有前途的解决方案,对于我的用例来说是这样的(此代码 运行 成功):
stage("TEST STAGE 1") {
when {
anyOf { changeset "*dir1/*"; changeset "*dir2/*"; changeset "*somefile" }
}
steps {
// Do stuff
}
}
但是我有更多阶段(TEST STAGE 2 和 TEST STAGE 3),它们也应该仅在这些文件发生更改时触发。为了避免一遍又一遍地编写相同的代码(这是一种不好的做法),我实现了一个函数(我从 here 获得了代码):
def runStage(changeset) {
return {
changeset ==~ ("*dir1/*"||"*dir2/*"||"*somefile")
}
}
我在测试阶段(也是测试 2 和 3)调用此函数:
stage("TEST STAGE 1") {
when {
expression{ runStage(changeset) }
}
steps {
// Do stuff
}
}
但是现在我的管道在进入第一个测试阶段时失败了。我收到此错误:
hudson.remoting.ProxyException:groovy.lang.MissingPropertyException:没有这样的 属性:class 的变更集:WorkflowScript
你知道我做错了什么吗?
我找到了解决办法。
这是我的功能:
def runStage() {
CHANGE_SET = sh (
script: 'git log -2 --name-only --oneline --pretty="format:"',
returnStdout: true
).trim()
echo "Current changeset: ${CHANGE_SET}"
return (CHANGE_SET ==~ "(.*)dir1(.*)|(.*)dir2(.*)|(.*)somefile")
}
我在管道阶段这样调用它:
stage("TEST STAGE 1") {
when {
expression { runStage() }
}
steps {
//stuff
}
}
我更喜欢在 when 块中使用变更集而不是 git 日志,但看起来我的情况无法完成。
我想更新我的 Jenkins 管道,使某些阶段仅在更改某些特定文件时构建(git 已集成到管道中)。我在这个 site 上找到了一个有前途的解决方案,对于我的用例来说是这样的(此代码 运行 成功):
stage("TEST STAGE 1") {
when {
anyOf { changeset "*dir1/*"; changeset "*dir2/*"; changeset "*somefile" }
}
steps {
// Do stuff
}
}
但是我有更多阶段(TEST STAGE 2 和 TEST STAGE 3),它们也应该仅在这些文件发生更改时触发。为了避免一遍又一遍地编写相同的代码(这是一种不好的做法),我实现了一个函数(我从 here 获得了代码):
def runStage(changeset) {
return {
changeset ==~ ("*dir1/*"||"*dir2/*"||"*somefile")
}
}
我在测试阶段(也是测试 2 和 3)调用此函数:
stage("TEST STAGE 1") {
when {
expression{ runStage(changeset) }
}
steps {
// Do stuff
}
}
但是现在我的管道在进入第一个测试阶段时失败了。我收到此错误:
hudson.remoting.ProxyException:groovy.lang.MissingPropertyException:没有这样的 属性:class 的变更集:WorkflowScript
你知道我做错了什么吗?
我找到了解决办法。 这是我的功能:
def runStage() {
CHANGE_SET = sh (
script: 'git log -2 --name-only --oneline --pretty="format:"',
returnStdout: true
).trim()
echo "Current changeset: ${CHANGE_SET}"
return (CHANGE_SET ==~ "(.*)dir1(.*)|(.*)dir2(.*)|(.*)somefile")
}
我在管道阶段这样调用它:
stage("TEST STAGE 1") {
when {
expression { runStage() }
}
steps {
//stuff
}
}
我更喜欢在 when 块中使用变更集而不是 git 日志,但看起来我的情况无法完成。