预定的詹金斯蓝色海洋管道扳机



我已经在詹金斯(Jenkins(新的蓝色海洋界面创建了一个管道,并希望每小时运行它。我没有在UI中看到添加构建时间表的选项。我确实在经典的UI中看到了它,但是设置不可编辑。什么是安排管道以按计划运行而不是提交的建议方法?

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

在此屏幕上,您可以看到"查看配置"的选项。安排工作的设置在那里,但不可编辑。

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

1(脚本jenkinsfile方法:

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

2(声明性詹金斯菲尔方法:

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

希望这对您有所帮助,可以在查询时随意联系。

对于脚本管道,此功能已在开箱即用(截至2019年(实现不佳。

丑陋

最简单的方法(例如,对于时间表"H 10 * * *"(是将以下内容放在您的Jenkinsfile中:

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

在Blueocean,每个分支和拉的请求将其视为其自己的工作 - 因此,如果您遵循标准的Git Workflow,上述代码将创建不少于三个Cron Jobs:

  1. 您按下的功能分支,即使尚未合并
  2. 拉动请求分支,您是否合并
  3. 主分支(如果/合并功能分支(

除非您将更多的承诺推向功能分支,并在相同的数字下打开拉力请求,否则无法撤消这种损害 - 否则您将配置与一个不同的作业使用cron脚本。您只能在Jenkins控制台中修复它,因为(如您指出的那样(,Blueocean设置将阻止您对工作设置的访问,就像在非蓝色jenkins UI中一样。

这样做的一种稍聪明的方法是使时间表取决于使用了哪个分支。

def mySchedule = BRANCH_NAME == "master" ? "H 10 * * *" : ""
node {
  properties([
    pipelineTriggers([cron(mySchedule)])
  ])
}

这可以避免"丑陋"的情况,但不能消除任何以前的损害。当然,它不能阻止任何人以自己的拉动请求删除条件(即偶然或不知不觉地回到"丑陋"(。

安全的方法需要直接访问詹金斯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 
}

相关内容

  • 没有找到相关文章

最新更新