我可以在Jenkinsfile中使用函数构建阶段吗?

时间:2017-05-09 23:47:35

标签: jenkins groovy jenkins-pipeline

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

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

_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()
}

不幸的是Jenkins并不喜欢这样 - 当我跑步时我得到错误:

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()实际上看起来像返回阶段对象返回的任何内容。为什么我把它放在一个函数调用中或者只是将它内联到管道定义中呢?

2 个答案:

答案 0 :(得分:5)

正如here所解释的那样,管道“脚本”不是简单的Groovy脚本,它们在运行之前被大量转换,主机上的某些部分,从机上的某些部分,其状态(变量值)被序列化并传递给下一步。因此,不支持每个Groovy功能,而您所看到的简单功能实际上并非如此。

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

答案 1 :(得分:0)

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

// 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