如何在覆盖全局库函数中调用DLS步骤

时间:2016-12-01 03:11:21

标签: jenkins jenkins-pipeline

通过实验,我已经确定我可以通过在共享库中定义同名的全局函数来掩盖内置管道步骤,例如build

示例:

(root)
 +- vars
    +- build.groovy 

build.groovy是:

def call(Map args) {
    echo "BUILD: ${args}"
}  

如果我加载这个库,那么我的构建调用实际上都没有做任何事情。他们只是回应那个被调用的构建以及什么args。这对于测试流水线脚本非常有用,可以确保脚本逻辑本身正确,同时避免实际执行长时间运行的任务。

但测试只是其中的一个用途。我真正想做的是装饰buildnodestage以及一些其他步骤来捕获使用指标。例如,记录每个分配的节点,分配的时间以及分配的时间。这对于容量分析和规划非常有用。

另一个应用程序是强制执行某些策略,这样节点总是按标签分配,而不是通过显式节点名称分配。

为了完成任何这项工作,node.groovy装饰器需要某种方式来调用它正在屏蔽的真实node步骤。 任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:3)

今天晚上想出来了。所有dsl步骤都可以作为steps变量的成员使用。这让我可以这样写:

@Library('pipeline-utils')
import mycompany.analytics.AnalyticsClient
import mycompany.analytics.Utils

node('linux') { sh 'echo test' }

def node(String label, Closure nodeAction) {
    def executionTime
    def actualNode
    def allocationTime = Utils.startMeasureDuration()

    steps.node(label){
        allocationTime.stop()
        actualNode = env.NODE_NAME
        executionTime = Utils.measureDuration(nodeAction)
    }

    def fact = [
        type: 'node_usage', 
        job_name: currentBuild.getProjectName(),
        node_label: label,
        node_name: actualNode,
        ts: allocationTime.startTS,
        time_in_queue: allocationTime.durationMillis,
        execution_time: executionTime.durationMillis
    ]
    AnalyticsClient.recordFact(fact)

    if(!executionTime.success) throw executionTime.exception
}