Github Abhukas - 预推钩

Github webhooks - pre-push hooks

我的要求是,每当开发人员推送到 github 时,在推送之前应该在 Jenkins 服务器上触发 CI 构建。如果该构建失败,则应拒绝推送到 github。 我需要为此编写挂钩,但我不想编写客户端挂钩,因为它们可能会被开发人员禁用。我想要服务器端 github 网络挂钩或预接收挂钩。

现在,这甚至有可能实现吗? 如果是,那么从哪里开始?我需要 Rest API 的知识吗?我需要编写 shell 个脚本吗?

这通常不是 GitHub 的工作流程。
您宁愿使用带有 2 GitHub 存储库的 "guarded commits" 模型:

  • 一个用于推送,您可以在其中启用 CI 服务 like, for instance, Travis (or your own CI server),
  • 一个用于有效提交(通过 CI 的提交),由 Travis 推送 (as in this question),并由开发人员用于同步他们的 repo(仅拉,不推送)

that's what the requirement is for my project, which can't be changed

在那种情况下,最好遵循 Building a CI server,这将:

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

这意味着开发人员应该只推送到 "dev" 分支,由您的服务器监控,如果编译通过,您的 CI 引擎会将这些提交推送到 master 分支。

经过一番研究,我发现可以使用 github 的 webhooks 触发 jenkins 构建,但如果 jenkins 的构建无法拒绝 github 推送请求失败。所以,基本上,我们无法控制 github 的推送,至少在免费 github 帐户中没有。

不可能完全按照您的要求做,但可以做一些应该足够接近的事情。

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

这需要您的 Jenkins 作业具有允许其写入存储库的凭据。

但是,你应该明白,这种方法很容易发生合并冲突。有可能有人会在第一份工作 运行ning(或更糟,排队)时推送到同一个分支。您可能有两个工作在同一个分支上工作。排队的作业必然会导致问题,其中最少的是分支将在 GitHub 更新,直到作业 运行s 并且有人可能会提取更改。

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