Programing

Jenkinsfile (groovy)에서 변수로 쉘 명령의 출력을 얻는 방법은 무엇입니까?

crosscheck 2020. 5. 24. 12:56
반응형

Jenkinsfile (groovy)에서 변수로 쉘 명령의 출력을 얻는 방법은 무엇입니까?


Jenkinsfile (Groovy)에 이와 같은 것이 있으며 나중에 정보를 사용하기 위해 stdout 및 종료 코드를 변수에 기록하려고합니다.

sh "ls -l"

특히 내부에서 어떤 종류의 그루비 코드도 실행할 수없는 것처럼 보이기 때문에 Jenkinsfile어떻게 해야 합니까?


파이프 라인 sh단계 의 최신 버전을 사용하면 다음을 수행 할 수 있습니다.

// Git committer email
GIT_COMMIT_EMAIL = sh (
    script: 'git --no-pager show -s --format=\'%ae\'',
    returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"

다른 기능은 returnStatus옵션입니다.

// Test commit message for flags
BUILD_FULL = sh (
    script: "git log -1 --pretty=%B | grep '\\[jenkins-full]'",
    returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"

문제를 기반으로 추가 된 옵션 입니다.

명령에 대한 공식 문서참조하십시오 sh.


빠른 답변은 다음과 같습니다.

sh "ls -l > commandResult"
result = readFile('commandResult').trim()

sh 단계의 결과를 얻을 수있는 기능 요청이 있다고 생각하지만, 아는 한 현재 다른 옵션은 없습니다.

편집 : JENKINS-26133

EDIT2 : 어떤 버전인지 확실하지 않지만 sh / bat 단계는 표준 출력을 반환 할 수 있습니다.

def output = sh returnStdout: true, script: 'ls -l'

현재 파이프 라인 버전을 기본적으로 지원 returnStdout하고 returnStatus가능에서 출력 또는 상태를 얻을 수 있도록, sh/ bat단계.

예를 들면 :

def ret = sh(script: 'uname', returnStdout: true)
println ret

공식 문서 .


이것은 샘플 케이스입니다.

node('master'){
    stage('stage1'){
    def commit = sh (returnStdout: true, script: '''echo hi
    echo bye | grep -o "e"
    date
    echo lol''').split()


    echo "${commit[-1]} "

    }
}

stdout을 얻고 명령이 성공했는지 여부를 알고 싶다면 returnStdout예외 핸들러에서 사용 하고 랩하십시오.

스크립트 파이프 라인

try {
    // Fails with non-zero exit if dir1 does not exist
    def dir1 = sh(script:'ls -la dir1', returnStdout:true).trim()
} catch (Exception ex) {
    println("Unable to read dir1: ${ex}")
}

출력 :

[Pipeline] sh
[Test-Pipeline] Running shell script
+ ls -la dir1
ls: cannot access dir1: No such file or directory
[Pipeline] echo
unable to read dir1: hudson.AbortException: script returned exit code 2

불행히도 hudson.AbortException은 종료 상태를 얻는 데 유용한 방법이 없으므로 실제 값이 필요한 경우 메시지에서 파싱해야합니다 (ugh!)

Contrary to the Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html the build is not failed when this exception is caught. It fails when it's not caught!

Update: If you also want the STDERR output from the shell command, there could be a couple of possible approaches:

a) Redirect STDERR to STDOUT 2>&1 - but it's then up to you to parse that out of the main output though, and you won't get the output if the command failed - because you're in the exception handler.

b) redirect STDERR to a temporary file (the name of which you prepare earlier) 2>filename (but remember to clean up the file afterwards) - ie. main code becomes:

def stderrfile = 'stderr.out'
try {
    def dir1 = sh(script:"ls -la dir1 2>${stderrfile}", returnStdout:true).trim()
} catch (Exception ex) {
    def errmsg = readFile(stderrfile)
    println("Unable to read dir1: ${ex} - ${errmsg}")
}

c) Go the other way, set returnStatus=true instead, dispense with the exception handler and always capture output to a file, ie:

def outfile = 'stdout.out'
def status = sh(script:"ls -la dir1 >${outfile} 2>&1", returnStatus:true)
def output = readFile(outfile).trim()
if (status == 0) {
    // output is directory listing from stdout
} else {
    // output is error message from stderr
}

Caveat: the above code is Unix/Linux-specific - Windows requires completely different shell commands.


Easiest way is use this way

my_var=`echo 2` echo $my_var output : 2

note that is not simple single quote is back quote ( ` ).

참고URL : https://stackoverflow.com/questions/36547680/how-to-do-i-get-the-output-of-a-shell-command-executed-using-into-a-variable-fro

반응형