仅当更改特定文件但使用函数时才在 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 日志,但看起来我的情况无法完成。