web-dev-qa-db-fra.com

Comment gérez-vous les variables globales dans un pipeline déclaratif?

Auparavant a posé une question sur la façon d'écraser les variables définies dans une directive d'environnement et il semble que ce ne soit pas possible.

Je veux définir une variable dans une étape et la rendre accessible à d'autres étapes. Dans un pipeline déclaratif, il semble que la seule façon de le faire soit dans un bloc de script {}.

Par exemple, je dois définir des vars après le paiement. Donc, à la fin de l'étape de paiement, j'ai un bloc de script {} qui définit ces variables et elles sont accessibles dans d'autres étapes.

Cela fonctionne, mais ça ne va pas. Et pour des raisons de lisibilité, je préférerais de loin déclarer ces variables en haut du pipeline et les faire écraser. Cela signifierait donc avoir une étape "définir les variables" au début avec un bloc de script {} qui définit simplement les variables - c'est moche.

Je suis presque sûr qu'il me manque une caractéristique évidente ici. Les pipelines déclaratifs ont-ils une fonction de variable globale ou dois-je utiliser un script {}

7
red888

Comme le dit @mkobit, vous pouvez définir la variable au niveau global hors du bloc de pipeline. As-tu essayé ça?

def my_var
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                my_var = 'value1'
            }
        }

        stage('Example2') {
            steps {
                printl(my_var)
            }
        }

    }
}
7
Daniel Majano

Cela fonctionne sans erreur,

def my_var
 pipeline {
  agent any
   environment {
     REVISION = ""
   }
   stages {
    stage('Example') {
        steps {
            script{
                my_var = 'value1'
            }
        }
    }

    stage('Example2') {
        steps {
             script{
                echo "$my_var" 
             }

        }
    }

 }
}
12
Viraj

La réponse de @ Sameera est bonne pour la plupart des cas d'utilisation. J'ai eu un problème avec l'ajout de l'opérateur += bien que. Donc, cela n'a PAS travail (MissingPropertyException):

def globalvar = ""
pipeline {
  stages {
    stage("whatever) {
      steps {
        script {
          globalvar += "x"
        }
      }
    }
  }
}

Mais cela a fonctionné:

globalvar = ""
pipeline {
  stages {
    stage("whatever) {
      steps {
        script {
          globalvar += "x"
        }
      }
    }
  }
}
0
akostadinov

Pour les chaînes, ajoutez-le au bloc "environnement":

pipeline {
  environment {
    myGlobalValue = 'foo'
  }
}

Mais pour les variables non-chaîne, la solution la plus simple que j'ai trouvée pour les pipelines déclaratifs est d'encapsuler les valeurs dans une méthode.

Exemple:

pipeline {
  // Now I can reference myGlobalValue() in my pipeline.
  ...
}

def myGlobalValue() {
    return ['A', 'list', 'of', 'values']

// I can also reference myGlobalValue() in other methods below
def myGlobalSet() {
    return myGlobalValue().toSet()
}
0
txace