Python 2.7 等待Jenkins构建完成
我正在使用Python2.7和Jenkins 我正在用Python编写一些代码,它将执行签入并等待/轮询Jenkins作业完成。我想了解一下我是如何做到这一点的Python 2.7 等待Jenkins构建完成,python-2.7,jenkins,Python 2.7,Jenkins,我正在使用Python2.7和Jenkins 我正在用Python编写一些代码,它将执行签入并等待/轮询Jenkins作业完成。我想了解一下我是如何做到这一点的 Python函数在Perforce->中创建签入,这可以很容易地完成,因为P4有CLI Python代码,用于检测何时触发构建->我有变更列表和作业编号。如何轮询Jenkins API以查看构建日志是否具有适当的变更列表?此步骤的输出是执行作业的生成url 我怎样才能等到詹金斯的工作完成 我可以使用Jenkins Rest API或Py
我可以使用Jenkins Rest API或Python Jenkins模块中的代码片段吗?您可以查询上一个构建时间戳以确定构建是否完成。将它与触发构建之前的情况进行比较,然后查看它何时更改。要获取时间戳,请将
/lastBuild/buildTimestamp
添加到作业URL
事实上,在Jenkins中,向任何作业添加/lastBuild/api/
,您将看到大量的api信息。它甚至有pythonapi,但我对它不熟悉,因此无法进一步帮助您
但是,如果您使用的是XML,您可以添加
lastBuild/api/XML?depth=0
,在XML中,您可以看到
对象以及触发生成的修订/提交消息列表,如果您需要知道作业是否完成,则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)等到构建完成(构建为假) 遇到了同样的问题,这对我很有效,使用了
python3
和pythonjenkins
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脚本:此代码段启动构建作业并等待作业完成 开始这项工作很容易,但我们需要某种逻辑来知道工作何时完成。首先,我们需要等待应用作业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()))
这对我有用
#!/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
不知道在提问时这是否可用,但jenkinsapi模块的Job.invoke()和/或Jenkins.build_Job()返回一个QueueItem对象,该对象可以阻止_直到_building()或阻止_直到_complete() 使用invoke和block_直到_完成方法的简单解决方案(使用Python 3.7测试)
InPired by如果队列中已有其他版本,则此操作将失败。请尝试描述您的解决方案是如何工作的,您的解决方案用于解决此问题的核心概念是什么请注意,此操作使用的是
jenkinsapi
而不是python jenkins
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())
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()