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

标签 jenkins groovy declarative

我有一个在许多项目中使用的标准化声明式 Jenkinsfile。我已将整个管道移至库中,因此我的 Jenkinsfile 如下所示:

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

库(var/default_pipeline.groovy):

def call() {
pipeline {
  node { <snip> }
  stages {
    stage('Lint and style') {
      steps {
      //stuff
      }
    }
    //etc...
    stage('Post-build') {
      steps {
        PostBuildStep();
      }
    }
  }
}

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

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

@Library('default_jenkins_libs') _

def PostBuildStep() {
  echo 'Running customized post-build step'
  //do custom stuff
}

default_pipeline();

我一直不知道如何做到这一点。我怀疑这可以通过库调用 Jenkinsfile 表示的对象并调用其“PostBuildStep()”来实现,可能类似于“parent.PostBuildStep()”,但我没有类结构/命名引用。

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

TIA

最佳答案

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

vars/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

希望有帮助。

关于jenkins - 如何在本地覆盖 Jenkinsfile 库函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724243/

相关文章:

java - 如何从Java应用程序获取Jenkins环境变量?

javascript - polymer : "Prev"或 "Next"按钮不循环浏览页面

jenkins - 将 Jenkins 的管理员用户添加到 kubeadm kubernetes 集群

java - java或groovy中的字符串格式负数减号(无括号)

configuration - Jenkins:在电子邮件中构建矩阵作业错误?

ajax - Grails ajax 功能

kotlin - Kotlin序列中的短路操作

c# - 基于属性的编程有什么优点?

docker - Dockerized Nginx无法加载证书

docker - 无法在Jenkins中构建Docker镜像