[젠킨스] 파이프라인 작업이 sh로 멈추는 문제

소개



Jenkins Pipeline에서 sh가 중단되는 문제입니다.
이 문제를 해결하는 데는 이틀이 걸렸습니다. 좀처럼 에러 문언으로 구그해도 해소 방법을 찾을 수 없고, 멀어졌기 때문에 남겨두고 싶습니다.

Jenkins 버전은 2.204.6
서버는 Ubuntu18.04.4 LTS (Bionic Beaver)

TLDR



Jenkins 환경 변수 설정에서 PATH 대신 PATH + EXTRA를 사용합시다.

문제



파이프라인 스크립트는 다음과 같습니다.
pipeline {

    agent any

    stages {
        stage("Test") {
            steps {
                script {
                    sh "touch test.txt"
                }
            }
        }
    }
}

그러면 다음과 같은 로그를 할 수 있습니다. 9행째의 sh의 곳에서 처리가 멈추고 정지합니다.
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/test-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
process apparently never started in /var/lib/jenkins/workspace/test-pipeline@tmp/durable-e010c819
(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code -2
Finished: FAILURE

멈출 때 작업의 Thread Dump를 살펴보면 다음과 같은 로그가 나옵니다.
Thread #6
    at DSL.sh(awaiting process completion in /var/lib/jenkins/workspace/test-pipeline@tmp/durable-e010c819; recurrence period: 9543ms; check task scheduled; cancelled? false done? false)
    at WorkflowScript.run(WorkflowScript:9)
    at DSL.script(Native Method)

상기 로그에 기재되어 있는 개소에 가보면, script.sh라는 파일이 배치되어 있어 그 중에는 touch test.txt라고만 쓰여져 있었습니다.
이 디렉토리에는 test.txt 파일이 없으므로 script.sh가 실행되고 있지 않습니다. 확실히 로그의 거리였습니다.
이것은 workflow-durable-task-step-plugin 문제처럼 보였습니다.

해결책



이번 제 경우에는 환경 변수를 설정하는 방법이 문제였습니다. Jenkins의 전역 설정에서 환경 변수를 다음과 같이 설정했습니다. 변수를 설정하는 방법은 PATH+EXTRA를 사용하여 해야 했습니다.

수정 전


수정 후




왜 여기까지 눈치 채지 못했을까,
환경 변수의 값의 설정을 $PATH 가 아니고 ${PATH} 의 형태로 기재하고 있었기 때문이었습니다.
만약 $PATH로 기재하고 있으면, 콘솔 로그에는 아래와 같이 바로 대답이 나옵니다.
Warning: JENKINS-41339 probably bogus PATH=$PATH:~/.loca/bin:~/.loca/bin; perhaps you meant to use ‘PATH+EXTRA=/something/bin’?

이하가 플러그인의 소스 코드에서도 $PATH 밖에 판정해 주고 있지 않았습니다.

소스는 이쪽
workflow-durable-task-step-plugin

단서를 찾았을 때 경로 오류로 인해 중단되는 기사를 보았으므로 경로를 설정하는 부분을 수정했을 때 환경 변수 설정을 삭제하고 문제가 발생했습니다. 가 해결되었습니다.
그래서 Jenkins에서의 PATH에 대해 알아보면 PATH+EXTRA라는 이야기를 발견했다는 점입니다.

참고



이하의 안에 본건의 해설이 실려 있었으므로, 일부를 발췌한 번역문을 소개합니다.
h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 43987005 / 지 켄 킨 s - 도 에 s의 t 레코 g
$PATH 를 Jenkins 환경 변수로 설정해도 프리 스타일 프로젝트에서 제대로 작동합니다. 그러나 파이프라인 프로젝트에서는 어떤 이유로 인해 $PATH 가 올바르게 해석되지 않고 정의한 PATH 값으로 바뀝니다.
이 버그를 수정하는 대신 Jenkins 프로젝트는 두 가지 수정을했습니다.
1) 로그를 낸다("Warning: JENKINS-41339 probably bogus")
2) PATH를 추가하는 새로운 방법(PATH+EXTRA) 추가
입니다.
이 문제에 대해 Jenkins의 어떤 문서에는 쓰여졌지만 정말 필요한 곳에는 쓰지 않았습니다 (설정 부분).

이상

좋은 웹페이지 즐겨찾기