回答:
組み込みのツールが見つからなかったため、作成しました。
#!/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スクリプトを試しましたが、動作させることができませんでした。私は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
。Pythonを知らないので、シェルを使用するように切り替えて、インスピレーションを得るためにあなたの答えを+1しました。ありがとう!
私の元同僚はhttps://github.com/txels/autojenkinsを書きました。これは、PythonのJenkinsインスタンスを操作するための便利な機能とAPIタイプのものがたくさんあります...
別のPythonソリューション:
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スクリプトを使用できます。
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>
ます。
SSH経由のjenkins-cli経由
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
もっと簡単な方法を見つけたと思う。私が正しく理解していれば、ビルドの結果、つまり成功か失敗か、つまり言い換えると、あなたはチェックしたいでしょう。
Jenkins CLIの「ビルド」コマンドは、最後に-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