Jenkins Mercurial插件无法检测代码变更,如何解决?
从你给出的轮询日志里的no polling baseline就能定位到核心问题:Jenkins还没有在工作区建立用于对比变更的基线版本,所以哪怕钩子触发了轮询,也没有参照的版本来判断是否有变更。下面是一步步的解决步骤:
1. 先手动触发一次初始构建
这是最关键的一步。Jenkins的SCM轮询机制依赖于已完成的构建生成的基线信息,现在你的工作区/var/lib/jenkins/workspace/test-repo里完全没有基线数据,自然没法检测变更。
直接在Jenkins控制台找到polling-test流水线,手动点击"立即构建"。这次构建会拉取仓库的当前代码,同时在工作区生成轮询必需的基线标记文件。
2. 核对SCM配置的细节
检查你的流水线checkout步骤的几个关键配置:
- 确认
credentialsId: 'jenkins'对应的凭据拥有目标Mercurial仓库的拉取权限,能正常通过ssh://hg-user@hg-server/test-repo访问仓库(可以在Jenkins服务器上用jenkins用户手动执行hg clone ssh://hg-user@hg-server/test-repo测试) - 确保
revision: 'default'是你实际推送变更的分支——如果你的变更推送到了其他分支,轮询肯定检测不到
3. 确保推送钩子的URL完全匹配
你用curl触发的钩子URL是https://jenkins-server/mercurial/notifyCommit?url=ssh://hg-user@hg-server/test-repo,这个URL必须和流水线checkout步骤里的source地址完全一致,包括大小写、SSH端口(如果有的话)、路径细节。Jenkins的Mercurial插件是严格匹配仓库URL来关联对应流水线的,哪怕一点点差异都会导致钩子触发了但找不到要轮询的流水线。
4. 检查工作区的权限
确保Jenkins系统用户(一般是jenkins用户)对/var/lib/jenkins/workspace/test-repo目录有完整的读写权限,不然没法创建和更新基线文件。可以在Jenkins服务器上执行以下命令检查:
ls -ld /var/lib/jenkins/workspace/test-repo
如果权限不正确,执行下面的命令调整:
chown -R jenkins:jenkins /var/lib/jenkins/workspace/test-repo
5. 验证修复效果
完成上面的步骤后,再做一次仓库变更并推送:
echo "verify fix" > verify.txt hg add verify.txt hg commit -m "test polling fix" hg push
然后再次用curl触发轮询:
curl "https://jenkins-server/mercurial/notifyCommit?url=ssh://hg-user@hg-server/test-repo"
这次轮询应该能检测到变更,自动触发新的构建了。
另外,你的Jenkins和Mercurial插件版本不算最新,但这个问题的核心是基线缺失,上面的步骤应该能解决。如果后续还有问题,可以考虑更新到对应Jenkins版本支持的最新Mercurial插件版本。
内容的提问来源于stack exchange,提问作者RogerFC

