我将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)是如何工作的。有没有一种方法可以生成多个类似的管道,而无需复制所有通用代码?
答案 0 :(得分:2)
您必须将管道脚本上下文传递到您的方法中,然后从中调用pipline。
def generatePipeline(version, context) {
context.pipeline {
stages {
//...
}
}
}
generatePipeline("3.4", this)