• Jenkins cron定时构建触发器


    from: https://www.jenkins.io/doc/book/pipeline/syntax/#cron-syntax
    以下内容为根据Jenkins官方文档cron表达式部分翻译过来,使用机翻加个人理解补充内容,包括举例。

    介绍

    Jenkins cron 语法遵循 cron 实用程序的语法(有细微差别)。具体来说,每行由 5 个由 TAB 或空格分隔的字段组成:
    在这里插入图片描述

    分钟 小时 日 月 一周中的第几日
    要为一个字段指定多个值,可以使用以下运算符。按照优先顺序,
    *指定所有有效值
    M-N 指定一个值范围
    M-N/X*/XX 为间隔步进通过指定范围或整个有效范围
    A,B,...,Z 枚举多个值
    H 表示有效值范围内任意一个时间点

    为了允许定期调度的任务在系统上产生均匀的负载,应尽可能使用符号 H(“哈希”)。例如,对十几个日常Job使用 0 0 * * * 将导致午夜出现大幅峰值。相比之下,使用 H H * * * 仍会每天执行每个Job一次,但不是同时执行所有Job,更好地利用有限的资源。
    H 符号可以与范围一起使用。例如,H H(0-7) * * * 表示 12:00 AM(午夜)到 7:59 AM 之间的某个时间。您还可以将步长间隔与H一起使用,带或不带范围。
    H 符号可以被认为是一定范围内的随机值,但它实际上是Job名称的哈希值,而不是随机函数,因此该值对于任何给定项目都保持稳定。
    请注意,对于月份字段,由于月份长度可变,*/3 H/3 等短周期在大多数月末附近不会一致工作。例如,*/3 将在长月的第 1 天、第 4 天、…第 31 天运行,然后在下个月的第二天运行。哈希值始终选择在 1-28 范围内,因此 H/3 将在月底的运行之间产生 3 到 6 天的间隙。较长的周期也会有不一致的长度,但效果可能相对不太明显。

    空行和以 # 开头的行将作为注释被忽略。 此外,还支持@yearly@annually@monthly@weekly@daily@midnight @hourly 作为方便的别名。它们使用哈希系统进行自动平衡。例如,@hourlyH * * * * 相同,可以表示一小时内的任何时间。 @midnight 实际上是指 12:00 AM 到 2:59 AM 之间的某个时间。

    举例:

    每十五分钟一次 (perhaps at :07, :22, :37, :52)
    triggers{ cron('H/15 * * * *') }
    每半个小时,隔十分钟一次 (three times, perhaps at :04, :14, :24)
    triggers{ cron('H(0-29)/10 * * * *') }
    周一到周五从上午九点到下午四点,每隔两个小时,在45分钟的时候运行一次,即每个工作日从上午 9:45 开始到下午 3:45 结束,每两小时一次。
    triggers{ cron('45 9-16/2 * * 1-5') }
    每个工作日上午 9 点到下午 5 点之间每两小时一次(可能是上午 10:38、中午 12:38、下午 2:38、下午 4:38)
    triggers{ cron('H H(9-16)/2 * * 1-5') }
    除12月外,每月1日和15日每天一次
    triggers{ cron('H H 1,15 1-11 *') }

    设置方法

    方法一:

    在Jenkins中,可以在config界面配置:
    注: 第一位必须要是 H
    比如 H H * * 1'表示 每周一任意时间执行一次
    在这里插入图片描述
    填写完Schedule 可查看下方的提示确认触发时间。(可用这种方式进行调试)

    方法二:

    cron表达式写到pipeline中(推荐)

    pipeline {
        agent any
        triggers {
            cron('0 12 * * 1') // 每周一的12点触发任务
        }
        stages {
            stage('Build') {
                steps {
                    // 构建任务的步骤
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    其他举例

    # Would last have run at Monday, March 11, 2024 11:36:08 AM CST; would next run at Monday, March 11, 2024 11:38:08 AM CST.
    # 周一,每两分钟执行一次
    H/2 * * * 1
    
    # Would last have run at Monday, March 11, 2024 10:47:25 AM CST; would next run at Monday, March 11, 2024 12:47:25 PM CST.
    # 周一,每两小时执行一次
    H */2 * * 1  或者 H H/2 * * 1
    
    # 每天的晚上11点运行
    pipline {
        triggers {
            cron('H 23 * * *')
        }
    }
    
    # 每天的凌晨00:01分运行,第一位数值不能设置为*
    pipline {
        triggers {
            cron('01 00 * * *') #此配置表示凌晨00:01自动触发
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    @yearly

    在这里插入图片描述

    @annually

    在这里插入图片描述

    @weekly

    在这里插入图片描述

    @daily

    在这里插入图片描述

    @midnight

    在这里插入图片描述

    @hourly

    在这里插入图片描述

    一些问题:

    jenkins中定时构建 在一个pipeline中可以同时设置daily 和weekly吗?可以每个定时器触发不同的stage,且可以daily只触发daily的stage吗?

    好像不行,试过很多种方法,暂时没有实现。如果有什么好的方法,欢迎留言一起讨论。
    目前实现daily,weekly,方法是拆分成两个pipeline,一个cron表达式控制一个job。

    triggers里能写两个cron表达式吗?

    不行,会报错

    pipeline {
        agent any
        triggers {
            cron('19 13 * * *') 
            cron('20 13 * * *')
        }
        stages {
            stage('Build') {
                steps {
                    echo "aa"
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    报错截图:
    在这里插入图片描述

    一个pipeline能写两个triggers吗?

    不能,会报错

    pipeline {
        agent any
        triggers {
            cron('23 13 * * *')
        }
        triggers {
            cron('22 13 * * *')
        }
        stages {
            stage('Build') {
                steps {
                    echo "aa"
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    报错截图:
    在这里插入图片描述

    config中Build periodically定义cron和pipeline里triggers里的cron表达式都写,哪个会生效?

    在Jenkins中,如果config中的Build periodically定义了cron表达式,同时在pipeline脚本中的triggers部分也定义了cron表达式,那么以pipeline脚本中定义的cron表达式为准,即pipeline中定义的cron表达式会生效。因此,当pipeline中定义了cron触发器时,会忽略config中的Build periodically定义的cron表达式。

    拓展阅读:

    详细cron表达式的用法可以参考:
    https://tool.lu/crontab
    https://blog.csdn.net/u011441473/article/details/80902472

  • 相关阅读:
    STM32 JLINK感叹号问题解决
    3分钟带你了解前端缓存-HTTP缓存
    Spring Boot总结笔记
    Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止
    福元医药上市在即:募资净额将达到16亿元,胡柏藩为实际控制人
    vue2+three.js实现宇宙(进阶版)
    浏览器渲染原理
    gradle学习笔记
    Linux学习笔记8
    为什么建议使用虚拟机来安装Linux?
  • 原文地址:https://blog.csdn.net/qq_40804558/article/details/136621323