파이프 라인의 sh DSL 명령에서 stdout을 캡처 할 수 있습니까?


92

예를 들면 :

var output=sh "echo foo";
echo "output=$output";

나는 얻을 것이다 :

output=0

그래서 분명히 stdout이 아닌 종료 코드를 얻습니다. stdout을 파이프 라인 변수로 캡처하여 다음과 같은 output=foo 결과를 얻을 수 있습니까?

답변:


227

지금sh스텝 지지체 복귀 표준 출력 파라미터를 제공하여 returnStdout.

// These should all be performed at the point where you've
// checked out your sources on the slave. A 'git' executable
// must be available.
// Most typical, if you're not cloning into a sub directory
gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
// short SHA, possibly better for chat notifications, etc.
shortCommit = gitCommit.take(6)

이 예를 참조하십시오 .


10
.trim(), 그렇지 않으면 당신은 줄 끝에 개행 문자가 나타날 수 있습니다,이 답변의 일부를
윌 Munn

2
APPEND --shortrev-parse수있는 것과 직접 짧은 해시를 얻을
레온

나는 이런 식으로도 문자열로 출력을 변환 할 수 없었 있는지 무엇을 실패의 원인이 있지만gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').toString().trim()
발 크리쉬나

안녕하세요, '.take (6)'는 무엇을 의미하나요?
Vano

1
@Vano는 Groovy 메서드 take ()를 참조하며이 경우 처음 6자를 가져옵니다. docs.groovy-lang.org/docs/groovy-2.3.2/html/api/org/codehaus/…
ahillman3

47

참고 : 연결된 Jenkins 문제는 이후 해결되었습니다.

JENKINS-26133 에서 언급했듯이 쉘 출력을 변수로 얻을 수 없었 습니다. 임시 파일에서 쓰기 읽기 사용을 제안하는 해결 방법입니다. 따라서 귀하의 예는 다음과 같습니다.

sh "echo foo > result";
def output=readFile('result').trim()
echo "output=$output";

21
신규 사용자의 경우 아래 의 답변 stackoverflow.com/a/38912813/345845 를 참조하십시오. 이후 단계에 returnStdout전달 된 새 매개 변수 로 더 쉬워졌습니다 sh.
밥 티스트 Mathus

2
"셸 출력을 변수로 얻을 수 없습니다"-사실이 아닙니다. 이것은 해킹이며 정답은 returnStdout입니다.
Graham

4
당신이 필요로하는 경우이 실제로 좋은 대답이다 유일한 시간은 모두stdout 과를 exit status쉘 명령에서. 다른 경우에는 returnStdout매개 변수를 사용하십시오 .
사이먼 포스 버그

4

이 시도:

def get_git_sha(git_dir='') {
    dir(git_dir) {
        return sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
    }
}

node(BUILD_NODE) {
    ...
    repo_SHA = get_git_sha('src/FooBar.git')
    echo repo_SHA
    ...
}

테스트 대상 :

  • 젠킨스 버전 2.19.1
  • 파이프 라인 2.4

3

이 함수를 사용하여 StdErr StdOut 및 리턴 코드를 캡처 할 수도 있습니다.

def runShell(String command){
    def responseCode = sh returnStatus: true, script: "${command} &> tmp.txt" 
    def output =  readFile(file: "tmp.txt")

    if (responseCode != 0){
      println "[ERROR] ${output}"
      throw new Exception("${output}")
    }else{
      return "${output}"
    }
}

주의:

&>name means 1>name 2>name -- redirect stdout and stderr to the file name

1

짧은 버전은 다음과 같습니다.

echo sh(script: 'ls -al', returnStdout: true).result


0

나는 같은 문제가 있었고 잘못된 블록에서 시도하고 있다는 것을 알게 된 후 발견 된 거의 모든 것을 시도했습니다. 환경 블록에 있어야하지만 단계 블록에서 시도했습니다.

        stage('Release') {
                    environment {
                            my_var = sh(script: "/bin/bash ${assign_version} || ls ", , returnStdout: true).trim()
                                }
                    steps {                                 
                            println my_var
                            }
                }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.