【问题标题】:Get git branch name in Jenkins Pipeline/Jenkinsfile在 Jenkins Pipeline/Jenkinsfile 中获取 git 分支名称
【发布时间】:2017-07-12 00:25:00
【问题描述】:

我创建了一个 jenkins 管道,它正在从 scm 中提取管道脚本。
我将分支说明符设置为“all”,因此它建立在对任何分支的任何更改之上。

如何从 Jenkinsfile 访问导致此构建的分支名称?

我尝试过的所有内容都显示为 null,除了

sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()

总是master

【问题讨论】:

    标签: git jenkins branch jenkins-pipeline


    【解决方案1】:

    使用多分支管道作业类型,而不是普通的管道作业类型。多分支管道作业确实具有描述分支的环境变量env.BRANCH_NAME

    在我的脚本中..

    stage('Build') {
        node {
            echo 'Pulling...' + env.BRANCH_NAME
            checkout scm
            
        }
    }
    

    产量...

    Pulling...master
    

    【讨论】:

    • 这实际上只是作业的名称,而不是 git 分支的名称。只要您的工作与您的分支机构同名,这将有效。
    • 所有这些变量都在 Git 插件页面的环境变量下定义:plugins.jenkins.io/git
    • 只要遵守上面提到的^^,它就可以完美运行。
    【解决方案2】:

    如果您的管道有 jenkinsfile,请检查您在执行时是否在 environment variables 中看到您的分支名称。

    您可以使用以下方式打印它们:

    pipeline {
        agent any
    
        environment {
            DISABLE_AUTH = 'true'
            DB_ENGINE    = 'sqlite'
        }
    
        stages {
            stage('Build') {
                steps {
                    sh 'printenv'
                }
            }
        }
    }
    

    但是,PR 91 表明分支名称仅在某些管道配置中设置:

    【讨论】:

    • 谢谢,这很有帮助。看起来它不在我的环境变量中。是否可以公开导致构建的分支?
    • repo 中的文件(Jenkinsfile)被期望提供硬编码的分支名称,这太荒谬了。这使得回购本身成为管理的灾难。这需要修复...
    【解决方案3】:

    一位同事告诉我使用scm.branches[0].name,它奏效了。我将它包装到我的 Jenkinsfile 中的一个函数中:

    def getGitBranchName() {
        return scm.branches[0].name
    }
    

    【讨论】:

    • 试过了,得到了.. ...org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: 不允许使用方法 BRANCH_NAME 的脚本不起作用并且 env.BRANCH_NAME 返回 null...跨度>
    • 如果您将共享库设置为全局,您将不会遇到安全问题。另一种方法是在Manage Jenkins > In Process Script Approval 上允许这些安全异常
    • 您也可以将该方法列入白名单
    • 获胜者。效果很好!没有外壳执行。最初不需要结帐任何东西。适用于不同的节点上下文。适用于普通项目。好东西。
    • 这对我有用。如何找出scm 对象的属性?这个对象有任何文档吗?谢谢。
    【解决方案4】:

    对于管道:

    pipeline {
      environment {
         BRANCH_NAME = "${GIT_BRANCH.split("/")[1]}"
      }
    }
    

    【讨论】:

    • 我已经调整了您的答案,使其适用于简单的管道以及不需要在这种情况下拆分 GIT_BRANCH 的多分支管道:BRANCH_NAME = "${GIT_BRANCH.split("/").size() > 1 ? GIT_BRANCH.split("/")[1] : GIT_BRANCH}"
    • 进一步改进@Romain 的评论:BRANCH_NAME = "${GIT_BRANCH.split('/').size() > 1 ? GIT_BRANCH.split('/')[1..-1].join('/') : GIT_BRANCH}"
    【解决方案5】:

    对我来说这很有效:(使用 Jenkins 2.150,使用简单的管道类型 - 不是多分支,我的分支说明符:'**')

    echo 'Pulling... ' + env.GIT_BRANCH
    

    输出:

    Pulling... origin/myBranch
    

    其中 myBranch 是功能分支的名称

    【讨论】:

    • 这个不行,结果拉null。仅当您指定的不仅仅是版本号时,此答案才可用,例如,您是否使用任何为您带来魔力的插件?
    • @chrillelundmark 我在重试后编辑了我的答案......我没有安装插件来帮助我实现这个目的,否则我不知道我还应该指定什么......我猜那里一条评论中没有足够的字符来写下我所有的插件
    • 当我的 jenkins 作业从 PR 触发时,我将 PR-45= 作为 env.GIT_BRANCH 的值。不是我所期望的
    • 在 Windows 上使用 Jenkins 2.303.1 为我返回 null,简单的管道。
    【解决方案6】:

    这适用于简单的管道类型 - 不是多分支。使用 Jenkins 2.150.1

    environment { FULL_PATH_BRANCH = "${sh(script:'git name-rev --name-only HEAD', returnStdout: true)}" GIT_BRANCH = FULL_PATH_BRANCH.substring(FULL_PATH_BRANCH.lastIndexOf('/') + 1, FULL_PATH_BRANCH.length()) }

    那就用env.GIT_BRANCH

    【讨论】:

    • 这对我在 macOS 从属设备上非常有用,但是在 Windows 从属设备上我总是在执行 environment { FULL_PATH_BRANCH_WIN = "${bat(script:'@git name-rev --仅名称 HEAD', returnStdout: true)}" GIT_BRANCH_WIN = FULL_PATH_BRANCH_WIN.substring(FULL_PATH_BRANCH_WIN.lastIndexOf('/') + 1, FULL_PATH_BRANCH_WIN.length()) }
    • org.codehaus.groovy.control.MultipleCompilationErrorsException:启动失败:WorkflowScript:234:意外令牌:名称@第 234 行,第 42 列。TH_BRANCH = “${sh(script:'git name-rev - 对我没用
    • FULL_PATH_BRANCH 在 Windows 上使用 Jenkins 2.303.1 为我返回 null,简单的管道。
    【解决方案7】:

    切换到多分支管道允许我访问分支名称。不建议使用常规管道。

    【讨论】:

    【解决方案8】:

    要在 Jenkins 中获取 git 分支名称, 如果它是一个多分支管道,那么我们可以轻松地使用 env.GIT_BRANCH。 但如果是普通管道,我们可以使用 SCM 插件对象来检索分支名称。

    以下代码适用于普通管道和多分支管道。

    def branch_nem = scm.branches[0].name
    if (branch_nem.contains("*/")) {
        branch_nem = branch_nem.split("\\*/")[1]
        }
    echo branch_nem
    

    【讨论】:

      【解决方案9】:

      如果您使用构建参数作为分支说明符,则仅从 scm.branches 获取名称是不够的,例如${BRANCH}。 您需要将该字符串扩展为真实姓名:

      scm.branches.first().getExpandedName(env.getEnvironment())
      

      注意getEnvironment() 必须是显式的getter,否则env 将查找名为environment 的环境变量。

      不要忘记您需要批准这些方法才能从沙盒中访问它们。

      【讨论】:

        【解决方案10】:

        FWIW 在 PR 构建中唯一对我有用的是 ${CHANGE_BRANCH}

        (可能不适用于master,还没有看到)

        【讨论】:

          【解决方案11】:

          这对我来说适用于非多分支管道,将 SCM Branch Specifier (blank for 'any') 设置为 */branch_name 或将其设置为 branch_name

          BRANCH_NAME = "${GIT_BRANCH.split('/').size() > 1 ? GIT_BRANCH.split('/')[1..-1].join('/') : GIT_BRANCH}"
          

          【讨论】:

            【解决方案12】:

            我可能想使用env.CHANGE_BRANCH 来获取真正的分支名称,而不是 jenkins 工作/PR 名称。

            【讨论】:

              猜你喜欢
              • 2021-10-29
              • 1970-01-01
              • 2017-11-23
              • 1970-01-01
              • 2014-02-12
              • 1970-01-01
              • 2016-10-07
              • 1970-01-01
              • 2011-09-08
              相关资源
              最近更新 更多