젠킨스 파이프 라인 작업 내에서 모든`env` 속성을 나열하는 방법은 무엇입니까?


105

jenkins 2.1 빌드 파이프 라인이 주어지면 jenkins envnode{}. 예를 들어 다음 BRANCH_NAME으로 액세스 할 수 있습니다.

node {
    echo ${env.BRANCH_NAME}
    ...

젠킨스 파이프 라인 내의 모든 env 속성 을 에코하고 싶습니다.

... 사전에 모든 속성을 알지 못한다고 생각합니다 .

다음과 같은 코드를 찾고 있습니다.

node {
    for(e in env){
        echo e + " is " + ${e}
    }
    ...

다음과 같은 것을 에코합니다.

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env는지도입니다. 정상적인 반복을 시도 했습니까? like-env.each {println it}
Jayan


3
Afaik env는 환경 변수를 캡슐화합니다. 나는 당신이 그것을 반복 할 수 있다고 생각하지 않습니다. Linux에서는 'sh env'를, Windows에서는 'bat set'를 사용해보십시오.
Dominik Gebhart 2016 년

1
아래 내 댓글 당 @Renato @Jayan env.each { name, value -> println "Name: $name -> Value $value" }인쇄 Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

1
@ JamesThomasMoon1979 파이프 라인이 Groovy 폐쇄를 깨기 때문입니다. 예전 자바 스타일 (즉, new ClassName() { ... })이 맞으면 작동합니다. 또는 태그가 지정된 메소드에서 실행하면 @NonCPS클로저도 그 안에서 작동합니다.
다니엘 C. 소브랄

답변:



80

선언적 파이프 라인에 대한 Jenkins 문서 에 따르면 :

sh 'printenv'

Jenkins 스크립트 파이프 라인의 경우 :

echo sh(script: 'env|sort', returnStdout: true)

위의 내용은 편의를 위해 환경 변수도 정렬합니다.


1
printenv환경을 인쇄하는 쉘 명령 일 뿐이며 Jenkins에만 국한되지 않습니다. 인수가없는 것은 인수가없는 것과 같습니다 env. sh 'printenv | sort'DCL 또는 스크립팅 된 파이프 라인에서 작동 할 것이라고 확신 합니다.
simon.watts

테스트를 sh 'printenv | sort'거쳐 실제로 Jenkins 선언적 파이프 라인에서 작동합니다. fwiw sh 'env | sort'도 작동합니다 (둘 다 Jenkins 버전 2.46.1에서 테스트 됨). 원래 sh 'printenv'Jenkins 공식 문서에서 참조 되었기 때문에 언급 했습니다.
Wimateeka

1
returnStdout : true를 잃어 버리면 에코가 필요하지 않습니다. 이미 쉘 스크립트가 인쇄 한 것을 인쇄하는 것입니다.
Ed Randall

26

다음 작업 :

@NonCPS
def printParams() {
  env.getEnvironment().each { name, value -> println "Name: $name -> Value $value" }
}
printParams()

첫 번째 실행에서 실패 할 가능성이 높으며 젠킨스 샌드 박스에서 실행할 다양한 그루비 메서드를 승인해야합니다. 이것은 "젠킨스 / 진행중인 스크립트 승인 관리"에서 수행됩니다.

내가 포함 된 목록 :

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • 빌드 번호
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • 직업 이름
  • JOB_URL

1
작동하지 않습니다.java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
옥타비아

5
포함했는지 확인 했습니까 @NonCPS?
Joe C.

1
노드 블록 외부에서 작동하기 때문에 이것이 가장 좋은 대답 입니다. 감사합니다.
Gi0rgi0s

15

sh/ batstep 및 readFile다음을 사용하여 결과를 얻을 수 있습니다 .

node {
    sh 'env > env.txt'
    readFile('env.txt').split("\r?\n").each {
        println it
    }
}

불행히도 env.getEnvironment()매우 제한된 환경 변수 맵을 반환합니다.


1
sh 'env > env.txt'잘 작동하며 셸 프로세스에서 만든 환경 변수를 포함합니다. 기술 env.getEnvironment()에서 본 것의 하위 집합 인 Jenkins 세트 환경 변수 만 보여줍니다 sh 'env'. 또한 스크립트 보안 승인이 필요합니다 method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. env.each { name, value -> println "Name: $name -> Value $value" }@Renato @Jayan 이 권장하는 것은 인쇄 만합니다 Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

좋은!!! . 모든 ENV를 인쇄 할 수있는 것은 나를 젠킨스 2 세트 JOB_BASE_NAME의 var에 작업 이름 산세에게가에 살고있는 폴더를 포함 할 수 있도록 도와주었습니다 바르
빌 아게

윈도우에서 작동 버전 : 물론 좋지 않을까
바스 해멀

@Bas 해멀은 윈도우 버전의 "박쥐"로 "쉬"를 대체하려고
세바스티앙

2
오류 java.lang.UnsupportedOperationException : CPS 변환 클로저에서 public static java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) 호출이 아닙니다. 아직 지원됨 (JENKINS-26481); @NonCPS 방법에 캡슐화 또는 사용 자바 스타일의 루프
벤 매튜스

12

왜 이렇게 복잡합니까?

sh 'env'

(* nix에서) 필요한 작업을 수행합니다.


실행하려면 노드 블록이 필요합니다. 내 사용 사례의 경우 노드가 어떤 환경을 가질 지 처리 한 다음 특정 기준에 따라 노드를 회전해야합니다.
Bill Warner

10

다음은 모든 환경 변수를 나열하기 위해 파이프 라인 작업으로 추가 할 수있는 빠른 스크립트입니다.

node {
    echo(env.getEnvironment().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
    echo(System.getenv().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
}

그러면 시스템 및 Jenkins 변수가 모두 나열됩니다.


9

모든 환경 변수를 나열하는 크로스 플랫폼 방식 :

if (isUnix()) {
    sh env
}
else {
    bat set
}

7

나는 Blue Ocean 플러그인을 사용하고 각 환경 항목이 자체 블록을 얻는 것을 좋아하지 않았습니다. 모든 라인 이있는 블록을 원합니다 .

제대로 인쇄되지 않음 :

sh 'echo `env`'

제대로 인쇄되지 않음 :

sh 'env > env.txt'
for (String i : readFile('env.txt').split("\r?\n")) {
    println i
}

잘 인쇄 됨 :

sh 'env > env.txt'
sh 'cat env.txt'

잘 인쇄 됨 : (@mjfroehlich에 의해 언급 됨)

echo sh(script: 'env', returnStdout: true)

3

위의 답변은 이제 새로운 파이프 라인 구문으로 인해 구식입니다. 아래는 환경 변수를 인쇄합니다.

script {
        sh 'env > env.txt'
        String[] envs = readFile('env.txt').split("\r?\n")

        for(String vars: envs){
            println(vars)
        }
    }

1
1. 스크립트 블록에 있어야합니다. 2. 그들은 '그루비 스타일'고리를 깎아 내리고있다.
Eddie

for폐쇄와도없이 문제의 원인이됩니다 @NonCPS주석을.
drewish

2

순수 그루비 글로벌 읽어 솔루션 env모든 환경 변수를 인쇄하지 않는 변수 (예를 들어, 그들은에서 변수를 누락 environment에서, 블록 withEnv컨텍스트와 OS에서 시스템 특정 변수의 대부분). 쉘 단계를 사용하면 더 완전한 세트를 얻을 수 있지만node 컨텍스트 항상 원하지는 않습니다.

다음은 getContext현재 컨텍스트에 대해 파이프 라인 매개 변수를 포함한 전체 환경 변수 세트를 검색하고 인쇄 하는 단계를 사용하는 솔루션입니다 .

주의 사항 : Groovy 샌드 박스에서는 작동하지 않습니다. 하지만 신뢰할 수있는 공유 라이브러리에서 사용할 수 있습니다.

def envAll = getContext( hudson.EnvVars )
echo envAll.collect{ k, v -> "$k = $v" }.join('\n')

1

정말로 env목록 을 반복하고 싶다면 다음을 수행하십시오.

def envs = sh(returnStdout: true, script: 'env').split('\n')
envs.each { name  ->
    println "Name: $name"
}

0

질문에 언급 된 출력을 정확히 얻는 또 다른 방법 :

envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    println envvar[0]+" is "+envvar[1]
}

기준과 일치하는 환경 변수의 하위 집합을 사용하여 맵을 빌드하도록 쉽게 확장 할 수 있습니다.

envdict=[:]
envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    if (envvar[0].startsWith("GERRIT_"))
        envdict.put(envvar[0],envvar[1])
}    
envdict.each{println it.key+" is "+it.value}

0

스크립트 형태로 필요하다고 생각하지만 다른 사람이 Jenkins GUI를 통해 살펴보고자하는 경우 모든 빌드의 상황에 맞는 왼쪽 메뉴에서 "환경 변수"섹션을 선택하여 해당 목록을 찾을 수 있습니다. 프로젝트 선택 = > 빌드 선택 => 환경 변수

여기에 이미지 설명 입력


2
항상 사용할 수있는 것은 아닙니다.
shuckc

1
Jenkinsfiles에는 전혀 사용할 수 없다고 생각합니다. 스크린 샷은 자유형 빌드처럼 보입니다.
Jakub Bochenski

0

이것이 가장 쉬운 방법이라는 것을 알았습니다.

pipeline {
    agent {
        node {
            label 'master'
        }
    }   
    stages {
        stage('hello world') {
            steps {
                sh 'env'
            }
        }
    }
}

-1

젠킨스 인스턴스에서 모든 변수를 가져올 수 있습니다. 다음을 방문하십시오.

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / pipeline-syntax / globals
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.