使用 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 中,这可以通过单行(使用 curlsed)来修改下面的 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 中的时间 HERE【参考方案2】:

我无法让它工作,但插件的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 作业的主要内容,如果未能解决你的问题,请参考以下文章

使用rest api生成jenkins api令牌

如何通过 REST API 更新 jenkins 凭据?

Jenkins常见REST API(便于将Jenkins集成到其他系统)

Gmail现在支持安排电子邮件,如何使用gmail rest api工作,还是api支持此功能?

Jenkins REST API 获取作业和作业控制台日志

使用第三方接口调用工具调用Jenkins REST Api