我已经在詹金斯(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:
- 您按下的功能分支,即使尚未合并
- 拉动请求分支,您是否合并
- 主分支(如果/合并功能分支(
除非您将更多的承诺推向功能分支,并在相同的数字下打开拉力请求,否则无法撤消这种损害 - 否则您将配置与一个不同的作业使用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
}