[Jenkins] Remote API로 빌드 시 바로 실행되지 않고 pending되는 현상

by 스뎅(thDeng) on

Jenkins 빌드를 REST API 등으로 시작할 수 있다. Jenkins 매뉴얼(?) Remote access API을 보면 자세히 설명이 되어 있다. 간단히 아래처럼 job의 /build API를 호출하면 된다.

$ curl -i -X POST \
"http://{JENKINS_SERVER}/job/{JOB_NAME}/build" \
--user '{USERNAME}'

그런데, 간혹 아래 스냅샷처럼 job이 바로 실행되지 않고, pending되는 경우가 있다. pending - in the quiet period. Expires in 59 min 이 젠킨스의 경우는 API를 호출하고 60분을 기다려서 quiet period가 expire되면 그 후에 잡이 실행됐다. 또 다른 젠킨스의 경우는 몇 초 내에 바로 실행이 되기도 했다.

pending

한참을 찾아보니 remote API 호출을 하면 Job은 quiet period에 들어간 것이고, 이 period 사이에 호출되는 동일한 job의 build는 한 번만 호출되게 하는 것이다. 실행 시간이 긴 job의 경우는 A가 호출해서 돌고 있는 사이에 B가 호출하면 B는 A가 끝날 때 까지 기다려야 하기 때문에 비효율적일 수 있어서, quiet period 동안 들어오는 호출을 모아서 한번에 A와 B가 실행될 수 있도록 하는 것이라고 한다. Quiet Period Feature - Jenkins Blog

해결방법

/build API를 호출할 때 delay parameter를 주면, quiet period 시간을 조절할 수 있다.

$ curl -i -X POST \
"http://{JENKINS_SERVER}/job/{JOB_NAME}/build?delay=5sec" \
--user '{USERNAME}'

이 quiet period는 젠킨스 관리 > 시스템 설정 화면에서, 아래와 같이 시간 조절이 가능하다. (Quiet Period 설정)

quiet period config

하지만, 이건 젠킨스 UI에서 빌드할 때만 먹히는 것 같고, API 호출할 때는 안 먹히는 것 같다. 동일한 설정의 젠킨스 2대에서 API호출을 테스트했는데, 하나는 바로 실행되지만 다른건 60분을 quiet period로 대기했다. UI화면에서 빌드를 실행해도 내부적으로는 API를 호출한다고 하는데, 그 때 delay를 위에서 설정한 값으로 호출하는 것일 수도 있겠다. (확실하지는 않음 ㅋㅋ)

덤으로.. parameter가 있는 job은 아래처럼 parameter의 key, value 쌍을 --form 으로 주면 된다. json 형태의 예제이고, xml 형태도 가능하다.

$ curl -X POST \
http://{JENKINS_SERVER}/job/{JOB_NAME}/build \
--form json='{"parameter":[{"name":"APP_NAME", "value":"my-app"}, {"name":"MODULE_NAME", "value":"my-module"}, {"name":"PHASE", "value":"alpha"}, {"name":"BRANCH_NAME", "value":"alpha"}]}' \
--user '{USERNAME}'

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License