it-swarm.com.de

Zugriff auf Parameter in einem parametrisierten Build

Wie kann auf parameters im Abschnitt "Dieser Build wird parametrisiert" eines Jenkins-Jobs "Workflow" zugegriffen werden?

TESTFALL  

  1. Erstellen Sie einen WORKFLOW-Job.
  2. Aktivieren Sie "Dieser Build ist parametrisiert".
  3. Fügen Sie einen STRING PARAMETER foo mit dem Standardwert bar text hinzu.
  4. Fügen Sie den Code unten zu Workflow Script hinzu:

    node()
    {
         print "DEBUG: parameter foo = ${env.foo}"
    }
    
  5. Job ausführen.

ERGEBNIS

DEBUG: parameter foo = null

47
Vizionz

Ich denke, dass die Variable direkt verfügbar ist und nicht über env, wenn Sie das Workflow-Plugin verwenden.

node()
{
    print "DEBUG: parameter foo = ${foo}"
}
65
Nick

Ich habe einige Lösungen aus diesem Thread ausprobiert. Es schien zu funktionieren, aber meine Werte waren immer wahr und ich bin auch auf das folgende Problem gestoßen: JENKINS-40235

Es gelang mir, Parameter in groovy jenkinsfile mit der folgenden Syntax zu verwenden: params.myVariable

Hier ist ein Arbeitsbeispiel:

Lösung

print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"

Ein ausführlicheres (und funktionierendes) Beispiel:

node() {
   // adds job parameters within jenkinsfile
   properties([
     parameters([
       booleanParam(
         defaultValue: false,
         description: 'isFoo should be false',
         name: 'isFoo'
       ),
       booleanParam(
         defaultValue: true,
         description: 'isBar should be true',
         name: 'isBar'
       ),
     ])
   ])

   // test the false value
   print 'DEBUG: parameter isFoo = ' + params.isFoo
   print "DEBUG: parameter isFoo = ${params.isFoo}"
   sh "echo sh isFoo is ${params.isFoo}"
   if (params.isFoo) { print "THIS SHOULD NOT DISPLAY" }

   // test the true value
   print 'DEBUG: parameter isBar = ' + params.isBar
   print "DEBUG: parameter isBar = ${params.isBar}"
   sh "echo sh isBar is ${params.isBar}"
   if (params.isBar) { print "this should display" }
}

Ausgabe

[Pipeline] {
[Pipeline] properties
WARNING: The properties step will remove all JobPropertys currently configured in this job, either from the UI or from an earlier properties step.
This includes configuration for discarding old builds, parameters, concurrent builds and build triggers.
WARNING: Removing existing job property 'This project is parameterized'
WARNING: Removing existing job property 'Build triggers'
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] sh
[wegotrade-test-job] Running Shell script
+ echo sh isFoo is false
sh isFoo is false
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] sh
[wegotrade-test-job] Running Shell script
+ echo sh isBar is true
sh isBar is true
[Pipeline] echo
this should display
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Ich habe ein Pull Request gesendet, um das irreführende Pipeline-Tutorial # build-parameters zu aktualisieren, das besagt, dass "sie als Groovy-Variablen mit demselben Namen zugänglich sind". ;)

Bearbeiten: Wie Jesse Glick darauf hinwies: Versionshinweise gehe auf weitere Details ein

Sie sollten auch das Pipeline-Job-Plugin auf Version 2.7 oder höher aktualisieren, damit die Build-Parameter als Umgebungsvariablen definiert werden und somit als globale Groovy-Variablen zugänglich sind.

47
GabLeRoux

Wenn Sie einen Build-Parameter hinzufügen, foo, Wird er in etwas konvertiert, das wie eine "bloße Variable" Fungiert.

node {
   echo foo
}

Wenn Sie sich die Implementierung des Workflow-Skripts anschauen, werden Sie feststellen, dass bei der Ausführung eines Skripts eine Klasse namens WorkflowScript dynamisch generiert wird. Alle Anweisungen im Skript werden im Kontext dieser Klasse ausgeführt. Alle Build-Parameter, die an dieses Skript übergeben werden, werden in Eigenschaften konvertiert, auf die von dieser Klasse aus zugegriffen werden kann.

Zum Beispiel können Sie Folgendes tun:

node {
    getProperty("foo")
}

Wenn Sie neugierig sind, haben Sie hier ein Workflow-Skript geschrieben, das versucht, die Build-Parameter, Umgebungsvariablen und Methoden der WorkflowScript-Klasse auszudrucken.

node {
   echo "I am a "+getClass().getName()

   echo "PARAMETERS"
   echo "=========="
   echo getBinding().getVariables().getClass().getName()
   def myvariables = getBinding().getVariables()
   for (v in myvariables) {
       echo "${v} " + myvariables.get(v)
   }
   echo STRING_PARAM1.getClass().getName()

   echo "METHODS"
   echo "======="
   def methods = getMetaClass().getMethods()

   for (method in methods) {
       echo method.getName()    
   } 

   echo "PROPERTIES"
   echo "=========="
   properties.each{ k, v -> 
       println "${k} ${v}" 
   }
   echo properties
   echo properties["class"].getName()

   echo "ENVIRONMENT VARIABLES"
   echo "======================"
   echo "env is " + env.getClass().getName()
   def envvars = env.getEnvironment()
   envvars.each{ k, v ->
        println "${k} ${v}"
   }
}

Hier ist ein weiteres Codebeispiel, das ich ausprobiert habe, wo ich testen wollte, ob Ein Build-Parameter gesetzt war oder nicht.

node {
   groovy.lang.Binding myBinding = getBinding()
   boolean mybool = myBinding.hasVariable("STRING_PARAM1")
   echo mybool.toString()
   if (mybool) {
       echo STRING_PARAM1
       echo getProperty("STRING_PARAM1")
   } else {
       echo "STRING_PARAM1 is not defined"
   }

   mybool = myBinding.hasVariable("DID_NOT_DEFINE_THIS")
   if (mybool) {
       echo DID_NOT_DEFINE_THIS
       echo getProperty("DID_NOT_DEFINE_THIS")
   } else {
       echo "DID_NOT_DEFINE_THIS is not defined"
   }
}
11
Craig Rodrigues

Fügen Sie der Parametervariable das Präfix "params." .__ hinzu. Beispiel:

params.myParam

Vergessen Sie nicht: Wenn Sie eine Methode von myParam verwenden, sollten Sie sie unter "Skriptgenehmigung" genehmigen.

6
burtsevyg

Verwenden Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen

z.B. echo "$foo" im Gegensatz zu echo '$foo'

Wenn Sie Ihre Pipeline so konfiguriert haben, dass Parameter mit der Option Mit Parametern erstellen akzeptiert werden, sind diese Parameter als Groovy-Variablen mit demselben Namen verfügbar. Siehe Here .

Sie können das Semikolon (;), die Klammern (( and )) löschen und einfache Anführungszeichen (') anstelle von double (") verwenden, wenn Sie keine Variablenersetzungen durchführen müssen. Siehe Here . Dies hat mich auf mein Problem aufmerksam gemacht, obwohl ich herausgefunden habe, dass nur das Doppelte (") erforderlich ist, damit es funktioniert.

5
Ken Goodridge

Das folgende Snippet gibt Ihnen Zugriff auf alle Job-Parameter

    def myparams = currentBuild.rawBuild.getAction(ParametersAction)
    for( p in myparams ) {
        pMap[p.name.toString()] = p.value.toString()
    }
2
ScaryGhast

Bitte beachten Sie, dass sich die Art und Weise geändert hat, in der auf Build-Parameter innerhalb von Pipeline-Skripts (Pipeline-Plugin) zugegriffen wird. Dieser Ansatz:

getBinding().hasVariable("MY_PARAM")

Funktioniert nicht mehr. Bitte versuchen Sie es stattdessen:

def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false
2
Maksim

Hoffe, der folgende Code funktioniert für Sie:

def item = hudson.model.Hudson.instance.getItem('MyJob')

def value = item.lastBuild.getEnvironment(null).get('foo')
1
DevD

Sie können auch die Anweisung parameters verwenden, um Ihren Build zu parametrisieren und auf Parameter zuzugreifen:

Doc: Pipeline-Syntax: Parameter

Beispiel:

pipeline{

agent { node { label 'test' } }
options { skipDefaultCheckout() }

parameters {
    string(name: 'suiteFile', defaultValue: '', description: 'Suite File')
}
stages{

    stage('Initialize'){

        steps{

          echo "${params.suiteFile}"

        }
    }
 }
0
Shivankur Pal

Wie pro Pipeline Plugin Tutorial :

Wenn Sie Ihre Pipeline so konfiguriert haben, dass sie Parameter akzeptiert, wenn sie erstellt wird - Build with Parameters -, können Sie auf sie als Groovy variables mit demselben Namen zugreifen.

Versuchen Sie also, direkt auf die Variable zuzugreifen, z.

node()
{
     print "DEBUG: parameter foo = " + foo
     print "DEBUG: parameter bar = ${bar}"
}
0
kenorb