如何确定一个分支是不是是 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 文件中的默认分支?的主要内容,如果未能解决你的问题,请参考以下文章