2

我的 Jenkins 服务器中有一个参数化的工作。我想使用 Python Jenkins API 启动具有不同参数的作业的多个构建。这在 Jenkins 中是完全合法的。如果我多次调用同一个作业实例的“调用”方法,API 只会启动第一个构建并拒绝将另一个构建排队,因为它认为该作业已经在队列中。

我正在使用 Python Jenkins API 版本 0.2.14。这是当前 API 的最新版本。我查看了 Jenkins API 源代码,它确实限制调用新构建,直到队列中有另一个作业(job.py:第 104,105 行):

if self.is_queued():
    raise WillNotBuild('%s is already queued' % repr(self))

有没有办法克服限制?我找到了一些方法(参见下面的示例),但我不确定这是最好的方法。也许有不同的解决方案。如果有的话,我想知道这些解决方案。

在我的解决方案中,我创建了ParameterizedJob原始jenkinsapi.job.Job类的子类,并覆盖了四种方法:__init__invokeis_queuedis_queued_or_running。我已经从我的类中实例化了一个作业对象,而不是从 Jenkins 实例中调用 get_job 方法。这种方法对我来说很好。

import jenkinsapi
from jenkinsapi.job import Job

class ParametrizedJob(Job):
    def __init__(self, jobname, jenkins_instance):
        self._allowQueuingMultipleBuilds = False
        jobExists = False
        for info in jenkins_instance._data["jobs"]:
            if info["name"] == jobname:
                Job.__init__(self, info["url"], info["name"], jenkins_obj=jenkins_instance)
                jobExists = True
                break
        if not jobExists:
            raise UnknownJob(jobname)

    def invoke(self, securitytoken=None, block=False, skip_if_running=False, invoke_pre_check_delay=3, invoke_block_delay=15, build_params=None, cause=None):
        self._allowQueuingMultipleBuilds = True
        try:
            Job.invoke(self, securitytoken, block, skip_if_running, invoke_pre_check_delay, invoke_block_delay, build_params, cause)
        except:
            raise
        finally:
            self._allowQueuingMultipleBuilds = False

    def is_queued_or_running(self):
        if not self._allowQueuingMultipleBuilds:
            return Job.is_queued_or_running(self)
        else:
            return False

    def is_queued(self):
        if not self._allowQueuingMultipleBuilds:
            return Job.is_queued(self)
        else:
            return False

def startJenkinsJob(jenkinsInstance, jobName, parameters):
    #targetJob = jenkinsInstance.get_job(jobName)
    targetJob = ParametrizedJob(jobName, jenkinsInstance)
    targetJob.invoke(securitytoken='TOKEN', build_params=parameters, block=True)
    return
4

1 回答 1

0

您也不能通过 UI 多次安排同一个作业。例外情况是,如果您有一个参数化的作业,并且两个开始都有不同的参数。

于 2013-10-31T20:21:53.340 回答