SVN提交后和Jenkins出现问题

8
我正在尝试使用Jenkins实现CI。到目前为止,我们在环境中已经执行了两个定期构建,但是我们的开发人员希望能够让CI正常工作。我按照Jenkins Subversion插件wiki页面中的说明进行操作:https://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin。这使我得到了一个可以在命令行下执行的脚本,但是当我提交Subversion中的更改(使用TortoiseSVN客户端)时,提交似乎会挂起,我看不到Jenkins被通知的情况。以下是我的脚本:
#!/bin/sh

REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
XSLT_FILE=/var/www/svn/codelog.xslt
RSS_FILE=/var/www/html/code_all.rss
MAX_RESULTS=40

/usr/bin/wget \
  --auth-no-challenge \
  --no-check-certificate \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "`svnlook changed --revision $REV $REPOS`" \
  --output-document "-" \
  --timeout=2 \
  https://192.168.100.16/subversion/${UUID}/notifyCommit?rev=$REV
svn log "file://$REPOS" --limit "$MAX_RESULTS" -v --xml | xsltproc "$XSLT_FILE" - > "$RSS_FILE"

RSS源已经包含在脚本中。这已经运行了一年多。

我还更新了文件权限,以防这是问题所在:

[root@Subversion hooks]# ls post-commit -ao
-rwxrwxr-x 1 apache 530 Jul 17 06:27 post-commit

你正在使用哪个版本的Jenkins? - Yossi
当前正在使用版本1.467... 另外:
  • 所有作业都已设置为轮询SCM
  • 使用CROWD进行身份验证
- jarhorn
首先,从浏览器中调用该URL(您需要找到存储库的UUID - 使用[svnlook](http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.html)作为钩子中使用)。查看是否启动了构建。 - malenkiy_scot
5个回答

5
为了在Jenkins中启用推送模式,您应该在作业的配置页面中启用“轮询SCM”构建触发器。这告诉Jenkins应该在每次发生SCM更改时构建作业。
由于您不必进行任何轮询(您从钩子获取信息),因此可以将该字段留空。

谢谢,Yossi,感谢您查看这个问题。我已经在Jenkins的作业中设置了Poll SCM。目前间隔设置为“@yearly”,但很高兴知道我可以将其留空!请注意,如果我从命令行触发,这确实有效,但当用户提交更改时却无效。 - jarhorn

2

尝试增加超时时间 - 2秒太短了。

以下是适用于我的解决方案:

/usr/bin/wget --http-user=jenkins \
              --http-passwd=passwordGoesHere \
              --header "Content-Type:text/plain;charset=UTF-8" \
              --post-data "`svnlook changed --revision $REV $REPOS`" \
              --output-document "/var/log/svn/svn-notify-commit-post" \
              --timeout=10 \
              --read-timeout=10 \
              --tries=2 \
              "http://jenkins:8082/jenkins/subversion/${UUID}/notifyCommit?rev=$REV" \
              >> /var/log/svn/svn-notify-commit-post.log 2>&1

确保您拥有由正确用户拥有的 /var/log/svn 目录。

另外,启用 SCM 轮询并设置 cron 规则,例如 */30 * * * *


我现在正在从命令行获取日志信息...... 不过还没有从提交中得到任何信息。 似乎它从未调用脚本,但是我知道它是因为脚本的 RSS 部分是有效的。那个文件每次都在更新。 - jarhorn

2
请查看您的URL。由于Jenkins是在Servlet容器中运行的Web应用程序,因此以下内容必须有效:http(s)://server_name:server_port/application_name/subversion/${UUID}/notifyCommit?rev=$REV"
思路是将"subversion/${UUID}/notifyCommit?rev=$REV"传递到正确的位置。

1

我从来不喜欢SVN插件页面的写法。它太容易让人误解,认为你需要在SVN中设置一个Post Commit Hook才能使事情正常工作。但实际上并不需要!

我们在Jenkins上有大约10个构建。所有这些构建都链接到SVN存储库,并且都是由SVN存储库中的更改触发的。没有一个依赖于必须使用SVN中的Post Commit Hook。

为了做到这一点,我们已经配置了构建,只需按计划“轮询SCM”。 “提交”构建使用“*/5 * * * *”的计划。这将每5分钟轮询一次。我们的“每日”构建使用“1 1 * * *”的计划,以便如果有任何更改,构建将在凌晨1:01开始。


2
我明白你的意思,_差不多_准备采用这个选项,但仍然想看看是否可以让推送通知正常工作。 - jarhorn
这已经成为我的选择。虽然我没有回答最初的问题,但是我们小组的每个人都很满意。 - jarhorn
1
恐怕这是一个非常糟糕的解决方案。原因在于,这个方案或许可以运行一段时间,但一旦你开始拥有200-300个任务,你会开始注意到从该机器连接Subversion时出现的错误。在谷歌上搜索一下,在Jenkins JIRA上看看,你就会明白我在说什么了。轮询功能将停止工作。 - carlspring
@carlspring 很好的信息,对于我的应用程序来说并不是问题,但当我们扩大规模时我会记在心里。 - jwernerny
是的,我们过去确实是这样使用的,我确实将其设置为 */5 * * * *(那时),但很快我们就开始遇到问题了。问题在于即使现在这个特定的问题仍未解决,这就是为什么大多数拥有大量模块的人选择让svn钩子部分工作并设置 */30 * * * * 间隔的原因。 - carlspring

0
你有检查 SELinux 是否启用吗?
我曾经遇到相同的问题,并在这里写了解决方案 https://dev59.com/hHNA5IYBdhLWcg3wcNbF#15408506 我遇到的错误是无法连接到 URL(但从命令行调用时可以工作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接