Python Jenkins API不允许同时对多个作业进行排队。有没有办法绕过这一限制?
我的Jenkins服务器中有一个参数化作业。我想使用pythonjenkinsapi启动几个具有不同参数的作业构建。这在詹金斯是完全合法的。如果我多次调用同一作业实例的“invoke”方法,则API只启动第一个生成,并拒绝将另一个生成排队,因为它认为该作业已在队列中 我使用的是Python Jenkins API版本0.2.14。这是当前API的最新版本。 我查看了Jenkins API源代码,它实际上限制了在队列中有另一个作业之前调用新构建(job.py:lines 104105): 有没有办法克服这个限制?我已经找到了一些方法(见下面的示例),但我不确定这是最好的方法。也许有不同的解决方案。如果有,我想知道这些解决方案 在我的解决方案中,我创建了原始Python Jenkins API不允许同时对多个作业进行排队。有没有办法绕过这一限制?,python,jenkins,Python,Jenkins,我的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