我已经在Jenkins新的Blue Ocean界面中创建了一个管道,并希望它每小时运行一次。我在UI中看不到添加构建计划的选项。我确实在经典的UI中看到了它,但设置是不可编辑的。将管道安排为按计划而不是按提交运行的推荐方法是什么?
我在蓝海中看到的设置的Here is a screenshot。
在this screenshoot中,您可以看到“查看配置”选项。用于调度作业的设置已存在,但不可编辑。
发布于 2018-08-14 12:45:51
根据Jenkinsfile所遵循的结构,可以通过两种方式完成这些操作:
1)脚本Jenkinsfile方法:
node('node_name') {
properties(
[
pipelineTriggers([cron('0 0 * ? * * *')])
]
)2)声明性Jenkinsfile方法:
triggers {
cron('0 0 * ? * * *')
}希望这能对你有所帮助,如有疑问请随时联系。
发布于 2019-02-06 22:08:16
对于脚本化管道,此功能的开箱即用实现很差(截至2019年)。
丑八怪
最简单的方法(例如,对于schedule "H 10 * * *")是在您的Jenkinsfile中放置以下内容
node {
properties([
pipelineTriggers([cron("H 10 * * *")])
])
}在BlueOcean中,每个分支和每个拉取请求都被视为自己的作业--因此,如果您遵循标准的git工作流,上面的代码将创建至少三个cron作业:
除非您将更多的提交推送到feature分支,并在相同的数量下保持拉取请求打开,否则无法恢复此损害--否则,您将配置一个与使用cron脚本的作业不同的作业。您只能在Jenkins控制台中修复它,因为(正如您所提到的),BlueOcean设置将阻止您访问作业设置,就像在非BlueOcean Jenkins UI中一样。
坏处
一种稍微聪明一点的方法是使调度取决于所使用的分支。
def mySchedule = BRANCH_NAME == "master" ? "H 10 * * *" : ""
node {
properties([
pipelineTriggers([cron(mySchedule)])
])
}这可以避免“丑陋”的情况,但它不能消除任何先前的损害。它当然不能阻止任何人在他们自己的pull请求中删除条件(即无意或无意地回到“丑陋的人”)。
好的一面
执行此操作的安全方法需要直接访问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
}https://stackoverflow.com/questions/43532058
复制相似问题