我的 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__
、invoke
、is_queued
、is_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