gitea 和 jenkins 网络钩子

Posted

技术标签:

【中文标题】gitea 和 jenkins 网络钩子【英文标题】:gitea and jenkins webhook 【发布时间】:2018-06-27 05:36:12 【问题描述】:

我正在测试 Gitea,并希望它触发 Jenkins 构建,这是非常基本的用例。我知道有现有的 GOGs webhook 插件可以使用,但最近也发现 Jenkins 也有一个 Gitea 插件。

在 GOGS 案例中,您可以通过以下方式调用 Jenkins: http://localhost:8080/gogs-webhook/?job=job_name

在上面的示例中,显然根据需要更新了 Jenkins 位置和作业名称。

问题是Gitea插件没有文档,但是根据源代码,URL应该是:

http://jenkins-url/gitea-webhook/post

我认为应该发生的顺序如下:

    Gitea 看到推送活动并将信息发布到 Jenkins webhook Jenkins Gitea webhook 看到 POST 并使用该信息从 Gitea 获取新的源代码。

问题是 gitea 插件如何知道要执行什么作业?你如何指定这个?现在我可以看到 gitea 正在通过上述 URL 向 Jenkins 发送 POST 但没有发生任何事情,Jenkins 日志也没有任何信息可以理解它失败的原因。

编辑:

我在这里遇到了一个问题,在将生成的公共 SSH 密钥复制到 Gitea 用户帐户后,Jenkins 仍然无法访问 repo 以使用管道编辑器。不确定我在这里缺少什么,因为我能够从 localhost(Docker 环境之外)完美地推/拉,并检查了容器确实也可以完美地看到彼此......

谢谢

【问题讨论】:

根据来源应该是“gitea-webhook”,gitea而不是gogs。 (该插件也不适合我) Phil,您能否确认您是否说您无法使其与 gitea 插件一起使用?从我看到的情况来看,gogs 确实有效,但如果要更新的话,我更喜欢使用 gitea 是的。到目前为止,似乎没有任何可用于 gites 插件的文档。 【参考方案1】:

我已经成功地使用相对较新的版本配置了 Jenkins/Gitea 组合(我对这两个版本都使用了官方的基于 alpine 的 docker 容器)。我使用this Gitea issue 作为指导。我没有在 Jenkins 中使用 Gogs 插件,只使用了 Gitea 插件。我也不使用 Pipeline,只使用经典的手动配置作业。

在 Jenkins 中:在作业设置页面上将“源代码管理”选项设置为“Git”,提供指向您的存储库 (http://gitea-url.your.org/username/repo.git) 的 URL,并在“轮询触发器”部分选中“轮询 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:

curl -vvv -H "Content-Type: application/json" -H "X-Gitea-Event: push" -X POST http://jenkins.server.example.sk:8080/gitea-webhook/post -d ""

正确的响应应该只是简单的“已处理”字符串。如果您有其他内容,请在此处发布。

至于您关于 Jenkins 如何知道要构建什么工作的问题,我的理解是 POST request body contains 是指向 repo/branch 的链接,Jenkins 会在内部查找该工作以找到引用这个 repo(你在上面的工作设置页面中定义的东西)。 This Jenkins wiki page 讲述了更多关于通用钩子的信息,还有 this answer 提供了更多链接,可以解释幕后发生的事情。

要稍微调试一下,您可以使用 gitea 存储库(或组织)设置中的“最近交付”(可单击整个帖子请求和响应!)为 shown in this answer。请记住,gitea 有它的 /etc/gitea/app.ini 文件,其中指定了 ssh 域、gitea 服务器域和 http url,并且您在 jenkins 中指定了 gitea srvers。这些网址必须匹配才能正常工作!

【讨论】:

在看到你的帖子之前,我回去检查了一些东西,让它点击的是选择 Poll SCM 选项,将时间部分留空。【参考方案2】:

当我最初在 Jenkins 中安装 Gitea 插件 并尝试在 Gitea 中配置 webhook 以触发 Jenkins Pipeline 项目(全部在本地完成),然后就像上面提到的 @PhilW(假设你是在http://localhost:8080 运行Jenkins,从Gitea 触发http://localhost:8080/gitea-webhook/?job=job_name 对我也不起作用。

话虽如此,然后我在 Jenkins 中安装了 Gogs 插件,在 Gitea http://localhost:8080/gogs-webhook/?job=job_name 中重新配置了我的 webhook(注意差异),然后 Jenkins 顺利地构建了我的 Pipeline 项目。

另外值得一提的是,作为一个简单的恶作剧,我发现如果您使用适当的 webhook 附件指定 Jenkins 服务器的基本 URL(在您的 Web 浏览器中) - 例如

http://localhost:8080/gogs-webhook/(在 Jenkins 中安装并启用 Gogs 插件),或 http://localhost:8080/bitbucket-hook/(已安装并启用 Bitbucket 插件),

你得到的只是一个空白页面,这似乎表明 Jenkins 中的相关 webhook 很可能按预期运行。

指定 http://localhost:8080/gitea-webhook/(安装并启用 Gitea 插件)返回 HTTP 错误 404,所以我怀疑(只是预感)这个插件可能有一两个错误。

【讨论】:

从我所看到的一切来看,使用旧的 Gogs 插件似乎是要走的路【参考方案3】:

我在 Jenkins 上使用 Gitea Plugin 1.0.4,我对 webhook 没有任何问题。 我没有安装 Gog 插件。

从 Gitea UI(存储库 -> 设置 -> webhooks)我可以手动定义我的 webhook,指示 URL:https://my-jenkins/gitea-webhook/post

这可以手动测试,运行“测试交付”,如图所示:

Jenkins 方面我已经为 Gitea 配置了凭据。 当 Jenkins 找到带有 Jenkinsfile 的项目(我使用管道)时,它会自动为存储库(Gitea 端)配置 webhook(如果不存在)。

Gitea 将通过包含大量 JSON 格式信息的 POST 通知 Jenkins。

Jenkins 必须有权访问 GIT 存储库,因此您需要为他创建 Git 凭据。

【讨论】:

你在 gitea 中为 webhook 放了什么?当我使用你上面给出的 URL 时,(my-jenkins 设置为 localhost:8080 进行测试)我得到一个无效的 URL 错误 我上面写的网址是正确的,我从源代码再次检查:github.com/jenkinsci/gitea-plugin/blob/master/src/main/java/org/…你的错误是什么? 对不起,我可以按照你说的配置 webhook,只是想知道在这种情况下 Jenkins Gitea webhook 是否使用 repo 的名称来查找要执行的作业?或者它如何知道使用上面显示的 URL 执行什么作业?我还更新了我的原始帖子,提出了一些关于 Jenkins 配置方面的问题,我们需要采取哪些步骤? 在我的回答中又添加了两行 你如何指定jenkins执行哪个任务?【参考方案4】:

您可以使用Generic Webhook Trigger Plugin。

使用令牌功能并为每个作业使用不同的令牌。

【讨论】:

【参考方案5】:

在尝试了许多不同的指南以使 webhook 与 Gitea 插件一起使用后,我发现如果 json 请求中的 Gitea 主机名与 Jenkins 知道的主机名不匹配,它不会触发。 我在连接到同一个桥接网络的不同 Docker 容器中运行 Jenkins 和 Gitea,并希望使它们使用内部主机名进行通信。如果有人有类似的设置,尝试在 Jenkins/Gitea 中输入公共 url。 (Jenkins 中还有一个选项,您可以在其中输入 Gitea 网址的别名,但这对我不起作用。) 这不是我想要的,但这样可以正常工作。

【讨论】:

【参考方案6】:

我在 Jenkins 配置中的 Gitea URL 是

http://192.168.1.105:3000 

而 Jenkins 只是忽略了所有的 webhook 触发器。

在 Jenkins/configure/gitea/advanced 中为 Gitea 添加“别名 URL”后,它起作用了:

http://localhost:3000

fugi's answer 为我指明了正确的方向。我在同一台机器上的不同 docker 容器中使用 Jenkins 和 Gitea 进行了类似的设置。

【讨论】:

以上是关于gitea 和 jenkins 网络钩子的主要内容,如果未能解决你的问题,请参考以下文章

jenkins 实验 配置插件和网络钩子

Jenkins无法连接到gitea存储库

Gitea+Jenkins能碰撞出怎样的火花?浅谈前端自动化部署

Jenkins报错Caused: java.io.IOException: Cannot run program "sh" (in directory "D:Jenki(

解锁詹金斯 - 怎么样

自动化部署之jenkins升级和备份