使用POST COMMIT钩子在SVN存储库上提交代码时,Jenkins作业自动触发

时间:2018-11-07 11:02:42

标签: jenkins svn

我正在尝试使用Jenkins,docker和Ansible实现CI / CD管道。我正在为版本控制系统使用SVN代码存储库。对于部署和SVN代码存储库,我使用的是AWS EC2。部署和代码存储库位于单独的VM中。

我的要求

当我将代码提交到SVN存储库中时,我需要触发一个Jenkins Job。该工作将被称为ansible playbook,稍后将构建项目,构建Docker映像并部署到EC2中。因此,要更改我的SVN代码存储库,我需要构建Jenkins作业。

我当前的尝试

我在$ repo / hooks文件夹下的post-commit.tmpl文件中添加了以下脚本。

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

以下是屏幕截图

enter image description here

并选中“ Jenkins Job中的投票SCM选项”:

enter image description here

注意::我不是要从回购中提取分钟/小时/周的时间表。取而代之的是,我正在寻找代码更改的时间,然后我需要构建Jenkins项目。所以我没有添加任何时间表。

但是我仍然没有得到詹金斯的最新代码。如何找出与我的配置有关的问题?

更新后的commit.tmpl文件

enter image description here

4 个答案:

答案 0 :(得分:3)

就像@bahrep一样,很难解决此类问题,但是我的猜测是,由于“防止跨站点请求伪造漏洞” Jenkins安全选项,您的提交后挂钩不起作用(您已确认已启用) 。

From Jenkins Wiki

  

如果您的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)'`

确认此安全选项是否导致问题的最简单方法是禁用它,然后尝试提交后挂钩是否起作用。如果是,请再次启用并尝试配置带有屑的钩子。 (最后,您要确保事物安全:))

还要确保Jenkins已启用匿名读取访问权限:

  

要使其正常工作,您的Jenkins必须允许匿名读取访问   (特别是“作业>读取”访问权限)到系统。如果访问控制   对您的Jenkins的限制更严格,您可能需要指定   用户名和密码,取决于您的身份验证方式   配置。

enter image description here

编辑

我认为出现问题是因为您没有提供Jenkins实例地址。在您的webhook示例中,您有:

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请求发送不正确。

答案 1 :(得分:1)

我做了很多尝试,通过使用答案中的指导来解决此问题。最终,我得到了我面临的实际问题。我在文件“ post-commit.tmpl”中添加了提交后脚本。创建我的SVN信息库时默认获得此文件。无需添加“ post-commit.tmpl”,只需创建文件“ post-commit”即可。它解决了我的问题。

答案 2 :(得分:0)

很难在没有看到实际错误和日志的情况下解决此问题。但是,可能的原因之一是您的SVN服务器需要身份验证。您应该指定正确的用户名和密码,并确保该用户帐户具有对SVN信息库的读取权限。

答案 3 :(得分:0)

有一种更简单的方法...只需定义触发器的时间表:

jenkins screenshot

或使用trigger builds remotely(如果要使用推式而不是拉式解决方案),这需要使用预定义的API令牌发布到https://username:api-token@JENKINS_URL/job/Example/buildauthenticating scripted clients对此进行了解释。仅基于建议的更改,因为其他所有内容都会不必要地消耗处理能力(等于金钱)。