여러 쉘 명령을 실행하고 싶을 때스크립트 파이프라인파이프라인을 실행하지 않고 첫 번째 명령에 대한 응답을 반환합니다. 내 상황은 다음과 같습니다. HTML 페이지에서 특정 콘텐츠를 가져오고 싶습니다. 그래서 페이지를 컬링한 다음 grep을 수행하고 마침내 awk를 수행했습니다.
def checkState(hostUri, check) {
node('master') {
def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}'
println result
}
내 파이프의 콘솔 반환만 grep 및 awk를 실행하지 않고 컬 명령만 실행하는 것에 해당합니다.
Running on Jenkins in /var/lib/jenkins/workspace/Clearcase@8
[Pipeline] {
[Pipeline] sh
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
...
</html>
[Pipeline] }
[Pipeline] // node
스크립트된 파이프라인에 존재하지 않는 명령을 사용하는 등 다양한 접근 방식을 시도했습니다 '''
.new BuildProcess
답변1
표시된 Jenkinsfile에서 변수 할당에는 셸 단계가 포함됩니다.
def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}'
Jenkins는 이제 셸을 호출하여 다음 명령을 전달합니다.
curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F '"' {'print $2'}
연산자는 &&
AND 목록을 나타냅니다. 이 경우 curl
명령이 성공 하면 grep
명령이 실행되고, 성공하면 awk
명령이 실행됩니다. 이러한 명령의 표준 입력/출력/오류 스트림은 서로 연결되어 있지 않습니다.
여기서 목적은 and 문을 curl
사용하여 출력을 구문 분석하는 것이므로 연산자 대신 파이프를 사용해야 합니다 .grep
awk
&&
def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} | grep ${check} | awk -F \'"\' {\'print $2\'}'
또한 이러한 필드에 특수 문자가 나타나는 경우 인용 hostUri
및 변수를 고려하십시오.check
마지막 참고 사항: & 명령은 filename 인수나 일종의 input 없이는 grep ${check}
기술적으로 불완전합니다 . awk -F '"' {'print $2'}
쉘 터미널에서 있는 그대로 실행하면 멈추게 됩니다. 그러나 Jenkins는 빌드 프로세스를 비대화형으로 실행하므로 표준 입력 스트림이 0이 아닌 오류 코드로 인해 실패한다고 가정 /dev/null
합니다 .grep