检查拉取请求是否与目标分支一致

时间:2016-09-08 16:07:34

标签: git github jenkins merge github-api

我们的项目使用受保护的分支,并且要求PR的基本分支与目标分支保持最新才能合并。我们也使用Jenkins来构建PR的未合并头,因为我们使用的插件会在目标分支发生变化时自动重建所有打开的PR,这会很快堵塞管道。因此,如果打开PR而不与目标分支保持同步,我们希望能够立即停止Jenkins管道,并通知提交者他们需要先合并。

因此,使用GitHub API,我希望能够判断拉取请求是否与目标分支是最新的。对此最接近的似乎是"可合并"拉取请求的属性,但看起来它只表示是否可以进行安全的自动合并,而不是分支是否已经是最新的。

是否有可以查看的直接API json标记?如果没有,是否有一种简单的方法可以使用git命令手动检查?

4 个答案:

答案 0 :(得分:6)

我不知道GitHub是否通过其API公开此信息,但您可以使用Git命令手动检测此信息。您希望找到所谓的合并库,并确保此提交与master的提示(或您的主分支)相同。

脚本的形式,它看起来像这样:

if [ $(git merge-base @ master) == $(git rev-parse master) ]
then
  echo "Your branch is up to date."
  exit 0
else
  echo "You need to merge / rebase."
  exit 1
fi

如果将此脚本包含为构建步骤,则退出值应导致Jenkins在必要时使作业失败。

答案 1 :(得分:1)

有一种现代的方法

git merge-base --is-ancestor A B

请参阅git-merge-base

答案 2 :(得分:1)

如果你想使用github API。 任何返回拉取请求对象的 API 都将包含 dplyr 字段。 如果其值为 mtcars %>% summarise(across(c(mpg, cyl), list(mean = mean, sd = sd, median = median))) # mpg_mean mpg_sd mpg_median cyl_mean cyl_sd cyl_median #1 20.09062 6.026948 19.2 6.1875 1.785922 6 ,则表示在创建拉取请求后更新基本分支。即:拉取请求分支已过期。

这是mergestatestatus的解释

如果您在 Jenkings 服务器中处理 webhook 响应,大多数拉取请求事件(如拉取请求创建、编辑、关闭或 issue_comment 事件)将在拉取请求对象中包含 mergeable_state 信息。

答案 3 :(得分:0)

对于想要实现将合并序列化的工作流的人们来说,这是一个非常普遍的问题。

使用Mergify可以轻松解决此问题。它通过strict workflow提供了您所需的一切。 Mergify负责更新您过时的请求请求,并为您订购有效请求请求的合并。实际上,我们构建Mergify就是为了完全解决此问题!

(免责声明:我是Mergify的作者之一)