【问题标题】:Can I build stages with a function in a Jenkinsfile?我可以使用 Jenkinsfile 中的函数构建阶段吗?
【发布时间】:2025-11-30 00:35:01
【问题描述】:

我想使用一个函数来构建我的 Jenkinsfile 的一些阶段。这将是一个包含许多重复阶段/步骤的构建 - 我不想手动生成所有内容。

我想知道是否可以这样做:

_make_stage() {
    stage("xx") {
        step("A") {
            echo "A"
        }

        step("B") {
            echo "B"
        }
    }
}

_make_stages() {
    stages {
        _make_stage()
    }
}

// pipeline starts here!
pipeline {
    agent any
    _make_stages()
}

不幸的是,詹金斯不喜欢这样——当我运行时,我得到了错误:

WorkflowScript: 24: Undefined section "_make_stages" @ line 24, column 5.
       _make_stages()
       ^

WorkflowScript: 22: Missing required section "stages" @ line 22, column 1.
   pipeline {
   ^

那么这里出了什么问题?函数 _make_stages() 看起来确实返回了阶段对象返回的任何内容。为什么我将它放在函数调用中还是将其内联到管道定义中很重要?

【问题讨论】:

  • 我找到了解决方案,请参阅here

标签: jenkins groovy jenkins-pipeline


【解决方案1】:

正如here 解释的那样,管道“脚本”不是简单的 Groovy 脚本,它们在运行之前会进行大量转换,一些部分在 master 上,一些部分在 slave 上,它们的状态(变量值)被序列化并传递到下一步.因此,并非所有 Groovy 功能​​都受支持,而您所看到的简单函数实际上也不支持。

这并不意味着您想要实现的目标是不可能的。您可以以编程方式创建阶段,但显然不能使用声明性语法。另请参阅 this question 以获得好的建议。

【讨论】:

    【解决方案2】:

    您可以在共享库中定义声明式管道,例如:

    // vars/evenOrOdd.groovy
    def call(int buildNumber) {
      if (buildNumber % 2 == 0) {
        pipeline {
          agent any
          stages {
            stage('Even Stage') {
              steps {
                echo "The build number is even"
              }
            }
          }
        }
      } else {
        pipeline {
          agent any
          stages {
            stage('Odd Stage') {
              steps {
                echo "The build number is odd"
              }
            }
          }
        }
      }
    }
    
    // Jenkinsfile
    @Library('my-shared-library') _
    
    evenOrOdd(currentBuild.getNumber())
    

    Defining Declarative Pipelines

    【讨论】:

      最近更新 更多