就像 @bahrep 所说,很难解决这样的问题,但我的猜测是,由于“防止跨站点请求伪造漏洞”Jenkins 安全选项(您已确认已启用它),您的提交后挂钩不起作用。
来自詹金斯维基 https://wiki.jenkins.io/display/JENKINS/Subversion+Plugin#SubversionPlugin-Windowsspecificpostcommithook:
如果您的 Jenkins 使用“防止跨站请求伪造漏洞”
安全选项,上述请求将被拒绝并出现 403 错误
(“不包含有效的面包屑”)。此请求中所需的面包屑可以
从URL中获取http://服务器/crumbIssuer/api/xml http://server/crumbIssuer/api/xml(或者
/api/json)。这可以包含在上面的 wget 调用中
像这样:
--header `wget -q --output-document - \
'http://server/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'`
确认此安全选项是否导致问题的最简单方法是禁用它并尝试提交后挂钩是否有效。如果是,再次启用并尝试使用 crumb 配置钩子。 (最后,你希望事情安全:))
还要确保 Jenkins 已启用匿名读取访问:
为此,您的 Jenkins 必须允许匿名读取访问
(具体来说,“作业 > 读取”访问)到系统。如果访问控制
对你的 Jenkins 来说更具限制性,你可能需要指定
用户名和密码,取决于您的身份验证方式
配置。
Edit
我认为出现问题是因为您没有提供 Jenkins 实例地址。在您的网络钩子示例中,您有:
http://server/subversion/${UUID}/notifyCommit?rev=$REV
你应该改变server
到您的 Jenkins 实例地址(IP、域或 IP 和端口。这取决于您的配置。)。
http://yourjenkins.com/subversion/${UUID}/notifyCommit?rev=$REV
http://<IP>:<Port>/subversion/${UUID}/notifyCommit?rev=$REV
http://<IP>/subversion/${UUID}/notifyCommit?rev=$REV
或者,如果您在本地运行所有内容(包括 svn repo):
http://localhost:8080/subversion/${UUID}/notifyCommit?rev=$REV
但请记住:
- “防止跨站点请求伪造漏洞”安全选项已禁用(稍后您将创建 Webhook 来使用此选项,现在我们想要找到根本原因)
- 启用“允许匿名读取访问”安全选项
我认为钩子脚本工作得很好,但它被发送到任何地方。通过记录您的钩子脚本可以轻松检查这一点。只需在钩子末尾添加:
echo "`$REPOS` change to revision `$REV` triggered @ `date`" >> ${REPOS}/post-commit-hook.log
并查看提交日志文件是否创建后。如果是,则意味着wget
请求发送不正确。