【问题标题】:Schedule Jenkins job using Jenkins Rest API使用 Jenkins Rest API 安排 Jenkins 作业
【发布时间】:2020-05-27 21:23:29
【问题描述】:

我有一个安排在特定时间的 Jenkins 工作。我想以编程方式修改该时间。

我尝试通过安装 Schedule Build 插件来修改构建,并使用 http://jenkins_url/job/jobname/build?delay=3344sec 对其进行修改。但这将使工作处于持有 java 线程的安静时期。我希望修改 Schedule 条目而不将其置于静默期。

【问题讨论】:

    标签: jenkins jenkins-api


    【解决方案1】:

    您可以使用Build Triggers -> Build periodically 作业配置选项。使用它来指定开始新构建的确切时间。

    如果您需要更改该时间,请使用 Jenkins REST API 来...

    1. 以编程方式检索 XML 格式的作业配置,然后
    2. 修改该配置中的调度时间(见下文)
    3. 重新发布新的作业配置

    在 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 转换为秒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多