답변:
내장 도구를 찾을 수 없으므로 도구를 만들었습니다.
#!/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)
빌드가 실행 중인지 확인
이 질문에 대한 답변으로 Python 스크립트를 시도했지만 작동하지 못했습니다. 나는 파이썬을 모르고 디버깅에 시간을 투자하고 싶지 않았지만 스크립트에서 영감을 얻기에 충분한 스크립트를 읽을 수있었습니다.
내가해야 할 일은 빌드가 실행 중인지 확인하는 것입니다. 이를 위해 다음과 같이 curl 및 grep을 사용했습니다.
curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null
result\":null
은 0을 반환합니다.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!
TypeError: cannot concatenate 'str' and 'NoneType' objects
. 나는 파이썬을 모른다. 그래서 나는 쉘을 사용하도록 바꾸었고 영감을 얻기 위해 당신의 대답을 +1했다. 감사!
전 동료가 https://github.com/txels/autojenkins에 썼습니다. 여기에는 Python의 Jenkins 인스턴스 작업과 관련된 편리한 기능과 API 유형이 많이 있습니다 ...
또 다른 파이썬 솔루션 :
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()
Groovy 스크립트를 사용할 수 있습니다 :
비아 젠킨스 - 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>
.
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
더 쉬운 방법을 찾았습니다. 내가 올바르게 이해했다면 빌드의 결과를 확인하고 싶습니다. 즉, 성공 또는 실패인지 여부입니다.
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
옵션은 마지막에갑니다. -s
Jenkins 인스턴스의 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.
다행히 Jenkins에서 정보를 얻는 데 사용할 수 있는 jenkins-cli 가 있습니다. 불행히도 CLI를 사용하여 빌드 상태를 검색 할 수 없습니다. 즉, JSON API를 사용하는 솔루션이 정확할뿐만 아니라 프로그래밍 방식 만 가능합니다.
또한 get-job
원하는 것을 수행하는 것처럼 보이지만 실제로 결과를 반환하지는 않으며 작업 구성 만 반환합니다.
이것으로 시도해 볼 수 있습니다.
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