gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:23:51 27 4
gpt4 key购买 nike

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

enter image description here

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

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

更新了 post-commit.tmpl 文件

enter image description here

最佳答案

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

From Jenkins Wiki :

If your Jenkins uses the "Prevent Cross Site Request Forgery exploits" security option, the above request will be rejected with 403 errors ("No valid crumb was included"). The crumb needed in this request can be obtained from the URL http://server/crumbIssuer/api/xml (or /api/json). This can be included in the wget call above with something like this:


--header `wget -q --output-document - \
'http://server/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'`

确认此安全选项是否导致问题的最简单方法是禁用它并尝试提交后 Hook 是否有效。如果是,再次启用并尝试使用 crumb 配置 Hook 。 (最后,您希望事情安全:))

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

For this to work, your Jenkins has to allow anonymous read access (specifically, "Job > Read" access) to the system. If access control to your Jenkins is more restrictive, you may need to specify the username and password, depending on how your authentication is configured.



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 以使用此选项,现在我们要找到根本原因)
  • “允许匿名读取访问”安全选项已启用

  • 我认为钩子(Hook)脚本工作得很好,但它被发送到无处。这可以通过记录您的 Hook 脚本轻松检查。只需在钩子(Hook)末尾添加:

    echo "`$REPOS` change to revision `$REV` triggered @ `date`" >> ${REPOS}/post-commit-hook.log

    并查看是否创建了提交日志文件。如果是,则表示 wget请求发送不正确。

    关于使用 POST COMMIT 钩子(Hook)在 SVN 存储库上提交代码时,Jenkins 作业自动触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53188210/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com