我试图建立一个自动化的CI流程GitHub和Jenkins。目标是让开发人员使用Jenkins Github Pull Request Merger创建功能分支并生成自动合并的拉取请求(当然,如果他们通过构建)。
进一步的目标是要求拉取请求针对开放的GitHub问题。对我们来说,这意味着拉取请求标题或至少一个拉取请求提交消息必须包含一个子串,如#34;修复#NN"其中#NN必须引用 打开 GitHub问题。这个' issue_opened'支票也是自动化的 - 我们的问题已经开启' GitHub应用程序查询GitHub问题并检查提交消息和PR标题,然后它以状态发布拉取请求(出于测试目的,我总是发布'失败')。
设想的过程如下:
1.功能分支推送由Jenkins自动构建
2.当功能分支准备就绪并通过Jenkins测试时,开发人员将生成拉取请求;这会自动触发步骤3& 4,各自独立运行:
3.我们的问题已经开启了#39; GitHub App非常快速地将状态发送到拉取请求
4. Jenkins执行构建 - 它比第3步花费更长的时间。如果构建通过,Jenkins将应用该状态。如果所有状态都是“成功”,则拉取请求会自动合并。
我观察到的:
目前,我的pull请求正在将功能分支合并到master。 Master受保护(GitHub主分支:设置>分支>保护此分支>要求状态检查在合并之前通过并且'issue_opened'状态检查设置为必需。)一切正常按计划,除了Github Pull Request Merger打破GitHub约定并且仅尊重其自身状态,而不是其他状态。
PR合并仅取决于Jenkins:
在第3步之后发布“失败”。状态,但在第4步完成之前,GitHub报告"必要的状态必须在合并之前通过"并表示' issue_opened'状态是“失败”。但是当Jenkins构建成功时,无论如何都会发生合并
FWIW,如果功能分支在创建拉取请求时已经处于错误状态,也会发生合并
我有什么方法可以做到我想做的事情?
答案 0 :(得分:0)
在更加绝望的摆弄之后,我尝试启用GH主分支保护设置设置>分支>受保护的分支>主>保护此分支>包括管理员和'瞧瞧:它很漂亮对我来说很有用,或多或少:
Jenkins Github Pull Request Merger仍尝试进行合并,但GitHub会返回此信息:
HTTP响应代码:405,消息:'方法不允许' 。
作为rc 405的结果,Jenkins生成了一个java.io.IOException并从GH重新发出这条json消息:
{"消息":" 2个必需状态检查中的2个未成功:1个失败,1个未决。"," documentation_url":&#34 ; https://help.github.com/enterprise/2.10/user/articles/about-protected-branches"} 的
詹金斯然后发现了一个失败的'状态(由于构建本身并未失败,因此可能会狡辩)。
这是有道理的,因为我是这个回购的管理员,但我没有预料到Jenkins Github Pull Request Merger不会检查状态。但我很高兴这将为我完成工作,但从我的观点来看,如果Jenkins首先发布构建状态,然后发布合并,那将更加清晰。更好的是,如果它检查了状态,它可以简单地跳过POST的尝试,并且我不必启用包含管理员保护。就目前而言,我没有看到在拉取请求中清除Jenkins发布的失败状态的方法。因此,我们必须关闭此类失败的拉取请求并创建新请求。
自发布初始答案以来,我发现不能设置/启用来自Jenkins构建的GitHub Branch保护状态检查。如果未启用,则可以关闭失败的pull请求,更正导致其他状态检查或Jenkins构建失败的任何问题,然后通过打开新的pull请求再次启动pull请求过程。