使用 Jenkins Rest API 安排 Jenkins 作业
Posted
技术标签:
【中文标题】使用 Jenkins Rest API 安排 Jenkins 作业【英文标题】:Schedule Jenkins job using Jenkins Rest API 【发布时间】:2020-05-27 21:23:29 【问题描述】:我有一个安排在特定时间的 Jenkins 工作。我想以编程方式修改该时间。
我尝试通过安装 Schedule Build 插件来修改构建,并使用 http://jenkins_url/job/jobname/build?delay=3344sec
对其进行修改。但这将使工作处于持有 java 线程的安静时期。我希望修改 Schedule 条目而不将其置于静默期。
【问题讨论】:
【参考方案1】:您可以使用Build Triggers -> Build periodically
作业配置选项。使用它来指定开始新构建的确切时间。
如果您需要更改该时间,请使用 Jenkins REST API 来...
-
以编程方式检索 XML 格式的作业配置,然后
修改该配置中的调度时间(见下文)
重新发布新的作业配置
在 bash 中,这可以通过单行(使用 curl
和 sed
)来修改下面的 XML 部分(示例安排在 2 月 29 日中午运行):
[...]
<triggers>
<hudson.triggers.TimerTrigger>
<spec>00 12 29 02 * </spec>
</hudson.triggers.TimerTrigger>
</triggers>
[...]
注意:
另外,您不会依赖任何补充插件 警告:您不能在时间表中指定年份 - 因此,如果您需要提前一年以上安排构建,那么您需要一些魔法。【讨论】:
这是一个很好的方法,不需要额外的插件或hacks。如果 Python 等是一个选项,通常有库可以帮助你做到这一点。例如,python-jenkins 库,get_job_config() 和 reconfig_job(),只需替换提供的 config.xml 中的时间我无法让它工作,但插件的source code 引用了“计划”网址操作和“日期”参数。
我尝试了类似的方法:
http://localhost:8080/job/jobname/job/develop/schedule?date=2020-02-20
它没有拒绝但我看不到构建。
下面是按下按钮进行调度时执行的动作的源代码:
var newRequest = function()
if (window.XMLHttpRequest)
return new XMLHttpRequest();
else
return new ActiveXObject("Microsoft.XMLHTTP");
var sumbitScheduleRequest = function(absoluteUrl, quietPeriodInSeconds, isJobParameterized)
if(isJobParameterized)
// if job has parameters, redirect to build page, so user can set parameters
window.location = absoluteUrl + "build?delay=" + quietPeriodInSeconds + "sec";
else
// if job has NO parameters, submit build directly
var csrfCrumb;
var csrfRequest = newRequest();
csrfRequest.onreadystatechange = function()
if (csrfRequest.readyState === 4)
if (csrfRequest.status === 200 || csrfRequest.status === 201)
csrfCrumb = JSON.parse(csrfRequest.responseText);
else
// csrf might be deactivated
// do the actual submit
var xmlhttp = newRequest();
xmlhttp.onreadystatechange = function()
if (xmlhttp.readyState === 4)
if (xmlhttp.status === 200 || xmlhttp.status === 201)
window.location = absoluteUrl;
return false;
else
window.location = absoluteUrl;
return false;
;
xmlhttp.open("POST", absoluteUrl + "build?delay=" + quietPeriodInSeconds + "sec", true);
if (csrfCrumb)
xmlhttp.setRequestHeader(csrfCrumb.crumbRequestField, csrfCrumb.crumb)
xmlhttp.send();
;
csrfRequest.open('GET', rootURL + '/crumbIssuer/api/json', false);
csrfRequest.send();
【讨论】:
如何将日期时间如 20/02/2020 10:00:00 转换为秒以上是关于使用 Jenkins Rest API 安排 Jenkins 作业的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins常见REST API(便于将Jenkins集成到其他系统)