2016-12-01 4 views
0

Durch Experimente habe ich festgestellt, dass ich die integrierten Pipeline-Schritte wie build maskieren kann, indem ich eine globale Funktion mit demselben Namen in der gemeinsam genutzten Bibliothek definiere.So rufen Sie DLS auf Überschreiben der globalen Bibliotheksfunktion

Beispiel:

(root) 
+- vars 
    +- build.groovy 

wo build.groovy ist:

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

Wenn ich diese Bibliothek laden, dann keiner meiner Anrufe tun wirklich etwas zu bauen. Sie hören einfach, dass Build aufgerufen wurde und mit welchen Argumenten. Dies ist sehr nützlich, um Pipeline-Skripts zu testen, um sicherzustellen, dass die Skriptlogik korrekt ist und gleichzeitig lange laufende Aufgaben vermieden werden.

Aber das Testen ist nur eine Verwendung davon. Was ich wirklich tun möchte, ist dekorieren build, node, stage und ein paar andere Schritte zum Erfassen von Nutzungsmetriken. Zum Beispiel, um für jeden Knoten, der jemals zugewiesen wurde, aufzuzeichnen, zu welcher Tageszeit er zugeordnet wurde und wie lange er zugewiesen wurde. Dies könnte für die Kapazitätsanalyse und -planung sehr nützlich sein.

Eine andere Anwendung wäre das Erzwingen bestimmter Richtlinien, so dass Knoten immer nach Label und niemals nach expliziten Knotennamen zugewiesen werden.

Um dies jedoch funktionieren zu lassen, benötigt der node.groovy Dekorateur eine Möglichkeit, den echten node Schritt aufzurufen, den er maskiert. Irgendwelche Ideen wie man das macht?

Antwort

1

Dies heute Abend herausgefunden. Alle DSL-Schritte sind als Mitglieder der Variablen steps verfügbar. Was mir erlaubt, etwas zu schreiben wie:

@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

hatte nur das gleiche Problem, rettete mein Leben! – Badgerati

+0

Froh, dass es geholfen hat. –