Jenkins - 管道访问git分支名称

4

问题:在jenkinsfile中,有没有办法获取Pipeline所检出的分支名称?

注意:我不在多分支管道中!

在我的流水线中,我正在使用

checkout([$class: 'GitSCM', 
          userRemoteConfigs: [[url:'https://github.com/repo', 
                               credentialsId: 'xxxx',name: '1234']]])

其中name是提交ID。我需要验证这个提交ID是否来自用户指定的分支(用户指定分支名称和提交ID,我需要在构建项目之前检查是否有错误)。

为什么分支名称只在Multibranch Pipeline中可用,而不在Pipeline中公开呢?对我来说没有意义。

以下是我不想转换为多分支管道的三个原因:

  1. 我正在使用另一个插件Build Blocker Plugin,它似乎不可用于多分支管道。
  2. 我有一个参数化pipeline,在多分支管道中我没有看到该选项。
  3. 已经花了很多时间在这个pipeline上,我不想为了这个分支名称特性重新设置此项目。

我已经打印出所有环境变量,分支名称不在其中。

感谢您的帮助!


你从哪里获取commitid的?如果是钩子,你不能将分支名称作为参数添加吗? - JamesD
用户指定要构建的提交。类似于 parameters { string(defaultValue: 'develop', description:'', name: '123456')}。如果将参数传递到构建流水线,则检出提交 123456,默认情况下为 develop。 - tenticon
3个回答

11

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

checkout scm

好处是这将返回一个地图,其中包含一些有用的信息,可以按以下方式获取已检出的分支:

def scmVars = checkout scm def branchName = scmVars.GIT_BRANCH


你真是个英雄!<3 实际上,当使用管道时,几乎所有其他东西都无法正常工作!救了我的一天! - bastianwegge

0

关于:

为什么分支名称没有暴露出来呢?[...]

请参考计算机科学家的Git

refs:引用,或者头部或分支,就像贴在DAG(有向无环图)中节点上的便笺。虽然DAG只能添加和现有节点不能被改变,但是便笺可以自由移动。它们不会存储在历史记录中,也不会直接在仓库之间传输。它们充当一种书签,“我正在这里工作”。

从分支中找到提交很容易:通过沿着图形从分支引用向下走,但反过来就有些棘手了,因为一个提交可能属于多个分支(如果该分支稍后再次分支)。例如,在Pro Git,3.1 Git Branching - Branches in a Nutshell中,左侧的三个提交属于mastertesting分支:

enter image description here



这怎么帮助我在Jenkins Pipeline中找到分支的名称?如果我不理解显而易见的内容,请原谅。 - tenticon
@tenticon 同意,这对你在这种情况下没有帮助。这是一个带有背景信息的回答,回答了你的问题“为什么分支名称没有暴露出来?”如果这不明显,很抱歉。 - Gerold Broser

0

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

returnStdout(可选)

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

并参考git-branch

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

结合使用:

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

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

顺便说一下,我会重命名你的变量,因为:

  • name 是你的提交 ID,也就是(提交)哈希值,所以我会将其称为 commitIdcommitHash
  • 实际上你还有另一个名称为 branch 的东西,可以将其称为 branchName,这样未来的维护者们的生活会更轻松。

有一件事我从来没有理解过 Jenkins 中的 checkout 命令。你可以在 userRemoteConfigs 中使用键 name,并将 <commitId> 或 <branchName> 作为值之一,或者你可以使用键 branches 来指定 <branchName>。你是在建议定义变量 commitIdbranchName,然后将它们作为值传递给 userRemoteConfig 吗?我无法将键 name 更改为其他内容。 - tenticon
根据“_checkout, $class: GitSCM userRemoteConfigs - name - [是]存储库的ID_”,而不是哈希或分支名称,以及“_branches - 嵌套对象 - name - 如果您想要跟踪存储库中的特定分支,请指定分支_”。 - Gerold Broser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接