Python Jenkins API不允许同时对多个作业进行排队。有没有办法绕过这一限制?

Python Jenkins API不允许同时对多个作业进行排队。有没有办法绕过这一限制?,python,jenkins,Python,Jenkins,我的Jenkins服务器中有一个参数化作业。我想使用pythonjenkinsapi启动几个具有不同参数的作业构建。这在詹金斯是完全合法的。如果我多次调用同一作业实例的“invoke”方法,则API只启动第一个生成,并拒绝将另一个生成排队,因为它认为该作业已在队列中 我使用的是Python Jenkins API版本0.2.14。这是当前API的最新版本。 我查看了Jenkins API源代码,它实际上限制了在队列中有另一个作业之前调用新构建(job.py:lines 104105): 有没有办

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

我使用的是Python Jenkins API版本0.2.14。这是当前API的最新版本。 我查看了Jenkins API源代码,它实际上限制了在队列中有另一个作业之前调用新构建(job.py:lines 104105):

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

在我的解决方案中,我创建了原始
jenkinsapi.job.job
类的子类
ParameterizedJob
,并覆盖了四个方法:
\uuuuu init\uuuuuu
调用
已排队
已排队或正在运行
。我从我的类实例化了一个作业对象,而不是从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

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

我认为这不是真的。我刚刚尝试使用相同的参数运行同一作业的多个构建,Jenkins同时启动了所有构建,并且使用了相同的从机。所以,你可以自己试试。它应该很好用。我很肯定,这对非参数化工作也是如此。
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