파이프라인 스크립트의 셸 명령에 대한 grep

파이프라인 스크립트의 셸 명령에 대한 grep

여러 쉘 명령을 실행하고 싶을 때스크립트 파이프라인파이프라인을 실행하지 않고 첫 번째 명령에 대한 응답을 반환합니다. 내 상황은 다음과 같습니다. 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사용하여 출력을 구문 분석하는 것이므로 연산자 대신 파이프를 사용해야 합니다 .grepawk&&

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

관련 정보