我正在尝试使用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
以下是屏幕截图
并选中“ Jenkins Job中的投票SCM选项”:
注意::我不是要从回购中提取分钟/小时/周的时间表。取而代之的是,我正在寻找代码更改的时间,然后我需要构建Jenkins项目。所以我没有添加任何时间表。
但是我仍然没有得到詹金斯的最新代码。如何找出与我的配置有关的问题?
更新后的commit.tmpl文件
答案 0 :(得分:3)
就像@bahrep一样,很难解决此类问题,但是我的猜测是,由于“防止跨站点请求伪造漏洞” Jenkins安全选项,您的提交后挂钩不起作用(您已确认已启用) 。
如果您的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的限制更严格,您可能需要指定 用户名和密码,取决于您的身份验证方式 配置。
我认为出现问题是因为您没有提供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
但是请记住:
我认为钩子脚本可以正常工作,但是它却无处发送。可以通过记录您的钩子脚本轻松地进行检查。只需在钩子末尾添加:
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)
有一种更简单的方法...只需定义触发器的时间表:
或使用trigger builds remotely
(如果要使用推式而不是拉式解决方案),这需要使用预定义的API令牌发布到https://username:api-token@JENKINS_URL/job/Example/build
; authenticating scripted clients对此进行了解释。仅基于建议的更改,因为其他所有内容都会不必要地消耗处理能力(等于金钱)。