如何确定一个分支是不是是 jenkins 文件中的默认分支?

Posted

技术标签:

【中文标题】如何确定一个分支是不是是 jenkins 文件中的默认分支?【英文标题】:How do I determine whether a branch is the default branch in a jenkins file?如何确定一个分支是否是 jenkins 文件中的默认分支? 【发布时间】:2020-05-26 14:52:25 【问题描述】:

我们在 jenkins 上有一个多分支管道。

我知道可以检查分支是否与名称匹配,例如

when 
    branch "master"

很遗憾,我们的默认分支没有命名为 master,默认分支的名称会定期更改。

有没有办法在不检查名称的情况下检查给定分支是否为默认分支?

when 
    branch is default

还是这样的?

提前致谢!

【问题讨论】:

我认为没有这个名字就行不通。 git 中没有真正的“默认”分支,因此 Jenkins 只能按分支名称或其他表达式(如正则表达式)分隔。 @mkemmerz 好的,这是有道理的。谢谢! 'Default' 分支是 GitHub 的一个特性,但不是 git afaik。 【参考方案1】:

自 Branch API 插件 2.6.4 版(5 月发布)以来,Jenkins 多分支管道现在可以访问 a BRANCH_IS_PRIMARY environment variable:

对于多分支项目,如果 SCM 源报告正在构建的分支是主分支,则将其设置为 "true";否则未设置。

这意味着您现在可以这样做:

when 
    expression  env.BRANCH_IS_PRIMARY 

请注意,您必须将其作为env 的属性访问,或者使用字符串插值(即“$BRANCH_IS_PRIMARY”),因为可能未设置BRANCH_IS_PRIMARY(see discussion)。

【讨论】:

【参考方案2】:
git ls-remote -q --symref | head -1

这是一个解决方法,因为 Gitlab & co 使用 Remote HEAD 来标记“默认分支” 我们可以通过“git ls-remote -q --symref”获取远程引用。

远程头将是第一行,因此我们可以选择带有管头-1的第一行。 这给了我们“默认分支”的哈希。

【讨论】:

@matus 的带有 REST api 的解决方案比我这里的解决方案要好得多,如果您可以访问它的话。不幸的是,在我的环境中,出于安全原因,访问 rest api 被阻止。【参考方案3】:

您可以使用 SCR 的 API 来获取默认分支。根据您使用的 SCR,对 API 的调用会有所不同。

在 GitLab 中,您可以查询 Project REST API 并在响应中找到包含此信息的 default_branch 字段

GET /projects/:id

在 GitHub 中,您可以查询 Repositories REST API 并在响应中找到包含此信息的 default_branch 字段。

GET /repos/:owner/:repo

请注意 GitHub 响应,因为它包含名为 default_branch 的 3 个字段,一个用于实际存储库,一个用于父存储库,最后一个用于源存储库。您正在寻找 json 根目录中的那个,它是您正在查询的 repo 的那个。

【讨论】:

以上是关于如何确定一个分支是不是是 jenkins 文件中的默认分支?的主要内容,如果未能解决你的问题,请参考以下文章

防止共享Jenkinsfile中的默认签出

如何让通用 Webhook 触发器插件与 Jenkins 中的多分支管道一起使用?

如何限制Jenkins并发多分支管道构建?

应该如何设置 Jenkins 中的 Ivy 构建项目?

在 Jenkins 中使用多分支管道“定期构建”

选择要在 Jenkins 中构建的分支