선언적 Jenkins 파이프 라인의 단계간에 변수를 어떻게 전달합니까?


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
전역 변수처럼 작동 하는 환경 변수 를 사용 하는 것은 어떻습니까?
Veverke

답변:


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
파일에 쓰는 것이 매우 사악하고 원치 않는 디스크도 생성되지 않습니까?
Dirkos

4
@Dirkos 맞지만 파일 읽기 / 쓰기없이 요청 된 것을 달성하는 더 좋은 방법이 있습니다. 이 답변보기 stackoverflow.com/a/43881731/1053510
user1053510 dec.

1
다른 답변에서 내 의견을 다시 게시하고 있지만 withEnv2 단계에서 래퍼를 사용하는 것이 좋습니다 . 그래야 컨텍스트에서 변수를 사용할 수 있습니다 sh. 그렇지 않으면 빈 문자열을 인쇄합니다. 적어도 Jenkins 2.124에서는 그렇습니다.
Sergio

1
@ConradB 병렬 단계 이전에 변수를 설정하는 한 여기에서 기술을 사용하는 것이 잘 작동합니다 (위의 예에서 "3 단계"는 병렬로 수행해야하는 작업을 수행합니다).
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가 가리키는 문서에 따르면 매개 변수 {} 블록에 정의 된 매개 변수는 $ {env.custom_var}가 아닌 $ {params.custom_var}로 액세스됩니다. 둘 다 작동하지만 다른 값을 포함 할 수있는 다른 변수입니다. 하지만 매개 변수 {} 블록을 사용하는 솔루션은 $ {params.custom_var}를 통해 액세스 할 때 잘 작동합니다
Martin

4
내가 틀렸어. parameters {}는 사용 된 제공된 매개 변수에 사용되며 변경 불가능한 것처럼 보입니다. 파이프 라인에서 설정하려고하면 (parameter {}에 기본값을 할당하는 것 외에) 오류 메시지없이 스테이지가 실패합니다. 따라서 env.custom_var가 갈 길입니다. 이 경우 parameters {} 블록을 생략 할 수 있습니다.
Martin

여러 Jenkins 파일에서 작동합니까? 내가하려는 것은 build.JenksinsFile에서 deploy.JenkinsFile로 리포지토리의 최신 커밋을 전달하는 것입니다.
Gurpreet Singh Drish

어쨌든 매개 변수에 $ {workspace}와 같은 것을 삽입하려면? like string (name : 'custom_var', defaultValue : "$ {workspace} / a")
yuxh

2
이것이 어떻게 작동하는지 확실하지 않습니다. "스크립트"단계를 사용하지 않고 "단계"블록 내에 변수를 직접 설정할 수 없다고 생각합니다.
Arnab

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

}


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.