我已经成功地使用相对较新的版本配置了 Jenkins/Gitea 组合(我对两者都使用基于 alpine 的官方 docker 容器)。我用了这个 Gitea 问题作为指导。我没有使用Jenkins中的Gogs插件,只使用了Gitea插件。我也不使用 Pipeline,只使用经典的手动配置作业。
在 Jenkins 中:在作业设置页面上,将“源代码管理”选项设置为“Git”,提供您的存储库的 URL (http://gitea-url.your.org/username/repo.git),并在“轮询触发器”部分中选中“轮询 SCM”选项,但未定义计划。此设置基本上告诉 Jenkins 仅在通过 Webhook 请求时轮询您的 Gitea 存储库。
在 Gitea 中:在 repo -> Settings -> Webhooks 下,添加新的 webhook,将 URL 设置为http://jenkins_url.your.org/gitea-webhook/post,并清除秘密(留空)。
此时,单击“测试交付”按钮应该会产生成功的交付尝试(绿色复选标记)。
如果您的测试交付失败,请尝试查看是否可以 POST 到 Jenkins webhook URL (http://jenkins_url.your.org/gitea-webhook/post)。例如。使用Postman或使用卷曲:
curl -vvv -H "Content-Type: application/json" -H "X-Gitea-Event: push" -X POST http://jenkins.server.example.sk:8080/gitea-webhook/post -d "{}"
正确的响应应该只是简单的“已处理”字符串。如果您得到其他东西,请将其发布在这里。
至于你的问题詹金斯如何知道要构建什么工作,我的理解是POST 请求正文包含指向存储库/分支的链接,Jenkins 会在内部查找该存储库以找到引用此存储库的作业(您在上面的作业设置页面中定义的内容)。这个 Jenkins 维基页面详细介绍了通用钩子,还有这个答案进一步的链接可能会解释一下幕后发生的事情。
调试东西稍微,您可以使用 gitea 存储库(或组织)设置中的“最近交付”(可单击整个帖子请求和响应!)作为在这个答案中显示。请记住,gitea 有其 /etc/gitea/app.ini 文件,其中指定了 ssh 域、gitea 服务器域和 http url,并且您在 jenkins 中指定了 gitea srvers。这些 url 必须匹配才能正常工作!