2

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

这是我在蓝海中看到的设置的屏幕截图。

此屏幕截图中,您可以看到“查看配置”选项。安排作业的设置在那里,但不可编辑。

4

2 回答 2

0

这些可以通过两种方式完成,具体取决于您的 Jenkinsfile 遵循的结构:

1) 脚本化 Jenkinsfile 方法:

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

2) 声明式 Jenkinsfile 方法:

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

希望对您有所帮助,如有疑问请随时联系。

于 2018-08-14T04:45:51.373 回答
0

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

丑陋的

最简单的方法(例如 schedule "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 
}
于 2019-02-06T14:08:16.497 回答