jenkins自动构建配置:代码提交后自动触发构建的两种方案
不想每次提交代码都去点”立即构建”?这篇教你两种自动触发方式
之前我们聊了怎么安装 Jenkins、怎么配置工具链,但有一个很现实的问题:每次提交完代码都要手动去点一下构建,真的很烦。
尤其是一天提交几十次的时候,点都点烦了。这篇专门讲一下怎么让 Jenkins 自动检测代码变动并触发构建。我自己的经历是:先用了轮询,后来嫌慢改成了 WebHook。
方案一:定时轮询
这个方法很”笨”,但配置起来确实省事——就是让 Jenkins 每隔几分钟去 Git 仓库看一眼:有新的提交就拉下来构建,没有就拉倒。
配置步骤
进入你的 Jenkins 项目配置页面(点击项目名称 → 左侧「Configure」)。
滚动到「Build Triggers」(构建触发器)部分,勾选「Poll SCM」。
在输入框中填写
定时表达式,定义轮询频率。例如:
1
H/5 * * * *
这个表达式的意思是”每 5 分钟检查一次”。那个
H是 Jenkins 自己加的一个随机偏移量,防止所有项目都在同一秒去轮询,把服务器搞崩。![自动构建]()
定时表达式规则
Jenkins 的表达式格式和 Linux 的 crontab 一样:分 时 日 月 周。几个常用的写法:
*:任意值(如* * * * *表示每分钟检查)。H:随机值(例如H/10 * * * *表示每 10 分钟随机时间点检查)。*/N:每隔 N 单位(如0 */2 * * *表示每 2 小时检查一次)。- 固定值:如
0 9 * * 1-5表示每周一至周五上午 9 点检查。
优缺点
- 优点:配置简单,不用动 Git 仓库的任何设置,内网外网都能用。
- 缺点:有延迟。你设 5 分钟轮询一次,那从 push 代码到触发构建,平均要等 2.5 分钟,最长可能等 5 分钟。而且如果项目多了,每个项目都去轮询,服务器压力也不小。
方案二:仓库触发(WebHook)
这是更高效的方式:Git 仓库在你 push 代码之后,主动通知 Jenkins,Jenkins 收到就立刻开始构建。几乎是实时的。
前置条件
WebHook 需要 Git 仓库能访问到 Jenkins:
- 如果你的 Jenkins 跑在本地,需要有个公网地址(或者用内网穿透工具)
- 如果 Jenkins 和生产环境一样有公网 IP,那就直接配
另外,Jenkins 和 Gitee/GitHub 的凭证连接要先配好(这个在上一篇工具配置里已经说过了)。
以 Gitee 为例配置 WebHook
步骤 1:配置 Jenkins 项目触发器
- 进入项目配置页面 →「Build Triggers」,勾选「GitHub hook trigger for GITScm polling」(Gitee 兼容 GitHub 的 WebHook 格式,直接勾选即可)。
- 如果需要更精细控制(如指定分支触发),可以配合「Generic Webhook Trigger」插件(需要提前安装),通过解析仓库推送的 JSON 数据过滤触发条件。
步骤 2:在 Gitee 仓库配置 WebHook
登录 Gitee 仓库,进入仓库主页 → 右侧「管理」→「WebHook 管理」→「添加 WebHook」。
Payload URL:填写 Jenkins 的 WebHook 接收地址,格式为:
1
http://你的Jenkins地址:端口/github-webhook/
本地测试的话就是
http://localhost:8080/github-webhook/,线上换成你的公网地址。Secret(可选):设置一个密钥,和 Jenkins 中「Generic Webhook Trigger」的密钥对应,用于验证请求合法性。
触发事件:勾选「Push 事件」(代码推送时触发),如果需要其他事件(如合并请求)可以按需勾选。
点击「添加」完成配置,Gitee 会自动发送一个测试请求,返回状态码
200即表示配置成功。
验证 WebHook
push 点代码试试,去 Jenkins 项目页面看 Build History 里有没有自动新增一条记录。如果没有,去 Gitee 的 WebHook 管理页面看最近的推送记录,一般能看到报错原因。或者在 Jenkins 系统日志(「Manage Jenkins」→「System Log」)中排查错误(常见问题:Jenkins 地址不可访问、密钥不匹配、插件未安装)。
优缺点
- 优点:实时性高(代码提交后立即触发),而且没有轮询的无效请求,省服务器资源。
- 缺点:需要确保 Jenkins 可被仓库访问,配置稍复杂(尤其是网络和密钥验证)。
两种方案怎么选?
| 场景 | 建议 |
|---|---|
| 本地开发测试、个人小项目 | 轮询就够了,省事 |
| 生产环境、团队协作 | 必须上 WebHook,实时性很重要 |
| Jenkins 在防火墙内,仓库访问不到 | 只能轮询 |
我自己的做法是:本地开发环境用轮询(懒得折腾网络),线上环境用 WebHook(正经项目等不起那几分钟)。
