我的要求是每当开发人员推送到github时,那么在推送之前,CI构建应该在Jenkins服务器上触发。如果该构建失败,则应拒绝推送到github。 我需要为此编写钩子,但我不想编写客户端钩子,因为开发人员可以禁用它们。我想要服务器端的github webhooks或预接收挂钩。
现在,这甚至可以实现吗? 如果是,那么从哪里开始?我需要Rest API的知识吗?我需要编写shell脚本吗?
答案 0 :(得分:8)
这通常不是GitHub可以使用的工作流程 您宁愿使用带有2 GitHub repo的“guarded commits”模型:
这是我的项目的要求,无法更改
在这种情况下,最好遵循以下Building a CI server:
这意味着开发人员应该只推送到服务器监控的“dev”分支,如果编译通过,你的CI引擎会将这些提交推送到主分支。
答案 1 :(得分:1)
经过一番研究,我发现可以使用github的webhook触发jenkins构建,但如果jenkins'无法拒绝github推送请求。构建失败。所以,基本上,我们无法控制github的推送,至少不是免费的github账户。
答案 2 :(得分:0)
不可能完全按照你的要求去做,但是可以做一些应该足够接近的事情。
您可以配置GitHub的钩子来调用CI服务器以在每次推送时运行构建。启动CI作业时,它应克隆存储库,然后强制将分支推送到其先前的状态。如果构建成功,再次推送分支。
这需要您的Jenkins作业具有使其能够写入存储库的凭据。
但是,您应该了解此方法容易发生合并冲突。当第一个作业运行时(或者更糟的是,排队),有人可能会推送到同一个分支。您可能在同一分支上有两个作业。排队的作业必然会导致问题,其中最重要的是分支将在GitHub上更新,直到作业运行并且有人可能会提取更改。
话虽如此,我的建议是这个工作流程不可扩展。一种可能的替代方法是使用受保护的分支,并在成功构建之后让CI作业将功能分支合并到受保护的分支中(只要它是快进合并)。