Jenkins Poll SCM无法检测Github提交,如何触发构建?
我之前也碰到过类似的问题,结合你给出的日志和Pipeline脚本,整理了几个实用的排查和解决方向:
1. 确认Jenkins跟踪的分支与远程分支同步
从你的日志里看到Last Built Revision: Revision ecf20b8hhh2f3d63b5809mle268024500364f2fb (refs/remotes/origin/feature/template-api),先做这两步验证:
- 对比Github上
feature/template-api分支的最新提交哈希值,看看和日志里的是否一致。如果不一致,说明Jenkins没拉取到最新的远程代码。 - 到Jenkins运行构建的节点上,手动执行命令测试拉取:
看看输出的最新提交是不是你在Github上推送的内容。如果不是,可能是代理配置(日志里显示设置了http proxy)或者凭据权限问题导致fetch失败。cd <你的Jenkins工作目录路径> git fetch origin feature/template-api git log --oneline origin/feature/template-api
2. 完善Pipeline中git步骤的配置
你的Pipeline git步骤可以补充几个参数,确保拉取权限和工作目录干净:
node { stage('Preparation') { git ( poll: true, branch: 'feature/template-api', credentialsId: '8u56qwcf-e74e-44z3-9437-c81b19cd3a29', fetchCredentialsId: '8u56qwcf-e74e-44z3-9437-c81b19cd3a29', url: 'https://github.developer.company.com/my-project.git', clean: true, fetchTags: true ) } }
fetchCredentialsId确保拉取远程分支时使用正确凭据clean: true保证每次构建都从干净的工作目录开始,避免旧文件干扰fetchTags: true确保拉取分支关联的标签,避免分支状态判断错误
3. 验证Poll SCM的Cron表达式正确性
你设置的1分钟轮询,对应的Cron表达式必须是* * * * *(格式为:分 时 日 月 周),请确认Jenkins任务配置里的Poll SCM输入框是否准确填写了这个表达式,别出现格式错误(比如多空格、少星号)。
4. 排查全局Poll SCM与Pipeline配置的冲突
你同时勾选了Jenkins任务的「Poll SCM」和Pipeline里的poll: true,这可能导致轮询逻辑冲突。建议二选一:
- 去掉任务配置里的「Poll SCM」勾选,完全在Pipeline中配置轮询:
properties([ pipelineTriggers([ pollSCM('* * * * *') ]) ]) node { stage('Preparation') { git ( branch: 'feature/template-api', credentialsId: '8u56qwcf-e74e-44z3-9437-c81b19cd3a29', url: 'https://github.developer.company.com/my-project.git' ) } } - 保留任务配置的「Poll SCM」,删除Pipeline里的
poll: true参数,避免重复配置。
5. 手动触发构建更新Last Built Revision记录
有时候Jenkins初始记录的Last Built Revision是旧的,即使远程有新提交,Poll SCM也会误判为无变化。你可以先手动触发一次构建,让Jenkins拉取最新代码并更新这个记录,之后再观察轮询是否正常。
6. 检查分支名称的大小写问题
Git分支名称区分大小写,如果远程分支实际是Feature/Template-API(大小写不同),而你Pipeline里写的是feature/template-api,就会导致Jenkins跟踪错误分支。可以执行git ls-remote -h https://github.developer.company.com/my-project.git查看远程所有分支的准确名称,确保和配置完全一致。
内容的提问来源于stack exchange,提问作者Johann




