首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在本地重写Jenkinsfile函数?

如何在本地重写Jenkinsfile函数?
EN

Stack Overflow用户
提问于 2018-02-10 18:35:22
回答 2查看 7.1K关注 0票数 7

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

代码语言:javascript
复制
@Library('default_jenkins_libs') _
default_pipeline();

库(var/default_管线. library ):

代码语言:javascript
复制
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中的实际管道代码添加一个定义,如下所示:

代码语言:javascript
复制
@Library('default_jenkins_libs') _

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

default_pipeline();

我一直想不出该怎么做。我怀疑这可能是通过调用Jenkinsfile表示的对象并调用其"PostBuildStep()“来实现的,可能类似于‘parent.PostBuildStep()’,但我没有类结构/命名引用。

有什么建议吗?底线是,我想要一个标准化的管道,它可以通过库的变化来改变,但仍然可以控制使用它的作业。

提亚

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-10 19:57:29

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

vars/默认管道.default

代码语言:javascript
复制
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

代码语言:javascript
复制
@Library('default_jenkins_libs') _

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

在本例中,default_pipeline只有一个可选参数,即定义自定义post生成步骤的闭包。运行以下示例将产生以下输出:

代码语言:javascript
复制
[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

希望能帮上忙。

票数 4
EN

Stack Overflow用户

发布于 2019-05-20 08:01:57

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

请参阅我在这里给出的详细答案:Jenkinsfile中的通用包装器GitHub中的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48724243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档