【问题标题】: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。

标签: git jenkins continuous-integration gitlab jenkins-pipeline


【解决方案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_PRIMARYsee 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 的那个。

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2011-07-22
      • 2017-08-06
      相关资源
      最近更新 更多