使用Jenkins Rest API安排Jenkins作业

7

我有一个定时执行的 Jenkins 任务。我希望能够通过编程方式修改该定时时间。

我尝试使用安装 Schedule Build 插件来修改构建,然后使用 http://jenkins_url/job/jobname/build?delay=3344sec 进行修改。但是这将使该任务进入静默期,阻塞了 Java 线程。我想要修改 Schedule 条目而不让它进入静默期。

2个回答

2
您可以使用“构建触发器 -> 定期构建”作业配置选项。使用它来指定开始新构建的确切时间。
如果您需要更改该时间,请使用Jenkins REST API进行以下操作:
1.以编程方式检索XML格式的作业配置,然后
2.在该配置中修改调度时间(见下文)
3.重新发布新的作业配置
在bash中,可以使用一个一行命令(使用curl和sed)来修改下面的XML部分(示例安排2月29日中午运行):
[...]
<triggers>
<hudson.triggers.TimerTrigger>
<spec>00 12 29 02 * </spec>
</hudson.triggers.TimerTrigger>
</triggers>
[...]

注意:

  • 另外的插件不是必须的,这是一个额外的优点。
  • 警告:在计划中不能指定年份--因此,如果您需要安排超过一年的构建,则需要进行一些额外的处理。

1
这是一个很好的方法,不需要额外的插件或黑客技巧。如果Python或类似语言是一个选项,通常会有库来帮助你完成它。例如,使用get_job_config()和reconfig_job()的python-jenkins库,只需在提供的config.xml中替换时间<spec>HERE</spec>即可。 - kg_sYy

0

我无法让它正常工作,但插件的源代码引用了一个“schedule” URL操作和一个“date”参数。

我尝试了类似以下的内容:

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的日期时间转换为秒数 - user2439278

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接