我正在使用Python 2.7和Jenkins。
我正在用Python编写一些代码,这些代码将执行checkins并等待/轮询Jenkins作业完成。我想就如何实现它做一些想法。
我可以使用Jenkins Rest API或Python Jenkins模块中的代码段吗?
答案 0 :(得分:7)
如果您需要知道作业是否完成,那么buildNumber和buildTimestamp是不够的。
这是我如何找到一份工作是否完整的要点,我把它放在ruby中但不是python所以也许有人可以将它更新为真实的代码。
lastBuild = get jenkins/job/myJob/lastBuild/buildNumber
get jenkins/job/myJob/lastBuild/build?token=gogogo
currentBuild = get jenkins/job/myJob/lastBuild/buildNumber
while currentBuild == lastBuild
sleep 1
thisBuild = get jenkins/job/myJob/lastBuild/buildNumber
buildInfo = get jenkins/job/myJob/[thisBuild]/api/xml?depth=0
while buildInfo["freeStyleBuild/building"] == true
buildInfo = get jenkins/job/myJob/[thisBuild]/api/xml?depth=0
sleep 1
即。我发现我需要A)等到构建开始(新构建号)和B)等到构建完成(构建为假)。
答案 1 :(得分:4)
您可以查询上一个构建时间戳以确定构建是否已完成。将它与触发构建之前的内容进行比较,看看它何时发生变化。要获取时间戳,请将/lastBuild/buildTimestamp
添加到您的职位网址
事实上,在Jenkins中,将/lastBuild/api/
添加到任何作业中,您将看到很多API信息。它甚至有Python API,但我不熟悉,所以无法帮助你进一步
但是,如果您使用的是XML,则可以添加lastBuild/api/xml?depth=0
并在XML中,您可以看到<changeSet>
对象,其中包含触发构建的修订/提交消息列表
答案 2 :(得分:1)
此代码段启动构建作业并等到作业完成。
开始工作很容易,但我们需要某种逻辑来了解工作何时完成。首先,我们需要等待应用作业ID,然后我们可以查询作业以获取详细信息:
from jenkinsapi import jenkins
server = jenkins.Jenkins(jenkinsurl, username=username, password='******')
job = server.get_job(j_name)
prev_id = job.get_last_buildnumber()
server.build_job(j_name)
while True:
print('Waiting for build to start...')
if prev_id != job.get_last_buildnumber():
break
time.sleep(3)
print('Running...')
last_build = job.get_last_build()
while last_build.is_running():
time.sleep(1)
print(str(last_build.get_status()))
答案 3 :(得分:0)
使用python3
和python-jenkins
时遇到了同样的问题,这对我有用。
while "".join([d['color'] for d in j.get_jobs() if d['name'] == "job_name"]) == 'blue_anime':
print('Job is Running')
time.sleep(1)
print('Job Over!!')
使用Github脚本:Link
答案 4 :(得分:0)
这对我有用
#!/usr/bin/env python
import jenkins
import time
server = jenkins.Jenkins('https://jenkinsurl/', username='xxxxx', password='xxxxxx')
j_name = 'test'
server.build_job(j_name, {'testparam1': 'test', 'testparam2': 'test'})
while True:
print('Running....')
if server.get_job_info(j_name)['lastCompletedBuild']['number'] == server.get_job_info(j_name)['lastBuild']['number']:
print "Last ID %s, Current ID %s" % (server.get_job_info(j_name)['lastCompletedBuild']['number'], server.get_job_info(j_name)['lastBuild']['number'])
break
time.sleep(3)
print('Stop....')
console_output = server.get_build_console_output(j_name, server.get_job_info(j_name)['lastBuild']['number'])
print console_output
答案 5 :(得分:0)
在提问时不知道是否可用,但是Job.invoke()和/或Jenkins.build_job()返回一个QueueItem对象,该对象可以block_until_building()或block_until_complete()
jobq = server.build_job(job_name, job_params)
jobq.block_until_building()
print("Job %s (%s) is building." % (jobq.get_job_name(), jobq.get_build_number()))
jobq.block_until_complete(5) # check every 5s instead of the default 15
print("Job complete, %s" % jobq.get_build().get_status())
答案 6 :(得分:0)
使用 invoke 和 block_until_complete 方法的简单解决方案(已通过Python 3.7测试)
import jenkinsapi
from jenkinsapi.jenkins import Jenkins
...
server = Jenkins(jenkinsUrl, username=jenkinsUser,
password=jenkinsToken, ssl_verify=sslVerifyFlag)
job = server.create_job(jobName, None)
queue = job.invoke()
queue.block_until_complete()