【问题标题】:What is the branch name variable for Jenkins multibranch pipelines?Jenkins 多分支管道的分支名称变量是什么?
【发布时间】:2015-12-23 17:24:25
【问题描述】:

我需要知道我的 Jenkins 多分支管道中正在构建哪个分支,以便它正确运行步骤。

我们正在使用带有devreleasemaster 分支的 gitflow 模式,这些分支都用于创建工件。 dev 分支自动部署,其他两个没有。还有featurebugfixhotfix 分支。应该构建这些分支,但不能生成工件。如果他们的代码有问题,它们应该只用于通知开发人员。

在标准构建中,我可以访问 $GIT_BRANCH 变量以了解正在构建哪个分支,但该变量未在我的多分支管道中设置。我也尝试过env.GIT_BRANCH,并尝试将$GIT_BRANCH 作为参数传递给构建。似乎没有任何效果。我假设由于构建知道正在构建的分支(我可以在控制台输出的顶部看到分支名称),所以我可以使用一些东西 - 我只是找不到对它的任何引用。

【问题讨论】:

  • 您能否更新正确答案,因为已经为通过搜索来到这里的人解决了问题?
  • 注意:在声明性管道中,您可能希望使用when 来控制在哪些分支/标签上执行哪些阶段。

标签: jenkins jenkins-plugins jenkins-pipeline


【解决方案1】:

在 Jenkins 多分支管道作业中需要考虑 2 个分支:

  1. Jenkins 工作分支 - env.BRANCH_NAME。这可能与 git 分支同名,但也可能称为 PR-123 或类似名称
  2. git 分支 - env.GIT_BRANCH。这是 git 中的实际分支名称。

因此,作业可能具有 BRANCH_NAME=PR-123 和 GIT_BRANCH=my-scm-branch-name

【讨论】:

  • 我不确定我们的 Jenkins 设置有什么不同,但在我们的例子中,GIT_BRANCH 也是 PR-123。
【解决方案2】:

Jenkins 文档有一个所有环境变量的列表供您阅读here

【讨论】:

    【解决方案3】:

    另一种方法是使用git命令获取当前jenkins管道上的分支名称。例如,您可以添加以下 sn -p 以打印您的 Jenkinsfile 中的分支名称。

    ...
    script {
        def BRANCH = sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
        echo ${BRANCH}
    }
    ...
    

    【讨论】:

    • 欢迎来到 StackOverflow!您能否编辑您的答案以澄清此方法(会带来额外的开销)在哪些方面优于已接受答案中描述的内置、即用型变量?
    • 请注意,这仅在存储库已被克隆并成功签出后才有效。在此之前它不会起作用。
    【解决方案4】:

    目前还没有用于此目的的专用变量 (JENKINS-30252)。同时,您可以利用子项目名称取自分支名称这一事实,并使用

    env.JOB_NAME.replaceFirst('.+/', '')
    

    此问题现已解决,请参阅Krzysztof Krasoń's answer

    【讨论】:

    • 谢谢,这让我找到了正确的方向。这里有更多信息可以帮助我获得所需的信息。 issues.jenkins-ci.org/browse/JENKINS-30252 是针对此确切事物的工作流插件记录的问题。 @jesse-glick 在那里更详细地回答了。总结一下: ${env.JOB_NAME.replaceFirst('.+/', '')} 会给你分支名称。
    • 谢谢,已纳入回答。
    • 此外,使其不贪婪可能对那些在分支名称中添加斜线的人有所帮助。 env.JOB_NAME.replaceFirst('.+?/', '')
    • 您现在可以使用${env.BRANCH_NAME}(因为JENKINS-30252已解决)
    • 或者在足够新的workflow-cps 版本中直接使用$BRANCH_NAME
    【解决方案5】:

    env.BRANCH_NAME 变量包含分支名称。

    截至Pipeline Groovy Plugin 2.18,您也可以只使用BRANCH_NAMEenv 不是必需的,但仍可接受。)

    【讨论】:

    • 在步骤 {} 块顶部的脚本 {} 块中根本无法让它工作。通过使用 echo env.getEnvironment() 打印环境,我发现 ${env.BRANCH} 可用并且有效!
    • 有趣,这些都不适合我。将所有内容都倾倒在 env 下 - 既没有 BRANCH 也没有 BRANCH_NAME。当我尝试引用 BRANCH_NAME 时,我得到“groovy.lang.MissingPropertyException: No such property: BRANCH_NAME for class: groovy.lang.Binding” Pipeline Groovy: 2.32, Jenkins 2.32, BitBucket 4.6.2, BitBucket Server Webhook for Jenkins 3.0。 1
    • 奇怪的是,我发现这适用于某些存储库而不是其他存储库。我在他们的 jenkinsfiles 中设置了两个多分支管道,它们使用同一行:if(env.BRANCH_NAME == "master"),它在一个中按预期工作,在另一个产生RejectedAccessException: unclassified field java.lang.String BRANCH_NAME。很奇怪。
    • @Vroomfundel 如果您正在执行一个不是多分支管道作业的管道作业,那是(显然)预期的条件,由于JENKINS-47226 - 分支名称在单个管道构建中不可用。
    【解决方案6】:

    我发现这个 stackoverflow 帖子示例很有用:Git Variables in Jenkins Workflow plugin

    sh '//...
        git rev-parse --abbrev-ref HEAD > GIT_BRANCH'
        git_branch = readFile('GIT_BRANCH').trim()
        echo git_branch
        //...
       '
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多