99 votes

Comment passer des variables entre les étapes d'un pipeline déclaratif Jenkins ?

Comment faire passer des variables entre les étapes d'un pipeline déclaratif ?

Dans un pipeline scripté, je suppose que la procédure consiste à écrire dans un fichier temporaire, puis à lire le fichier dans une variable.

Comment puis-je faire cela dans un pipeline déclaratif ?

Par exemple, je veux déclencher la création d'un autre travail, en fonction d'une variable créée par une action du shell.

stage("stage 1") {
    steps {
        sh "do_something > var.txt"
        // I want to get var.txt into VAR
    }
}
stage("stage 2") {
    steps {
        build job: "job2", parameters[string(name: "var", value: "${VAR})]
    }
}

0 votes

Pour la partie écriture et lecture, il y a shash/unstash btw.

1 votes

Et si vous utilisiez variables d'environnement qui agissent comme des variables globales ?

112voto

burnettk Points 6712

Si vous voulez utiliser un fichier (puisqu'un script est la chose qui génère la valeur dont vous avez besoin), vous pourriez utiliser readFile comme indiqué ci-dessous. Si ce n'est pas le cas, utilisez sh avec le script comme indiqué ci-dessous :

// Define a groovy local variable, myVar.
// A global variable without the def, like myVar = 'initial_value',
// was required for me in older versions of jenkins. Your mileage
// may vary. Defining the variable here maybe adds a bit of clarity,
// showing that it is intended to be used across multiple stages.
def myVar = 'initial_value'

pipeline {
  agent { label 'docker' }
  stages {
    stage('one') {
      steps {
        echo "1.1. ${myVar}" // prints '1.1. initial_value'
        sh 'echo hotness > myfile.txt'
        script {
          // OPTION 1: set variable by reading from file.
          // FYI, trim removes leading and trailing whitespace from the string
          myVar = readFile('myfile.txt').trim()
        }
        echo "1.2. ${myVar}" // prints '1.2. hotness'
      }
    }
    stage('two') {
      steps {
        echo "2.1 ${myVar}" // prints '2.1. hotness'
        sh "echo 2.2. sh ${myVar}, Sergio" // prints '2.2. sh hotness, Sergio'
      }
    }
    // this stage is skipped due to the when expression, so nothing is printed
    stage('three') {
      when {
        expression { myVar != 'hotness' }
      }
      steps {
        echo "three: ${myVar}"
      }
    }
  }
}

0 votes

Peut-on utiliser cette variable avec when {} ?

2 votes

Vous pouvez aussi simplement utiliser def myVar et l'utiliser ensuite avec echo ${myVar} si vous voulez avoir votre configuration en haut du fichier ;)

4 votes

L'écriture dans un fichier n'est-elle pas très mauvaise et ne crée-t-elle pas aussi un disque indésirable ?

25voto

Zigzauer Points 111

Tout simplement :

  pipeline {
        parameters {
            string(name: 'custom_var', defaultValue: '')
        }

        stage("make param global") {
             steps {
               tmp_param =  sh (script: 'most amazing shell command', returnStdout: true).trim()
               env.custom_var = tmp_param
              }
        }
        stage("test if param was saved") {
            steps {
              echo "${env.custom_var}"
            }
        }
  }

0 votes

Selon la documentation indiquée par @KatieS, les paramètres définis dans le bloc parameters {} sont accessibles sous la forme ${params.custom_var} et non ${env.custom_var}. Les deux fonctionnent mais sont une variable différente qui peut contenir des valeurs différentes. Mais votre solution avec le bloc parameter{} fonctionne bien pour moi qui y accède via ${params.custom_var}.

4 votes

J'avais tort. parameters{} sont utilisés pour les paramètres fournis et semblent être immuables, essayer de les définir dans le pipeline (en plus de leur attribuer une valeur par défaut dans parameters{}) fera échouer l'étape sans aucun message d'erreur. Il faut donc utiliser env.custom_var. Dans ce cas, le bloc parameters{} peut être laissé de côté.

0 votes

Est-ce que cela fonctionne sur plusieurs fichiers Jenkins. Ce que j'essaie de faire, c'est de transmettre le dernier commit du dépôt de build.JenksinsFile à deploy.JenkinsFile ?

9voto

Emmanuel B. Points 109

J'ai eu un problème similaire car je voulais qu'un pipeline spécifique fournisse des variables et que de nombreux autres l'utilisent pour obtenir ces variables.

J'ai créé un pipeline my-set-env-variables

script
{
    env.my_dev_version = "0.0.4-SNAPSHOT"
    env.my_qa_version  = "0.0.4-SNAPSHOT"
    env.my_pp_version  = "0.0.2"
    env.my_prd_version = "0.0.2"
    echo " My versions  [DEV:${env.my_dev_version}] [QA:${env.my_qa_version}] [PP:${env.my_pp_version}] [PRD:${env.my_prd_version}]"
}

Je peux réutiliser ces variables dans un autre pipeline my-set-env-variables-test

script 
{
    env.dev_version = "NOT DEFINED DEV"
    env.qa_version  = "NOT DEFINED QA"
    env.pp_version  = "NOT DEFINED PP"
    env.prd_version = "NOT DEFINED PRD"
}

stage('inject variables') {

    echo "PRE DEV version = ${env.dev_version}"
    script 
    {
       def variables = build job: 'my-set-env-variables'
       def vars = variables.getBuildVariables()
      //println "found variables" + vars
      env.dev_version = vars.my_dev_version
      env.qa_version  = vars.my_qa_version
      env.pp_version  = vars.my_pp_version
      env.prd_version = vars.my_prd_version
    }
}

stage('next job') {
    echo "NEXT JOB DEV version = ${env.dev_version}"
    echo "NEXT JOB QA version = ${env.qa_version}"
    echo "NEXT JOB PP version = ${env.pp_version}"
    echo "NEXT JOB PRD version = ${env.prd_version}"

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X