2016-12-01 55 views
0

通過實驗,我確定可以通過在共享庫中定義同名全局函數來掩蓋內置管線步驟,如build如何調用DLS重寫全局庫函數的步驟

例子:

(root) 
+- vars 
    +- build.groovy 

其中build.groovy是:

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

如果我加載這個庫,那麼沒有我的電話的實際構建做任何事情。他們只是迴應那個構建被稱爲和什麼參數。這對測試管道腳本非常有用,以確保腳本邏輯本身是正確的,同時避免實際執行長時間運行的任務。

但是測試只是這個的一個用法。我真正想要做的是裝飾build,node,stage和一些其他步驟來捕獲使用指標。例如,記錄每個分配的節點,分配的時間以及分配的時間。這對於容量分析和規劃可能非常有用。

另一個應用程序將執行某些策略,以便節點總是按標籤分配,而不是按顯式節點名稱分配。

儘管如此,node.groovy修飾器需要一些方法來調用它掩蓋的真實node步驟。 任何想法如何做到這一點?

回答

1

今天晚上想通了。所有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 
} 
+0

剛剛有同樣的問題,救了我的命! – Badgerati

+0

很高興幫助。 –