执行两个相似的Jenkinsfile管道而无需复制代码

时间:2019-04-01 09:08:34

标签: jenkins jenkins-pipeline

我将Jenkins与声明性管道一起使用,以连续测试我的Python项目之一。我想概括一下Jenkinsfile,以使用多个Python版本(可能并行)测试我的项目。假设我当前的Jenkinsfile看起来像这样:

pipeline {
  stages {
    stage('Checkout') {
      dir("src") {
        steps {
          checkout scm
        }
      }
    }
    stage('Install') {
      sh """
      python3.4 -m venv virtualenv
      source virtualenv/bin/activate
      python3.4 -m pip install src
      """
    }
  }
}

我试图通过将其移动到一个函数来参数化管道的生成,如下所示:

def generatePipeline(version) {
  pipeline {
    stages {
      stage('Checkout') {
        dir("src") {
          steps {
            checkout scm
          }
        }
      }
      stage('Install') {
        sh """
        python${version} -m venv virtualenv
        source virtualenv/bin/activate
        python${version} -m pip install src
        """
      }
    }
  }
}

generatePipeline("3.4")

Jenkins失败,并显示消息java.lang.NoSuchMethodError: No such DSL method 'stages' found among steps (后面是巨大的列表)

我无法成功地进行大量的其他事情(包括将generatePipeline放在共享库中),但是我并不真正了解声明性管道(甚至是Groovy)是如何工作的。有没有一种方法可以生成多个类似的管道,而无需复制所有通用代码?

1 个答案:

答案 0 :(得分:2)

您必须将管道脚本上下文传递到您的方法中,然后从中调用pipline。


    def generatePipeline(version, context) {
        context.pipeline {
            stages {
                //...
            }
        }
    }

    generatePipeline("3.4", this)