如何在 Jenkins 的嵌套 stage{} 块中执行 post{} 部分?

How to get a post{} section executed in a nested stage{} block in Jenkins?

如何将以下 post 部分添加到 运行? 这个想法是根据 myList.

的内容生成并行的 运行ning 阶段
stage("Dynamic stages"){
  steps{
    stageMap = [:]
    script {
      for (element in myList) {
        stageMap[element] = {
          stage("Stage 1 of ${element}"){
            echo "Stage 1"
          }
          stage("Stage 2 ${element}"){
            echo "Stage 2"
            post{
              failure{
                echo "Stage 2 failed!"
              }
            }
          }
        }
      }
    }
    parallel stageMap
  }
}

构建失败并出现以下错误

Also:   java.lang.NoSuchMethodError: No such DSL method 'post' found among steps...

然而Jenkins doc却说这是允许的

果然有一大堆允许的步骤,post 不在其中。 我是不是遗漏了什么,或者文档对这个案例不清楚?

post{} 仅在声明性管道中可用,但在声明性管道的脚本部分中不可用。您可以改用 try{} catch{}

还有一个错误:您在闭包中使用了循环变量 element,这没有按预期工作。闭包捕获 element 变量,但是当闭包运行时,它的值将始终是循环的最后一个值。为了解决这个问题,我已将循环变量分配给新的局部变量 curElement,这将是每次迭代的新实例,因此它会按预期被捕获。

stage("Dynamic stages"){
  steps{
    stageMap = [:]
    script {
      for (element in myList) {
        def curElement = element

        stageMap[element] = {
          stage("Stage 1 of ${curElement}"){
            echo "Stage 1"
          }
          stage("Stage 2 ${curElement}"){
            echo "Stage 2"
            try {
                // some steps that may fail
            }
            catch( Exception e ) {
                echo "Stage 2 failed! Error: $e"
                throw  // Rethrow exception, to let the build fail.
            }
          }
        }
      }
    }
    parallel stageMap
  }
}