如何实现手动启动的Jenkins流水线任务7天后自动停止每日运行?
实现手动启动、每日运行且7天后自动停止的Jenkins流水线方案
这里有几种可行的实现思路,都是基于Jenkins流水线本身的特性和少量脚本逻辑:
方法一:参数化启动+定时触发器+时长判断脚本
这是最直接的方案,不需要额外插件,靠流水线代码实现控制:
- 把流水线设置为参数化构建,添加一个
START_TIMESTAMP参数,默认值设为当前时间戳(手动启动时自动填充) - 配置每日定时触发器(比如
H 0 * * *,每日凌晨随机时间运行) - 每次流水线启动时,先执行时长检查逻辑,超过7天就移除定时触发器并终止流水线
示例流水线代码:
pipeline { agent any parameters { string( name: 'START_TIMESTAMP', defaultValue: new Date().getTime().toString(), description: '流水线启动时间戳,手动启动时自动生成' ) } triggers { cron('H 0 * * *') // 每日定时运行 } stages { stage('检查运行有效期') { steps { script { def startDate = new Date(Long.parseLong(params.START_TIMESTAMP)) def currentDate = new Date() def daysElapsed = (currentDate.time - startDate.time) / (1000 * 60 * 60 * 24) if (daysElapsed >= 7) { echo "流水线已运行满7天,自动停止后续定时任务" // 移除当前任务的定时触发器 def targetJob = Jenkins.instance.getItemByFullName(env.JOB_NAME) def cronTrigger = targetJob.triggers.find { it instanceof hudson.triggers.CronTrigger } if (cronTrigger) { targetJob.removeTrigger(cronTrigger) targetJob.save() } error("自动终止流水线,已关闭定时构建") } else { echo "流水线已运行${daysElapsed.round(2)}天,继续执行任务" } } } } stage('每日业务任务') { steps { // 这里写你的实际业务逻辑 echo "执行每日业务操作" } } } }
注意:使用Jenkins.instance相关脚本需要在Jenkins全局安全配置中,开启允许脚本访问Jenkins内部API(或者通过脚本审批权限放行相关代码)。
方法二:本地文件存储启动时间(无参数化版本)
如果不想用参数传递启动时间,可以在第一次手动启动时,把启动时间写入Jenkins服务器的本地文件,后续每次运行读取该文件判断时长:
pipeline { agent any triggers { cron('H 0 * * *') } stages { stage('初始化/检查有效期') { steps { script { def timeFile = "/var/jenkins_home/start_time_${env.JOB_NAME}.txt" def startTimestamp // 第一次启动时写入时间戳 if (!fileExists(timeFile)) { startTimestamp = new Date().getTime().toString() writeFile file: timeFile, text: startTimestamp echo "首次启动,记录启动时间戳: ${startTimestamp}" } else { startTimestamp = readFile(timeFile).trim() } def daysElapsed = (new Date().time - Long.parseLong(startTimestamp)) / (1000 * 60 * 60 * 24) if (daysElapsed >= 7) { echo "运行时长超过7天,停止定时并清理记录" def targetJob = Jenkins.instance.getItemByFullName(env.JOB_NAME) def cronTrigger = targetJob.triggers.find { it instanceof hudson.triggers.CronTrigger } if (cronTrigger) { targetJob.removeTrigger(cronTrigger) targetJob.save() } deleteFile file: timeFile error("自动终止流水线") } } } } // 业务阶段... } }
方法三:借助插件简化判断
如果不想写太多脚本,可以安装Conditional BuildStep插件,在流水线前置步骤添加条件判断:
- 用插件的"Execute system Groovy script"步骤,编写时长检查逻辑
- 条件不满足时,终止构建并通过插件或脚本移除定时触发器
关键注意事项
- 确保Jenkins用户对任务配置有修改权限,否则无法移除定时触发器
- 如果是多分支流水线,需要调整
Jenkins.instance.getItemByFullName的参数,匹配分支任务名称 - 定时表达式
H 0 * * *是Jenkins推荐的非固定时间定时,避免同一时间大量任务运行
内容的提问来源于stack exchange,提问作者Julian Re
相关产品推荐
相关产品推荐

