3. Jenkins定时构建与轮询SCM

任务目标

在Jenkins中创建一个自由风格任务,分别配置定时构建(每天一次)与轮询SCM(每分钟检查代码变更),并通过构建日志与触发原因验证两种触发方式的差异。

前置条件

  • Jenkins 2.x 已安装并启动,本机可访问 http://localhost:8080
  • 已安装 Git 插件(系统管理 → 插件管理 → 已安装)
  • 准备一个本地 Git 仓库(可为空仓库或任意测试仓库),用于轮询 SCM 测试

实现步骤

1. 创建测试任务

  1. 点击 新建任务,输入名称 schedule-demo,选择 自由风格项目,点击确定。
  2. 在 源码管理 中选择 Git,Repository URL 填入本地仓库路径(如 /home/user/test-repo 或 https://github.com/example/demo.git)。
  3. 在 构建触发器 中勾选两项:定时构建 与 轮询SCM。

2. 配置定时构建(每天一次)

在“定时构建”的日程表中输入:

H 2 * * *

含义:每天凌晨 2 点执行一次构建(H 为哈希散列值,避免同一时刻并发)。

3. 配置轮询SCM(每分钟检查)

在“轮询SCM”的日程表中输入:

* * * * *

含义:每分钟检查一次远程仓库是否有新提交。若检测到变更,则触发构建;若无变更,则不触发。

4. 添加构建步骤

在 构建 部分点击 增加构建步骤 → 执行 shell,输入:

echo "Build triggered at $(date)"

验证方法

验证定时构建

  1. 保存任务后,等待至设定的时间(或临时将日程改为 * * * * * 以便快速观察)。
  2. 进入任务页面 → 构建历史,查看最新一次构建。
  3. 点击该次构建 → 控制台输出,确认首行显示类似:
Started by timer

这表示由定时触发器启动。

验证轮询SCM

  1. 在本地 Git 仓库中做一次提交并推送(若为本地路径,直接 commit 即可)。
  2. 等待最多 1 分钟,观察 Jenkins 任务页面。
  3. 出现新构建后,查看控制台输出,首行应显示:
Started by an SCM change

若仓库无变更,则不会产生新构建,且任务页面“最近一次轮询”时间会持续更新,但构建历史不变。

判定标准

  • 定时构建触发时,控制台输出包含 Started by timer。
  • 代码提交后 1 分钟内触发构建,控制台输出包含 Started by an SCM change。
  • 两种触发方式均能正确执行 Shell 步骤并打印时间戳。

常见问题

  • 轮询不触发:检查 Git 仓库 URL 是否可访问、Jenkins 服务器是否有该仓库的读取权限;本地路径需确保 Jenkins 进程用户有访问权限。
  • 定时构建未执行:确认服务器时区设置(系统管理 → 系统设置 → 时区),Jenkins 默认使用服务器本地时间。
  • 两种触发器同时满足:同一分钟若既有定时触发又有代码变更,Jenkins 只会执行一次构建,触发原因显示为其中一种(通常为 SCM 变更优先)。

触发机制说明

定时构建 Cron: H 2 * * * 到达设定时间 轮询SCM Cron: * * * * * 每分钟检查Git变更 有变更? 不构建 执行构建 定时触发 → Started by timer SCM变更 → Started by an SCM change

上图展示了两种触发器的判断路径:定时构建到点直接触发;轮询SCM则先检查仓库是否有新提交,有变更才触发构建,无变更则跳过。通过控制台输出的首行原因即可区分实际由哪种方式触发。