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 ( ` ).
'Programing' 카테고리의 다른 글
ANSI 색상 이스케이프 시퀀스 목록 (0) | 2020.05.24 |
---|---|
APC 캐시 항목을 지우는 방법? (0) | 2020.05.24 |
Swift의 NSString에서 NSData 생성 (0) | 2020.05.24 |
JSON 문자열을 맵으로 변환하는 방법 (0) | 2020.05.24 |
jQuery를 사용하여 두 번째 자식 얻기 (0) | 2020.05.24 |