Як передавати змінні між етапами в декларативному конвеєрі Дженкінса?


83

Як передавати змінні між етапами декларативного конвеєру?

У сценарії конвеєра я вважаю, що процедура полягає у записі у тимчасовий файл, а потім читання файлу у змінну.

Як це зробити в декларативному конвеєрі?

Наприклад, я хочу ініціювати побудову іншої роботи на основі змінної, створеної дією оболонки.

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})]
    }
}

У частині запису та читання є shash / unstash btw.
sebkraemer

1
а як щодо використання змінних середовища , які діють як глобальні змінні?
Веверке

Відповіді:


99

Якщо ви хочете використовувати файл (оскільки сценарій - це те, що генерує потрібне вам значення), ви можете використовувати, readFileяк показано нижче. Якщо немає, то використовуйте shз scriptопцією , як показано нижче:

// Define a groovy global variable, myVar.
// A local, def myVar = 'initial_value', didn't work for me.
// 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.
myVar = 'initial_value'

pipeline {
  agent { label 'docker' }
  stages {
    stage('one') {
      steps {
        echo "${myVar}" // prints '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()

          // OPTION 2: set variable by grabbing output from script
          myVar = sh(script: 'echo hotness', returnStdout: true).trim()
        }
        echo "${myVar}" // prints 'hotness'
      }
    }
    stage('two') {
      steps {
        echo "${myVar}" // prints 'hotness'
      }
    }
    // this stage is skipped due to the when expression, so nothing is printed
    stage('three') {
      when {
        expression { myVar != 'hotness' }
      }
      steps {
        echo "three: ${myVar}"
      }
    }
  }
}

1
ви також можете просто використовувати def myVarі використовувати його згодом, echo ${myVar}якщо ви хочете, щоб ваша конфігурація була у верхній частині файлу;)
bastianwegge

4
Хіба не писати, щоб надсилати дуже злі файли і також створювати небажані диски?
Діркос

4
Ви маєте рацію @Dirkos, але є кращий спосіб досягти того, про що запитували, не залучаючи читання / запис файлів. Дивіться цей відповідь stackoverflow.com/a/43881731/1053510
user1053510

1
Я розміщу свій коментар з іншої відповіді, але я б рекомендував використовувати withEnvобгортку на другому етапі, щоб ви могли використовувати змінну в контексті sh. В іншому випадку він надрукує порожній рядок. Принаймні, це стосується Дженкінса 2.124.
Серхіо

1
@ConradB для використання цієї техніки тут має бути добре, якщо ви встановлюєте змінну перед паралельним етапом (у прикладі вище, етап "три" - це місце, де ви повинні виконувати роботу, яку потрібно робити паралельно).
burnettk

17

Просто:

  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}"
            }
        }
  }

Згідно з документом, на який вказує @KatieS, параметри, визначені в блоці параметрів {}, доступні як $ {params.custom_var}, а не $ {env.custom_var}. Обидва працюють, але є різною змінною, яка може містити різні значення. Але ваше рішення з параметром {} bloc чудово працює для мене, коли я отримую до них доступ через $ {params.custom_var}
Мартін,

4
Я був неправий. параметри {} використовуються для використовуваних наданих параметрів і здаються незмінними, намагаючись встановити їх у конвеєрі (поряд із присвоєнням їм значення за замовчуванням у параметрах {}) сценарій провалиться без повідомлення про помилку. Отже, env.custom_var - це шлях. У цьому випадку блок параметрів {} можна не використовувати.
Мартін

Чи працює це в декількох файлах Дженкінса. Що я намагаюся зробити, це передати останній коміт на репо з build.JenksinsFile для розгортання.JenkinsFile?
Gurpreet Singh Drish

у будь-якому разі вставити щось на зразок $ {workspace} у параметри? як рядок (ім'я: 'custom_var', defaultValue: "$ {workspace} / a")
yuxh

2
Не впевнений, як це буде працювати. Я не думаю, що ви можете безпосередньо встановити змінну всередині блоку "кроки", не використовуючи крок "сценарію".
Арнаб

6

У мене була подібна проблема, оскільки я хотів, щоб один конкретний конвеєр надавав змінні та багато інших, які використовують його для отримання цих змінних.

Я створив конвеєр 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}]"
}

Я можу повторно використовувати ці змінні в іншому конвеєрі 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}"

}


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.