首页 > 解决方案 > 使用 POST COMMIT 钩子在 SVN 存储库上提交代码时,Jenkins 作业自动触发

问题描述

我正在尝试使用 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 中的 Poll SCM 选项”:

在此处输入图像描述

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

但是我仍然没有在 Jenkins 中获得最新的代码。如何找出与我的配置相关的问题?

更新了 post-commit.tmpl 文件

在此处输入图像描述

标签: jenkinssvn

解决方案


就像@bahrep 说很难解决这样的问题,但我猜你的提交后挂钩不起作用,因为“防止跨站点请求伪造漏洞利用”Jenkins 安全选项(你已经确认它已启用)。

来自詹金斯维基

如果您的 Jenkins 使用“防止跨站点请求伪造攻击”安全选项,上述请求将被拒绝并出现 403 错误(“未包含有效的碎屑”)。该请求中需要的 crumb 可以从 URL 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 的访问控制更严格,您可能需要指定用户名和密码,具体取决于您的身份验证配置方式。

在此处输入图像描述

编辑

我认为出现问题是因为您没有提供 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请求发送不正确。


推荐阅读