Github网络钩子 - 预推送钩子

6
我的要求是,每当开发人员推送到Github时,在推送之前应该在Jenkins服务器上触发CI构建。如果该构建失败,则不应将推送提交到Github。我需要为此编写钩子,但我不想编写客户端钩子,因为它们可以被开发人员禁用。我想要服务器端的Github Webhooks或Pre-receive Hooks。
现在,这种实现甚至可能吗? 如果是,那么从哪里开始?我需要了解Rest API吗?我需要编写shell脚本吗?
3个回答

8
这通常不是GitHub支持的工作流程。您应该使用带有2个GitHub存储库的“受保护提交”模型:

这是我的项目的要求,不能更改

在这种情况下,最好遵循构建CI服务器,它将:

  • 检测推送并触发编译
  • 为有效提交推回专用分支(例如可以是主分支)

这意味着开发人员只能推送到由您的服务器监视的“dev”分支,如果编译通过,则您的CI引擎会将这些提交推送到主分支。


我同意我的工作流程并不常用,但这是我的项目的要求,无法改变。因此,我只想知道 Webhooks 解决方案是否可行。 - Gauranga Rathod
@GaurangaRathod 那么总体思路保持不变,只有一个GitHub仓库但是有两个分支:我已经相应地编辑了我的答案。 - VonC
你又改变了我的工作流程。我必须使用Github Webhooks,并且需要将其纳入考虑。 - Gauranga Rathod
@GaurangaRathod 使用 GitHub webhooks 来构建 CI 服务器。 - VonC

1

虽然不能完全做到你要求的事情,但可以做一些接近要求的事情。

你可以配置GitHub的钩子来调用CI服务器在每次推送时运行构建。当启动CI作业时,它应该克隆存储库,然后强制将分支推回其先前状态。如果构建成功,再次推送分支

这需要你的Jenkins作业具有使其能够写入存储库的凭据。

但是,你应该了解到这种方法容易出现合并冲突。可能会有人在第一个作业正在运行(或更糟糕的是排队)时推送到同一分支。你可能会有两个作业在同一分支上工作。排队的作业肯定会带来问题,其中最小的问题是分支将在GitHub上更新,直到作业运行并且某人可能会拉取更改。

话虽如此,我的建议是这种工作流程不可扩展。一个可能的替代方案是使用受保护的分支,并在成功构建后让你的CI作业将特性分支合并到受保护的分支中(只要它是快进合并)。


0
经过一些研究,我发现使用Github的Webhooks可以触发Jenkins构建,但如果Jenkins构建失败,则无法拒绝Github推送请求。因此,基本上我们无法控制Github的推送,至少在免费的Github账户中是这样的。

这就是为什么我在我的回答中提出了一种不同的工作流程:一旦GitHub上进行了推送(并触发了Webhook),您确实无法在GitHub上“拒绝”该推送。 - VonC
@VonC 不同的工作流肯定是更好的解决方案,但您是否知道在Github企业版或Github的私有存储库中拒绝推送是否可能? - Gauranga Rathod
是的,如果您控制Git仓库托管服务器,则可以添加钩子(而不是Webhook),这意味着如果未执行策略,您可以拒绝推送。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接