Python 2.7 等待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

我正在使用Python2.7和Jenkins

我正在用Python编写一些代码,它将执行签入并等待/轮询Jenkins作业完成。我想了解一下我是如何做到这一点的

  • Python函数在Perforce->中创建签入,这可以很容易地完成,因为P4有CLI
  • Python代码,用于检测何时触发构建->我有变更列表和作业编号。如何轮询Jenkins API以查看构建日志是否具有适当的变更列表?此步骤的输出是执行作业的生成url
  • 我怎样才能等到詹金斯的工作完成

  • 我可以使用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()