等到Jenkins构建完成

时间:2013-03-08 15:21:15

标签: python-2.7 jenkins

我正在使用Python 2.7和Jenkins。

我正在用Python编写一些代码,这些代码将执行checkins并等待/轮询Jenkins作业完成。我想就如何实现它做一些想法。

  1. 用于在Perforce中创建签到的Python函数 - >这可以很容易地完成,因为P4有CLI
  2. 用于检测构建何时被触发的Python代码 - >我有变更清单和工号。如何轮询Jenkins API以获取构建日志以检查它是否具有相应的更改列表?此步骤的输出是正在执行作业的构建URL
  3. 我如何等到詹金斯的工作完成?
  4. 我可以使用Jenkins Rest API或Python Jenkins模块中的代码段吗?

7 个答案:

答案 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)

使用python3python-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()

a test method in pycontribs压印