커맨드 라인에서 Jenkins 빌드의 빌드 상태를 어떻게 확인합니까?


40

브라우저로 전환하지 않고 Jenkins 빌드 상태를 어떻게 확인합니까?

필요한 경우 JSON API를 사용하여 스크립트를 만들 수 있지만 이미 이와 같은 것이 있는지 궁금합니다.


CatLight Build Monitor 와 같은 특수 도구를 사용 하여 트레이에 빌드 상태를 표시 할 수도 있습니다 .
alex

여기의 모든 게시물은 "마지막 빌드"를 가리키는 것으로 보입니다. 작업 / 빌드 번호 X의 상태를 확인하기위한 비슷한 쿼리가 있습니까? 실시간으로 또는 사실 후에 확인하는 것.
David

답변:


38

내장 도구를 찾을 수 없으므로 도구를 만들었습니다.

#!/usr/bin/python
#
# author: ajs
# license: bsd
# copyright: re2


import json 
import sys
import urllib
import urllib2

jenkinsUrl = "https://jenkins.example.com/job/"


if len( sys.argv ) > 1 :
    jobName = sys.argv[1]
    jobNameURL = urllib.quote(jobName)
else :
    sys.exit(1)

try:
    jenkinsStream   = urllib2.urlopen( jenkinsUrl + jobNameURL + "/lastBuild/api/json" )
except urllib2.HTTPError, e:
    print "URL Error: " + str(e.code) 
    print "      (job name [" + jobName + "] probably wrong)"
    sys.exit(2)

try:
    buildStatusJson = json.load( jenkinsStream )
except:
    print "Failed to parse json"
    sys.exit(3)

if buildStatusJson.has_key( "result" ):      
    print "[" + jobName + "] build status: " + buildStatusJson["result"]
    if buildStatusJson["result"] != "SUCCESS" :
        exit(4)
else:
    sys.exit(5)

sys.exit(0)

스크립트에서 Jenkins 사용자를 어떻게 인증합니까?
Aman Varshney

11

빌드가 실행 중인지 확인

이 질문에 대한 답변으로 Python 스크립트를 시도했지만 작동하지 못했습니다. 나는 파이썬을 모르고 디버깅에 시간을 투자하고 싶지 않았지만 스크립트에서 영감을 얻기에 충분한 스크립트를 읽을 수있었습니다.

내가해야 할 일은 빌드가 실행 중인지 확인하는 것입니다. 이를 위해 다음과 같이 curl 및 grep을 사용했습니다.

curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null

  • 빌드가 진행중인 경우 grep result\":null은 0을 반환합니다.
  • 빌드가 완료되면 grep result\":null은 1을 반환합니다.

특히 우아하지는 않지만 내 요구에 충분하게 작동합니다.

예를 들어 빌드를 시작한 다음 완료 될 때까지 기다리는 Bash 스크립트가 있습니다.

JOB_URL=http://jenkins.local/job/stevehhhbuild
JOB_STATUS_URL=${JOB_URL}/lastBuild/api/json

GREP_RETURN_CODE=0

# Start the build
curl $JOB_URL/build?delay=0sec

# Poll every thirty seconds until the build is finished
while [ $GREP_RETURN_CODE -eq 0 ]
do
    sleep 30
    # Grep will return 0 while the build is running:
    curl --silent $JOB_STATUS_URL | grep result\":null > /dev/null
    GREP_RETURN_CODE=$?
done

echo Build finished

영감을 주셔서 감사합니다, Catskul!


나는 현재 구현중인 현재 구현을 확인했으며 암호 요구 사항 때문에 대답에 넣은 버전과 약간 다릅니다. 왜 그것이 당신을 위해 작동하지 않았는지 아십니까?
Catskul

작업이 이미 완료된 경우 Python 스크립트가 제대로 작동하지만 작업이 실행 중이면 Python 스크립트가 실패합니다 TypeError: cannot concatenate 'str' and 'NoneType' objects. 나는 파이썬을 모른다. 그래서 나는 쉘을 사용하도록 바꾸었고 영감을 얻기 위해 당신의 대답을 +1했다. 감사!
Steve HHH

||를 추가 할 수 있습니다 그 후 종료 코드 1의 조건은 curl --silent $ JOB_STATUS_URL | grep result \ ": null> / dev / null || if ["$? "=="1 "]; GREP_RETURN_CODE = $? 따라서 Jenkins 빌드에서 실행중인 경우 종료 코드 '1'이 표시되지 않습니다. 그리고 당신은 그것을 실패하고 싶지 않아요
Shachar Hamuzim Rajuan


4

또 다른 파이썬 솔루션 :

from jenkinsapi.jenkins import Jenkins

jenkins_url = 'http://<server url>/'
server = Jenkins(jenkins_url, username = 'myUser', password = myPass)

job_instance = server.get_job('the job name')
running = job_instance.is_queued_or_running()
if not running:
   latestBuild = job_instance.get_last_build()
   print latestBuild.get_status()

4

Groovy 스크립트를 사용할 수 있습니다 :

  1. 비아 젠킨스 - CLI

    echo 'println(jenkins.model.Jenkins.instance'\
    '.getItem("<JOB-NAME>").lastBuild.building)' \
        | java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =

    여기서 =표준을 의미합니다. 당신이 인증 할 수 있습니다 --username <USER> --password <PASS>또는 함께 -i <SSH-PRIVATE-KEY>.

  2. SSH를 통한 jenkins-cli를 통해

    echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
    | ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh

3

더 쉬운 방법을 찾았습니다. 내가 올바르게 이해했다면 빌드의 결과를 확인하고 싶습니다. 즉, 성공 또는 실패인지 여부입니다.

Jenkins CLI의 "build"명령 은 마지막에 -s또는 -f옵션 을 사용하는 한 빌드 결과에 따라 종료 코드를 변경합니다 .

예를 들어

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s

또는

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f

옵션은 마지막에갑니다. -sJenkins 인스턴스의 URL을 정의하는 데 사용되는 첫 번째가 아닙니다 .

그런 다음 결과를 얻으려면 다음을 사용할 수 있습니다 $?.

echo $?

결과가 0이면 성공한 것입니다. 0이 아닌 다른 경우 실패입니다.

참조 :이 페이지에 액세스 할 수있는 공개 Jenkins 인스턴스를 찾을 수 없지만 로컬 Jenkins 인스턴스에서 찾을 수 있습니다 http://<url of Jenkins Instance>/cli/command/build. 또한 사이의 차이에 대해 설명 -s-f:

-s  : Wait until the completion/abortion of the command. Interrupts are passed
      through to the build.

-f  : Follow the build progress. Like -s only interrupts are not passed
      through to the build.

2

기호 설명자를 사용할 수 있습니다 lastBuild.

http://localhost/jenkins/job/<jobName>/lastBuild/api/xml

result응답 의 요소에는 빌드 결과를 설명하는 문자열이 포함됩니다.


2

다행히 Jenkins에서 정보를 얻는 데 사용할 수 있는 jenkins-cli 가 있습니다. 불행히도 CLI를 사용하여 빌드 상태를 검색 할 수 없습니다. 즉, JSON API를 사용하는 솔루션이 정확할뿐만 아니라 프로그래밍 방식 만 가능합니다.

또한 get-job원하는 것을 수행하는 것처럼 보이지만 실제로 결과를 반환하지는 않으며 작업 구성 만 반환합니다.


1

CMD (Windows)를위한 또 다른 스크립트 :

:loop
ping 127.0.0.1 -n 6  1>nul
curl --silent http://localhost:8080/job/JOB_NAME/lastBuild/api/xml | FINDSTR "SUCCESS FAILURE" >nul & IF ERRORLEVEL 1 (goto :loop)
echo "BUILD FINISH!!"

0

이것으로 시도해 볼 수 있습니다.

JOB_URL=http://localhost:8080/view/TestTab/job/JobWait
JOB_STATUS_URL=${JOB_URL}/lastBuild/api/json

GREP_RETURN_CODE=0

# Start the build
curl --user "username:password" $JOB_URL/build?delay=0sec

# Poll every 10 second  until the build is finished
while [ $GREP_RETURN_CODE -eq 0 ]
do
    sleep 10
    # Grep will return 0 while the build is running:
    curl --user "username:password" --silent $JOB_STATUS_URL | grep result\":null > /dev/null || if [ "$?" == "1" ]; then
      exit 0
    fi

    GREP_RETURN_CODE=$?
done
echo Build finished
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.