REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
/usr/bin/wget \
--header "Content-Type:text/plain;charset=UTF-8" \
--post-data "`svnlook changed --revision $REV$REPOS`" \
--output-document "-" \
--timeout=2 \
http://server/subversion/${UUID}/notifyCommit?rev=$REV# 请注意rev = $ REV参数,这告诉Jenkins准确检查挂钩报告的修订版本。 如果您的工作有多个Subversion模块位置定义,这可能导致检出不一致 - 所以建议在这种情况下不要使用'?rev = $ REV'。
```
如果您的Jenkins使用“防止跨站点请求伪造攻击”安全选项,则上述请求将被拒绝403错误(“未包含有效碎屑”)。 该请求中需要的碎屑可以从URL http:// server / crumbIssuer / api / xml(或/ api / json)获取。 这可以包含在上面的wget调用中,如下所示:
```
--header `wget -q --output-document - \
'http://server/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'`
```
由于wget默认情况下重试次数不超过给定超时时间为20次,所以在慢速SVN服务器上的--timeout = 2可能会导致Jenkins扫描存储库多次,进一步减缓SVN服务器一段时间后,使詹金斯没有反应。
此问题的可能解决方案是增加超时时间,使用参数-retries = 3添加更低的最大重试次数,或者通过添加2>&1&last而使wget调用异步(从而忽略任何通信错误) wget调用。超时太低可能导致您的提交挂起并抛出502错误,如果您在代理后面,或提交后错误,如果没有。 增加超时,直到不再看到wget重试。
```
#!/bin/sh
REPOS="$1"
REV="$2"# No environment is passed to svn hook scripts; set paths to external tools explicitly:
WGET=/usr/bin/wget
SVNLOOK=/usr/bin/svnlook
# If your server requires authentication, it is recommended that you set up a .netrc file to store your username and password# Better yet, since Jenkins v. 1.426, use the generated API Token in place of the password# See https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients# Since no environment is passed to hook scripts, you need to set $HOME (where your .netrc lives)# By convention, this should be the home dir of whichever user is running the svn process (i.e. apache)
HOME=/var/www/
UUID=`$SVNLOOK uuid $REPOS`
NOTIFY_URL="subversion/${UUID}/notifyCommit?rev=${REV}"
CRUMB_ISSUER_URL='crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
function notifyCI {
# URL to Hudson/Jenkins server application (with protocol, hostname, port and deployment descriptor if needed)
CISE