通过实验,我已经确定我可以通过在共享库中定义同名的全局函数来掩盖内置管道步骤,例如build
。
示例:
(root)
+- vars
+- build.groovy
build.groovy是:
def call(Map args) {
echo "BUILD: ${args}"
}
如果我加载这个库,那么我的构建调用实际上都没有做任何事情。他们只是回应那个被调用的构建以及什么args。这对于测试流水线脚本非常有用,可以确保脚本逻辑本身正确,同时避免实际执行长时间运行的任务。
但测试只是其中的一个用途。我真正想做的是装饰build
,node
,stage
以及一些其他步骤来捕获使用指标。例如,记录每个分配的节点,分配的时间以及分配的时间。这对于容量分析和规划非常有用。
另一个应用程序是强制执行某些策略,这样节点总是按标签分配,而不是通过显式节点名称分配。
为了完成任何这项工作,node.groovy
装饰器需要某种方式来调用它正在屏蔽的真实node
步骤。 任何想法如何做到这一点?
答案 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
}