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