2016-05-13 5 views
3

Ich habe den folgenden Anwendungsfall:Jenkins Pipelines: Re-Use-Arbeitsbereich, wenn ein externen Jenkins Pipeline Skript Laden

  1. Kasse/zieht eine bestimmte Git Revision, mit geschriebener Pipeline Skript
    (Ich brauche das, weil ich abrufen der Revision dynamisch)

  2. Von dieser Revision, legen Sie eine Jenkins-Pipeline-Datei, unter der sich zuvor Dateien ausgecheckt

  3. Diese Datei würde auf Dateien vertrauen aus dem gleichen Revision
    (also aus dem gleichen Arbeitsbereich) ausgecheckt

Problem: Die geladene Jenkins-Pipeline-Datei wird in einem neuen Arbeitsbereich ausgeführt. Aber es ist leer. Ich brauche diese Datei, um im selben alten Arbeitsplatz ausgeführt zu werden.

Ich dachte, vielleicht ist es wegen der Umgebung node, weil das Schlüsselwort node Arbeitsbereiche erstellt, wie in den Dokumenten erwähnt. Aber als ich versuchte, es außerhalb der node zu laden, hat Jenkins das wegen "Verlassen der Sandbox" verboten.

Hinweis: Die jenkins-Pipeline-Datei wird gefunden und wirklich ausgeführt. Das Problem ist während die Ausführung.


Bitte sehen Sie die Beispiel-Code:

Inlined Pipeline Skript

node('master') { 
    def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt' 

    checkout poll:false, 
    scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]], 
    doGenerateSubmoduleConfigurations:false, 
    extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[], 
    userRemoteConfigs:[[credentialsId:'...', url:'...']]] 

    load 'further-script-logic.jenkins' 
} 

Datei: Weiter Skript-logic.jenkins

node('master') { 
    // make use of certain files 
    // assumption: pwd() is the *same* workspace which were checked-out before 
    // problem: it's not, it's a new empty workspace 
} 

Antwort

2

Eine Art Workaround ist described here.

  1. Sie haben {...}() Klammern am Ende des Anrufer Skript verwenden
  2. Sie haben die genannt Skript neu zu schreiben einen Verschluss (a Lambda)
    {-> /* former code */ }

zurückzukehren Auf diese Weise "verschenken" Sie nicht die Steuerung des Programmablaufs an das ausgeführte Skript. Stattdessen verwenden Sie die zurückgegebene Schließung und "rufen Sie es selbst". Dies verhindert, dass Jenkins weitere Arbeitsbereiche erstellt.

Leider habe ich keine Ahnung, ob diese Lösung erlauben würde, mehrere Knoten im Caller-Skript und/oder im aufgerufenen Skript zu deklarieren.

Ich habe diese Änderungen in Ihren Beispielcode integriert.
Suchen Sie nach Linien, die mit "<--- CHANGE" markiert sind.

Inlined Pipeline Skript

node('master') { 
    def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt' 

    checkout poll:false, 
    scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]], 
    doGenerateSubmoduleConfigurations:false, 
    extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[], 
    userRemoteConfigs:[[credentialsId:'...', url:'...']]] 

    load 'further-script-logic.jenkins' 
}() // <--- CHANGE 1 

Datei: Weiter Skript-logic.jenkins

{-> // <--- CHANGE 2 
    node('master') { 
    // ..... 
    } 
} 
+0

Great! Und mehrere Knoten in genanntem Skript funktionieren! :) – Iviator

+0

Dieses "Feature" war unglaublich schwierig zu entdecken ... Ich bin begeistert, dass ich es gefunden habe, muss aber besser dokumentiert werden, mehrere Executoren pro Pipeline zu erzeugen ist irgendwie lächerlich und fast fehlerhaft, wenn Sie mich fragen, dies muss ein Kontrollkästchen Feature "verkettete Skriptausführung" oder etwas in dieser Richtung sein – sloven

Verwandte Themen