Jenkins 在不重复代码的情况下执行两个类似的文件管道

Jenkins 在不重复代码的情况下执行两个类似的文件管道,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我使用Jenkins和声明性管道持续测试我的一个Python项目。我想概括一下我的Jenkinsfile,用几个Python版本测试我的项目,可能是并行的。假设我当前的Jenkinsfile如下所示: pipeline { stages { stage('Checkout') { dir("src") { steps { checkout scm } } } stage('Install')

我使用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:在步骤中找不到这样的DSL方法“stages”(下面是一个巨大的列表)


我尝试了无数其他事情(包括将
generatePieline
放在共享库中),但我并不真正理解声明性管道(甚至Groovy)是如何工作的。有没有一种方法可以在不复制所有公共代码的情况下生成多个类似的管道?

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


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

    generatePipeline("3.4", this)


你想要这个:@MattSchuchard谢谢,我试过了,但没能成功。你能详细介绍一下要采取的步骤吗?例如,我需要将共享库存储在单独的SCM存储库中,还是可以将其与我的
Jenkinsfile
放在同一个存储库中(我更喜欢哪个)?如果它位于同一回购协议中,我是否需要将其标记为受信任?最重要的是,共享库中的函数应该返回什么?一个管道,一个阶段的集合,完全其他的东西…?Jenkins抱怨说
java.lang.NoSuchMethodError:在步骤[…]中没有找到这样的DSL方法“阶段”
。编辑:消息以
…]或globals[currentBuild、docker、env、params、pipeline、scm]
终止。我在那里看到了
管道
,这也许可以解释为什么Jenkins即使没有
上下文
,也没有抱怨它。我认为,这里的问题是,您尝试使用声明性管道语法,这不允许灵活的Groovy语法。调查一下。