Jenkins 如何在重写全局库函数时调用DLS步骤

Jenkins 如何在重写全局库函数时调用DLS步骤,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,通过实验,我确定我可以通过在共享库中定义同名的全局函数来屏蔽内置管道步骤,例如build 例如: (root) +- vars +- build.groovy 其中build.groovy是: def call(Map args) { echo "BUILD: ${args}" } 如果我加载这个库,那么我对build的调用实际上都没有任何作用。他们只是回显调用的构建和args。这对于测试管道脚本非常有用,以确保脚本逻辑本身正确,同时避免实际执行长时间运行的任务 但测

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

例如:

(root)
 +- vars
    +- build.groovy 
其中build.groovy是:

def call(Map args) {
    echo "BUILD: ${args}"
}  
如果我加载这个库,那么我对build的调用实际上都没有任何作用。他们只是回显调用的构建和args。这对于测试管道脚本非常有用,以确保脚本逻辑本身正确,同时避免实际执行长时间运行的任务

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

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


不过,要使这些工作正常进行,
node.groovy
decorator需要某种方法来调用它正在屏蔽的真正的
node
步骤。你知道怎么做吗?

今晚就知道了。所有dsl步骤都可作为
步骤
变量的成员使用。这让我可以写一些东西,比如:

@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
}

今天晚上我就知道了。所有dsl步骤都可作为
步骤
变量的成员使用。这让我可以写一些东西,比如:

@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
}

只是有同样的问题,救了我的命!很高兴它有帮助。只是有同样的问题,救了我的命!很高兴这有帮助。