2016-12-01 14 views
0

実験を通して、buildなどの組み込みパイプラインステップをマスクすることができると判断しました。共有ライブラリで同じ名前のグローバル関数を定義します。グローバルライブラリ関数のオーバーライドでDLSステップを呼び出す方法

例:

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

私はこのライブラリをロードする場合は、何かを実際に構築するために私のコールのどれも:build.groovyはありません

(root) 
+- vars 
    +- build.groovy 

。彼らはビルドが呼び出され、何がargsであるかをエコーし​​ます。これは、パイプラインスクリプトをテストして、実際に長時間実行されるタスクを回避しながら、スクリプトロジック自体が正しいことを確認するのに非常に役立ちます。

しかし、このテストは1つのテストに過ぎません。私が本当にやりたいことは、buildnodestageなどの使い方を覚えておくことです。たとえば、割り当てられたすべてのノード、割り当てられた時刻、割り当てられた時間などを記録します。これは容量分析と計画に本当に便利です。

別のアプリケーションでは、ノードは常にラベルで割り当てられ、明示的なノード名では決して割り当てられないように、特定のポリシーを適用することがあります。

この作業を行うには、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

喜んで助けました。 –

関連する問題