Jenkinsfile中的通用包装器

时间:2018-11-21 09:43:21

标签: jenkins groovy jenkins-pipeline

我想向我们的管道libraries添加timestamps()colorizeOutput()功能。我在詹金斯documentation中找到了wrappers {}

job('example') {
    wrappers {
        colorizeOutput()
        timestamps()
    }
}

我不知道如何向看起来像这样的库中添加包装器:

// file ..src/helpers/Builder.groovy

package helpers.sw_main

def doSomething() {
    // some Groovy stuff here
}

def doSomethingElse() {
    // do something else
}

我们的工作流程如下:

#!/usr/bin/env groovy

// this is our library with custom methods
@Library('ext-lib')
def builder = new helpers.Builder()

node {
    try {

        stage('Some Stage') {
            builder.doSomething()
        }
    }

    catch (err) {
        throw err
    }
}

因此,我想将时间戳和ansi-colors添加到库中的每个函数中。当然,我可以使用

包装每个函数来做到这一点
timestamps() {
    colorizeOutput() {
        // function body
    }
}

但是有点愚蠢。

那么我可以轻松地包装管道或库吗?

1 个答案:

答案 0 :(得分:1)

您的问题的一种解决方案是使用全局变量(/vars/xxxxx.groovy)。

要创建自己的构建步骤,请添加一个像/vars/myOwnStep.groovy这样的全局变量:

def call(STAGE_NAME, Closure closure) {
    // do something

    // return something if you like to
}

您可以这样打电话给

myOwnStep("Step-name") {
    // what ever you want to do
}

在管道脚本中。

另一种可能性是“覆盖” sh 步骤。因此,使用以下代码创建名为/vars/sh.groovy的文件:

def call(String script, String encoding=null, String label=null, boolean returnStatus=null, boolean returnStdout=null) {
    timestamps {
        return steps.sh(script: script, endoding: encoding, label: label, returnStatus: returnStatus, returnStdout: returnStdout)
    }
}

def call(Map params = [:]) {
    return call(params.script, params.get('encoding', null), params.get('label', null), params.get('returnStatus', false), params.get('returnStdout', false)) 
}

(这也可以用于其他步骤,但是他的参数必须匹配。)

我刚刚添加了一些示例的GitHub存储库:https://github.com/datze/jenkins_shared_library(未经测试!)