로컬에서 잘 작동하는 스크립트가 있습니다. 하지만 Jenkins에서 실행하면 Error: writing output failed: Broken pipe
.
제 질문은 Jenkins에서 작동하도록 이 문제를 해결하는 방법입니다.
이제 이 질문에 답하기 위해 상황을 활용해 보겠습니다. 실제 파이프라인은 somevar=$(jq --arg host "${HOSTNAME}" --arg id "${ID}"'.[] | select((.hostname==$host) and (.port==XXXX)).serviceId = $id' <<<"${MYJSON}" | jq -s)
.
젠킨스 버전 2.164.3
젠킨스 배쉬 버전 4.2
젠킨스 운영 체제 CentOS 7
로컬 배쉬 버전 5
기본 운영 체제 Arch 커널 버전 5.0
또한 다음 사양을 갖춘 Docker 컨테이너에서 이 스크립트를 성공적으로 실행했습니다.
컨테이너 운영 체제 Ubuntu 18.04
배쉬 4.4
따라서 내 질문에 답할 수 없다면 이것이 다른 환경에서는 작동하지만 Jenkins에서는 작동하지 않는 이유를 설명할 수 있습니다. 아니면 이 문제에 대한 해결책을 제안해 주실 수 있나요? 현재 trap
더 많은 정보를 얻기 위해 사용을 고려하고 있습니까 ? 하지만 어떻게 할 수 있는지 잘 모르겠습니다.
답변1
스크립트를 호출하는 프로그램을 찾고 SIGPIPE
신호 처리기를 무시하도록 설정하십시오. (찾기 trap '' PIPE
등). 신호의 "무시" 처리는 하위 프로세스에 상속됩니다.
유사한 파이프에서는 ... | head -5
파이프의 왼쪽이 깨끗하고 조용하게 빠져나가는 것이 SIGPIPE
절대적으로 정상입니다 . 무시되거나 포착되면 SIGPIPE
시스템 write()
호출은 오류를 반환 EPIPE
하거나 "깨진 파이프"로 번역됩니다.
많은 형편없는 프로그램은 a가 성공했는지 확인하지 않습니다 write()
. 즉, SIGPIPE
setuid 실행 파일을 호출할 때 무시하도록 설정하는 것이 공격 경로가 될 수 있습니다.
하지만 그렇지 않습니다. jq
예상치 못한 상황이 발생하면 즉시 알려줍니다(출력에는 차이가 없을 가능성이 높습니다).
하지만 저는 Jenkins를 사용하지도 좋아하지도 않기 때문에 더 이상 도움을 드릴 수 없습니다. 나는 이것이 Jenkins의 잘못인지 매우 의심합니다.