You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现手动启动的Jenkins流水线任务7天后自动停止每日运行?

实现手动启动、每日运行且7天后自动停止的Jenkins流水线方案

这里有几种可行的实现思路,都是基于Jenkins流水线本身的特性和少量脚本逻辑:

方法一:参数化启动+定时触发器+时长判断脚本

这是最直接的方案,不需要额外插件,靠流水线代码实现控制:

  1. 把流水线设置为参数化构建,添加一个START_TIMESTAMP参数,默认值设为当前时间戳(手动启动时自动填充)
  2. 配置每日定时触发器(比如H 0 * * *,每日凌晨随机时间运行)
  3. 每次流水线启动时,先执行时长检查逻辑,超过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:15:25