我已经在Jenkins新的Blue Ocean界面中创建了一个管道,并且希望每小时运行一次。我没有在UI中看到添加构建计划的选项。我确实在经典用户界面中看到了它,但设置不可编辑。安排管道按计划而不是提交运行的建议方法是什么?
Here is a screenshot我在蓝海中看到的设置。
在this screenshoot中,您可以看到"查看配置"的选项。安排作业的设置在那里但不可编辑。
答案 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职位:
除非您将更多的提交推送到功能分支并以相同的数量保持拉取请求打开,否则无法消除这种损害-否则,您将配置一个与另一个不同的 作业。与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
}