Jenkins任务无Git提交仍每分钟触发,如何配置仅提交后构建?
解决Jenkins无代码提交却自动构建的问题
嗨,刚接触Jenkins遇到这种问题很正常,咱们先搞清楚原因,再一步步解决:
为什么会每分钟自动构建?
你设置的Poll SCM调度规则* * * * *是让Jenkins每分钟都去轮询GitHub仓库的状态。有时候哪怕没有代码提交,Jenkins也可能因为仓库的一些元数据变动(比如分支缓存更新、时间戳差异)误判为有代码变更,从而触发不必要的构建。而且这种轮询方式本身就不够高效,其实咱们有更好的办法实现「Push即触发构建」的需求。
推荐方案:用GitHub Webhook触发构建(实时又高效)
这是最靠谱的方式,只有当你向GitHub推送代码时,才会主动通知Jenkins触发构建,完全避免无意义的轮询:
修改Jenkins任务的构建触发器
- 打开你的自由风格任务,进入「配置」页面
- 找到「构建触发器」板块,先取消勾选
Poll SCM - 然后勾选
GitHub hook trigger for GITScm polling选项
在GitHub仓库配置Webhook
- 打开你的GitHub项目页面,点击顶部的「Settings」→ 左侧菜单选「Webhooks」→ 点击「Add webhook」
- 在「Payload URL」里填你的Jenkins地址加上
/github-webhook/,比如http://你的JenkinsIP:端口号/github-webhook/ - 「Content type」选
application/json - 在「Which events would you like to trigger this webhook?」里选「Just the push event.」(只在推送代码时触发)
- 勾选「Active」,最后点击「Add webhook」
这样配置完,以后你每次往GitHub Push代码,GitHub都会主动发通知给Jenkins,Jenkins就会立刻触发构建,再也不会出现无提交自动跑构建的情况了。
备选方案:优化Poll SCM规则(仅当无法用Webhook时)
如果因为网络或者环境限制必须用Poll SCM,可以这么调整:
降低轮询频率
把调度规则从* * * * *(每分钟)改成比如每5分钟一次:*/5 * * * *,这样能减少误触发的次数。添加实际变更检测
在Jenkins任务的「构建」步骤里,加一个「Execute shell」(Linux/macOS)或「Execute Windows batch command」(Windows),先检查是否真的有代码变更:- Linux/macOS可以用这段命令:
# 获取上次构建的commit哈希和当前仓库最新commit哈希 LAST_COMMIT=$(git rev-parse HEAD@{1}) CURRENT_COMMIT=$(git rev-parse HEAD) # 如果两次哈希一致,说明没变更,终止构建 if [ "$LAST_COMMIT" = "$CURRENT_COMMIT" ]; then echo "没有检测到代码变更,终止构建。" exit 1 fi - 这样就算Jenkins误判有变更,也会因为实际没有代码提交而停止构建。
- Linux/macOS可以用这段命令:
小提醒
- 要是用Webhook的话,得确保Jenkins能正常访问GitHub,同时GitHub也能访问你的Jenkins服务器(如果Jenkins在局域网里,可能需要配置端口转发或者用公网地址)
- 可以去Jenkins的「系统管理」→「系统配置」里检查GitHub的配置,确保已经添加了有效的个人访问令牌作为凭据
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

