在Jenkins Pipeline/Jenkinsfile中获取git分支名称

Ale*_*ski 39 git branch jenkins jenkins-pipeline

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

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

我尝试过的所有东西都回声无效

sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
Run Code Online (Sandbox Code Playgroud)

这总是如此master.

Jam*_*mes 37

使用multibranch管道..而不是管道

在我的脚本..

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

    }
}
Run Code Online (Sandbox Code Playgroud)

产量...

Pulling...master
Run Code Online (Sandbox Code Playgroud)

  • 将作业命名为分支完全是多分支管道的想法。 (4认同)
  • 这实际上只是作业的名称,而不是git分支的名称。只要您的工作与分支机构具有相同的名称,此方法就起作用。 (2认同)
  • 所有这些变量都在 Git 插件页面的环境变量下定义:https://plugins.jenkins.io/git (2认同)

Von*_*onC 16

如果您有管道的jenkins文件,请检查您是否在执行时看到环境变量中的分支名称.

你可以打印出来:

pipeline {
    agent any

    environment {
        DISABLE_AUTH = 'true'
        DB_ENGINE    = 'sqlite'
    }

    stages {
        stage('Build') {
            steps {
                sh 'printenv'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这很有帮助.看起来它不在我的环境变量中.是否有可能暴露导致构建的分支? (3认同)
  • 期望 repo 中的文件(Jenkinsfile)提供硬编码的分支名称是荒谬的。这使得回购本身成为管理的灾难。这需要修复... (3认同)

ale*_*lex 12

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

echo 'Pulling... ' + env.GIT_BRANCH
Run Code Online (Sandbox Code Playgroud)

输出:

Pulling... origin/myBranch
Run Code Online (Sandbox Code Playgroud)

其中 myBranch 是功能分支的名称

  • 这不起作用,结果是拉空。仅当您指定的不仅仅是版本号时,此答案才可用,例如,您是否使用任何可以为您带来魔力的插件? (2认同)

小智 11

对于管道:

pipeline {
  environment {
     BRANCH_NAME = "${GIT_BRANCH.split("/")[1]}"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经调整了您的答案,使其适用于简单管道以及多分支管道,其中不需要使用以下条件拆分`GIT_BRANCH`:`BRANCH_NAME = "${GIT_BRANCH.split("/").size() > 1 ? GIT_BRANCH.split("/")[1] : GIT_BRANCH}"` (4认同)
  • 为了进一步改进@Romain的评论: `BRANCH_NAME = "${GIT_BRANCH.split('/').size() > 1 ? GIT_BRANCH.split('/')[1..-1].join('/') : GIT_BRANCH}"` (2认同)

Att*_*123 9

一位同事告诉我使用scm.branches[0].name它并且有效.我把它包装到Jenkinsfile中的一个函数中:

def getGitBranchName() {
    return scm.branches[0].name
}
Run Code Online (Sandbox Code Playgroud)

  • 尝试过并得到.. ...org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用方法 BRANCH_NAME 不起作用,并且 env.BRANCH_NAME 返回 null... (3认同)
  • 如果将共享库设置为全局,则不会出现安全问题.另一种方法是在"管理Jenkins>进程脚本批准"中允许这些安全性异常 (3认同)
  • 优胜者。效果很好!没有 shell 执行。最初不需要检查任何东西。适用于不同的节点上下文。适用于一个简单的项目。好东西。 (2认同)
  • 这对我有用。如何找出`scm`对象的属性?有这个对象的任何文档吗?谢谢。 (2认同)

Ale*_*ski 5

切换到多分支管道允许我访问分支名称.没有建议定期管道.


0ne*_*eel 5

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

scm.branches.first().getExpandedName(env.getEnvironment())
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

这是用于简单的管道类型 - 不是多分支。使用詹金斯 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


小智 5

要在 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
Run Code Online (Sandbox Code Playgroud)