65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 CRON 调度 Jenkins 任务

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2018年5月6日

CPOL

8分钟阅读

viewsIcon

114029

CRON 任务以及使用不同的 CRON 选项配置 Jenkins 任务

引言

两周前,我和我的团队度过了不平凡的一天。为了向客户进行演示,我们都在努力搭建构建环境,而我的任务是让 Jenkins 作业正常工作,以便对产品进行智能自动化测试。这是我第一次从头开始配置 Jenkins 作业,需要设置从属机器、执行器数量以及可用的选项来相应地调度作业。最有趣的部分是使用构建触发器选项进行调度,该选项与 CRON 作业配合,可在指定时间定期触发作业。从那时起,我就想写一篇关于 CRON 本身及其在 Jenkins 作业中有用的用法的文章。

在本文中,我将重点介绍 CRON 作业的基本作用,以及它们从第 7 版 UNIX 到 UNIX System V 后续版本的一些历史。还将介绍 Windows 版的 CRON 作业和一些其他值得讨论的要点。

CRON 及其用例

在讨论 CRON 语法及其工作原理等技术内容之前,让我们先了解一下谁应该考虑使用 CRON 作业。

想象一下,您的医生建议您每天喝 60 盎司水(通常,1 升约等于 33.xxx 盎司,所以 60 盎司大约是 1.8 升)。但如果您的习惯正常,您不会一次性喝完,而是会合理分配和安排您的饮水量。但如果您不擅长坚持日常习惯,并且很容易忘记事情,该怎么办?那么,最好自动化这个过程,提醒您何时以及做什么任务?

同样,当涉及到软件、实用程序、服务和其他每日/每日起始任务时,您需要安排一些重复性作业来自动触发预先指定的命令。您可以安排任何任务或作业在固定小时后运行,或全天定期运行,每月运行几次,在特定日期或日期运行等等。这时 CRON 作业就能更合适地发挥作用。它们是基于时间的任务调度器,几乎用于所有类型的调度。例如,每天凌晨 1:00 下载报告,重新启动服务器时运行数据库命令并重新启动服务器,彻夜运行 UI 或功能测试脚本等等。

CRON 语法和工作原理

CRON 语法、命令和理解对于理解 Linux 操作系统的功能可能有点挑战性,例如 CRON 工具如何使用具体的命令行语法管理已调度的任务,如何编辑 Crontab 文件,以及 Linux 如何解释这些命令和脚本并定期触发作业。从逻辑上讲,CRON 是一个守护进程,因此它只需要启动一次,然后就会休眠或保持非活动状态,直到到达下一个触发时间。还有一些其他方面也值得考虑,除非您不使用 CRON 进行 Jenkins 作业调度,例如 root 和其他用户使用的 Crontab 文件,这是实际存储 CRON 读取的作业的文件。该文件在操作系统安装时生成。由于本文与通过 CRON 进行 Jenkins 作业调度有关(而非 UNIX 环境中的 CRON 生命周期),因此我在此仅进行浅显的解释。

Jenkins 中的 CRON

导航到 Jenkins 作业“配置”选项的构建触发器选项卡,您会看到“定期构建”和“SCM 轮询”复选框。在配置 Jenkins 构建时,您需要了解并理解 CRON 语法及其作用。

这些是 Jenkins 作业配置中最强大的选项,使其成为目前最灵活的持续集成系统之一。

在进一步解释 CRON 作业在 Jenkins 作业构建中的使用之前,我先分享 Jenkins 作业界面中的一个确切描述,它具有自解释性。Jenkins 提供了两个略有不同的选项来定期构建您的作业,问题是:

  • 您是否需要在每次将新内容推送到存储库以来进行作业执行,或者
  • 您是否希望在您选择的固定或定期时间间隔触发作业,而不管存储库中是否有任何更改。

在第一种情况下,当您需要根据版本控制系统(如 GIT、SVN 或其他)的更改来触发您的作业时,您将从构建触发器选项卡中选择“轮询 SCM”选项。这可以通过编写 CRON 作业每 10 或 15 分钟检查一次存储库中的更改来处理,或者您可以使用某些插件或实用程序,当您的存储库发生更改时,它们会自动向您的作业发出信号。

在后一种情况下,您不必关心版本控制系统的更改,而是希望根据作业的要求触发作业。正如我之前提到的,如果这是服务器相关的作业,那么它的触发时间肯定会有所不同;如果只是关于下载报告并将其转储到数据库,那么您的选择将是构建触发器选项卡中的“定期构建”选项,我将在下面解释语法。

演示:创建和运行作业

考虑创建一个快速的 Jenkins 作业项目,该项目将在凌晨 12:00 运行并删除所有临时文件。

继续启动 Jenkins,可以从 localhost (localhost: 端口) 或您的 Jenkins 托管服务器 IP (ServerIP: 端口) 启动。点击“新建项”,然后添加“自由风格项目”或您觉得可行的任何项目,在本例中,我们创建一个自由风格项目(DeleteTempDaily)。

图 1:在 Jenkins 中创建作业。

通过添加作业详细信息、执行作业的时间、构建步骤等来相应地配置作业。

通用选项卡添加作业详细信息。

图 2:作业配置。

构建触发器选项卡中,通过编写以下 CRON 语法并选择“定期构建”选项来安排您的构建。

图 3:调度作业构建。

构建选项卡添加构建步骤,并编写以下批处理命令进行执行。

图 4:编写批处理命令。

构建您的作业以测试一切是否按预期工作。完成此操作后,您将看到类似以下的构建结果

图 5:构建后的作业结果。

下次您的作业将在凌晨 12:00 自动执行,因为您已使用 CRON 语法将其安排在此时间运行。

就这样,您就可以使用 CRON 时间来创建和运行作业了。

奖励:CRON 语法

在语法上,CRON 对每个时间条目有 5 个位置,因此,CRON 模板的传统单行语法大致如下:

0 23 * * *

// Staged as
{Minute} {Hour} {DayOfMonth} {Month} {DayofWeek}
  • 分钟(0-59)- 告诉作业应该在几点几分构建。
  • 小时(0-23,0 代表午夜)- 告诉作业在 24 小时制中应该在几点构建。
  • 月份中的日期(1-31)- 告诉作业应该在每个月的哪一天构建,例如,每个月的 23 日。
  • 月份(1-12)- 告诉作业应该在哪个月构建。您也可以按数字或名称表示月份,例如 4 月、5 月等。
  • 星期中的日期(0-7,0 或 7 都代表星期日)- 告诉您希望在星期的哪一天构建作业。它也可以是数字或名称,例如周一等。

例如,您可能希望安排您的作业在以下时间运行:

  1. 每天早上 6 点
  2. 每 20 分钟
  3. 每 4 小时

所以,整个 CRON 作业语法如下:

// Every day at 6 in the morning
0 18 * * *

如果您想按小时工作,需要将第一个条目(分钟)固定。上面的表达式表示每天下午 18 点的第 0 分钟运行您的作业,而无需指定日期、月份或星期。现在来看更多 CRON 示例。

每 20 分钟一次

*0/20 * * * *

每 4 小时

0 */4 * * *       

// OR                                                  

0 0,4,8,12,16,20 * * *

在第一种情况下,它将在第 0 分钟运行,然后在 20 分钟后、40 分钟后运行,即每 20 分钟运行一次。这里的 20 是偏移量,表示每隔多少分钟触发一次。

同样,在下一个示例中,第一个条目(分钟)是固定的,第二个条目(小时)包含一个偏移量,表示每隔 4 小时重复一次。在下一行中,也给出了相同 CRON 的更简洁、更易读的语法。

每天上午 11 点和晚上 11 点都运行

0 11, 22 * * *

您可以使用逗号为同一条目定义多个值。这里,小时部分有两个值,第一个是上午 11 点,第二个是晚上 11 点。

每周六和周日下午 5 点

0 17 * * 6,7

这将在每周六(6)和周日(7)的下午 5 点(17 点)运行。

结束语

到目前为止,本文涵盖了 CRON 的理论和实践部分。我们了解了在哪里以及如何使用 CRON 安排 Jenkins 作业,并提供了许多有趣且有用的示例来帮助您理解其语法,这似乎是其工作流程中唯一复杂的部分,其余部分都很容易上手和理解。为了进行一些实践练习并熟悉语法,您可以访问这些在线 CRON 练习网站:https://crontab.guru/https://crontab-generator.org/

历史

  • 2018 年 5 月 6 日:初始版本
© . All rights reserved.