如何在本地覆盖Jenkinsfile库函数?

时间:2018-02-10 18:35:22

标签: jenkins groovy declarative

我在许多项目中使用了标准化的声明性Jenkinsfile。我已将整个管道移动到库中,因此我的Jenkinsfile看起来像这样:

2009

库(var / default_pipeline.groovy):

2109

我希望能够在Jenkinsfile中为实际的管道代码添加一个定义,如下所示:

@Library('default_jenkins_libs') _
default_pipeline();

我无法弄清楚如何做到这一点。我怀疑这可能是由库调用Jenkinsfile表示的对象并调用它的“PostBuildStep()”,可能像'parent.PostBuildStep()“,但我没有类结构/命名参考。

有什么建议吗?最重要的是,我想要一个标准化的管道,它可以通过库更改进行整体更改,但仍然可以对使用它的作业进行一些控制。

TIA

2 个答案:

答案 0 :(得分:2)

您无法覆盖库脚本中定义的函数。但您可以考虑将自定义后期构建步骤定义为传递给default_pipeline()的闭包。请考虑以下示例:

乏/ default_pipeline.groovy

def call(body = null) {
    pipeline {
        agent any
        stages {
            stage('Build') {
                steps {
                    script {
                        body != null ? body() : PostBuildStep()
                    }
                }
            }
        }
    }
}

def PostBuildStep() {
    echo 'Running default post-build step';
}

Jenkinsfile

@Library('default_jenkins_libs') _

default_pipeline({
    echo 'Running customized post-build step'
})

在这种情况下,default_pipeline有一个可选参数,它是一个定义自定义帖子构建步骤的闭包。运行以下示例将生成以下输出:

[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Running customized post-build step
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

希望它有所帮助。

答案 1 :(得分:0)

实际上,可以使用共享库中的全局变量覆盖管道步骤,例如,将其命名为stage.groovy

请参阅我在此处给出的详细答案: Common wrapper in Jenkinsfile 以及GitHub中的示例。