Jenkins - 管道访问git分支名称

时间:2017-06-29 15:37:06

标签: git jenkins jenkins-pipeline

问题:有没有办法在jenkinsfile中获取由管道检出的分支的名称?

注意:我不在Multibranch Pipeline中!

在我的管道中使用

var counter = new Map();
for (i in array)
    counter.set(array[i], (counter.get(array[i])||0)+1);
var freq = Array.from(counter.values());
var words = Array.from(counter.keys());

其中checkout([$class: 'GitSCM', userRemoteConfigs: [[url:'https://github.com/repo', credentialsId: 'xxxx',name: '1234']]]) 是提交ID。我需要验证此提交ID是否来自用户指定为参数的分支(用户指定分支名称和提交ID,我需要在构建项目之前检查是否没有错误。)

为什么分支名称没有在Pipeline中公开,只在Multibranch Pipeline中公开?对我没有意义。

我不想转换为多分支管道有三个原因:

  1. 我在我的管道中使用了另一个插件Build Blocker Plugin,这在多分支管道中似乎不可用。
  2. 我有一个参数化管道,我在multibranch管道中没有看到该选项。
  3. 很多时候已经进入这个管道,我只是不想再从头开始为这个分支名称功能设置这个项目。
  4. 我打印出所有环境变量,分支名称不在其中。

    感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

如果您正在使用管道代码,我假设您正在执行以下操作:

checkout scm

好的是,这会返回一个包含一些有用内容的地图,您可以通过以下方式从中获取签出的分支:

def scmVars = checkout scm def branchName = scmVars.GIT_BRANCH

答案 1 :(得分:0)

请参阅Git for Computer Scientists

  

refs:引用,或者头或分支,就像在DAG [Directed Acyclic Graph]中的节点上打了便利贴。由于DAG只被添加到现有节点并且不能被突变,所以post-it可以自由移动。它们不会存储在历史记录中,也不会直接在存储库之间传输。它们充当书签,“我在这里工作”。

这样很容易从分支中找到提交:从分支ref通过图形向下走,但是反过来却很棘手,因为提交可以属于多个分支(如果分支再次分支)后来)。例如。来自Pro Git, 3.1 Git Branching - Branches in a Nutshell

enter image description here

左边的三个提交属于分支master testing

答案 2 :(得分:0)

请参阅Pipeline: Nodes and Processes, sh: Shell Script

  

returnStdout(可选)

     

如果选中,则任务的标准输出将作为步骤值返回为String,而不是打印到构建日志。 (标准错误,如果有的话,仍会打印到日志中。)您经常需要在结果上调用.trim()以去除尾随换行符。

并查看git-branch

  

- 包含[< commit>]
          仅列出包含指定提交的分支(如果未指定,则为HEAD)。意为--list

将这些与:

结合起来
...
def branches = sh(returnStdout: true, script: "git branch --contains ${commitId}")
...

并检查branches是否包含用户提供的分支名称。

顺便说一句,我会重命名你的变量:

  • name是您的提交ID,a.k.a。(提交)哈希,所以我称之为commitIdcommitHash
  • 你实际上还有其他一些带有名称的东西,分支,它可以被称为branchName,然后让未来的维护者的生活变得更轻松