预定詹金斯蓝海管道触发?

时间:2017-04-21 00:36:54

标签: jenkins jenkins-pipeline jenkins-blueocean

我已经在Jenkins新的Blue Ocean界面中创建了一个管道,并且希望每小时运行一次。我没有在UI中看到添加构建计划的选项。我确实在经典用户界面中看到了它,但设置不可编辑。安排管道按计划而不是提交运行的建议方法是什么?

Here is a screenshot我在蓝海中看到的设置。

this screenshoot中,您可以看到"查看配置"的选项。安排作业的设置在那里但不可编辑。

2 个答案:

答案 0 :(得分:0)

根据您的Jenkinsfile遵循的结构,可以通过两种方式完成这些操作:

1)脚本化的Jenkinsfile方法:

node('node_name') {
    properties(
        [
        pipelineTriggers([cron('0 0 * ? * * *')])
        ]
    )

2)声明式Jenkinsfile方法:

triggers {
    cron('0 0 * ? * * *')
}

希望这会对您有所帮助,如有疑问,请随时与我们联系。

答案 1 :(得分:0)

对于脚本化管道,此功能开箱即用的实现效果不佳(截至2019年)。

丑陋

最简单的方法(例如,针对时间表"H 10 * * *")是将以下内容放入Jenkinsfile

node {
  properties([
    pipelineTriggers([cron("H 10 * * *")])
  ])
}

在BlueOcean中,每个分支和每个拉取请求均视为其自己的工作-因此,如果您遵循标准git工作流程,以上代码将创建不少于三个cron职位:

  1. 您推送的功能分支,即使尚未合并
  2. 拉取请求分支,是否合并
  3. 主分支(如果/当您合并功能分支时)

除非您将更多的提交推送到功能分支并以相同的数量保持拉取请求打开,否则无法消除这种损害-否则,您将配置一个与另一个不同的 作业。与cron脚本。您只能在Jenkins控制台中对其进行修复,因为(如您所述),BlueOcean设置会像在非BlueOcean Jenkins UI中一样阻止您访问作业设置。

坏人

一种更聪明的方法是使计划取决于正在使用的分支。

def mySchedule = BRANCH_NAME == "master" ? "H 10 * * *" : ""

node {
  properties([
    pipelineTriggers([cron(mySchedule)])
  ])
}

这可以避免出现“丑陋”的情况,但不能消除以前的任何损坏。当然,它不能阻止任何人在自己的请求中删除条件(即意外或不经意地返回到“丑陋”状态)。

善良

安全的方法需要直接访问Jenkins API:

import hudson.triggers.TimerTrigger

//          v-- a Map of jobName to schedule string
def setCron(whitelistedCronSchedules = [:])
  // only apply cron settings when running on master -- i.e. on merge to master
  if ("${env.BRANCH_NAME}" == MASTER_BRANCH) {

    // navigate up to the parent job, then iterate over all its child jobs,
    // setting timers from the whitelist as we go
    def thisJob = Jenkins.get().getItemByFullName(env.JOB_NAME)

    for (Item ajob in thisJob.getParent().getAllJobs()) {
      // you could optionally check ajob.getTriggers()[0].spec to see
      //   if the schedule is already set to what you want it to be

      // get job schedule from the whitelist, or null if there is none
      def jobName = java.net.URLDecoder.decode(ajob.getName(), "UTF-8")
      def mySchedule = whitelistedCronSchedules.get(jobName, null)

      // Triggers are set all at once: no triggers, or just one with our schedule
      def triggersToSet = mySchedule == null ? [] : [new hudson.triggers.TimerTrigger(mySchedule)]
      ajob.setTriggers(triggersToSet)
    }
  }
}

node {
    // example usage:
    setCron(["master": "H 10 * * *"]) // turns on cron for just the master branch, off for all others

    // alternately,
    setCron()                         // turns off cron for ALL jobs for this repo 
}