【问题标题】:Jenkinsfile: git rev-parse --abbrev-ref HEAD returns HEADJenkinsfile: git rev-parse --abbrev-ref HEAD 返回 HEAD
【发布时间】:2018-04-16 08:05:52
【问题描述】:

我是 jenkins/devops 的新手;我关注this example。当我在本地做(从终端):

git rev-parse --abbrev-ref HEAD

我得到了当前分支的名字。但是在 Jenkinsfile 中,在我得到的日志中:

HEAD

上网查了好久,一直没找到原因。这种结果的潜在原因是什么?

其他详情

在我的 jenkinsfile 中,我试图获取当前 git 分支的名称(触发 webhook 的那个),然后将其通过管道传递到 'git branch' 命令中,因此代码如下:

pipeline {
agent {
    label 'ubuntu'
}
stages {
    stage('check') {
    steps {
            script {
               env.GIT_BRANCH_NAME=sh(returnStdout: true, script: "git rev-parse --abbrev-ref HEAD").trim()
            }

            sh 'echo BRANCH_NAME ${GIT_BRANCH_NAME}'
            git branch: GIT_BRANCH_NAME, credentialsId: '******', url: 'https://*****/*****/*****.git'
      }
....
}

排队

sh 'echo BRANCH_NAME ${GIT_BRANCH_NAME}'

返回

我使用 git name-rev --name-only HEAD 找到了解决方法,并将脚本代码修改为:

script {
    env.GIT_BRANCH_PATH=sh(returnStdout: true, script: "git name-rev --name-only HEAD").trim()
    env.GIT_BRANCH_NAME=GIT_BRANCH_PATH.split('remotes/origin/')[1]
}

现在我得到了正确的分支名称和步骤,但我宁愿有一种不那么老套的做事方式。

使用最佳实践实现我想要实现的目标的最佳方法是什么?

PS我没有使用多分支管道,并且要求不使用多分支。

【问题讨论】:

  • 在 Git 端,通过检查不是分支名称(例如,标签名称、远程跟踪名称或原始哈希 ID)的内容,您会获得“分离的 HEAD” )。一旦你有了它,git rev-parse --abbrev-ref HEAD 将返回HEAD。对我来说,那组特定的 Jenkins 流水线指令看起来相当可疑/错误,但我不是 Jenkins 专家。
  • 请输入其余说明,您似乎检查了错误的来源或以错误的方式检查,因为 Torek 说您处于“分离的 HEAD”中,这将有助于了解什么您正在尝试结帐以及实际要结帐的内容..
  • @torek 请检查我在问题中添加的更新。感谢您的帮助!
  • @ivoruJavaBoy 请检查我在问题中添加的更新。感谢您的帮助!
  • 正如 torek 提到的,您处于分离的 HEAD 状态并使用 Vijay Ramaswamy 提到的解决方案工作。有时我们只是想太多而忘记了基础

标签: git jenkins jenkins-pipeline


【解决方案1】:

我可能回复晚了,但可能有更简单的方法。确保在 Git 配置中的其他行为下选择“签出到特定本地分支”。这将确保 git 签出到您正在跟踪的确切分支,并且您的原始命令“git rev-parse --abbrev-ref HEAD”可以正常工作。

【讨论】:

  • 我认为该选项现在称为“Check out to matching local branch
  • 这成功了!如上面评论中所述,我将本地分支(同名)添加到 jenkins 项目配置中。可能这与此处解释的行为有关:stackoverflow.com/a/45405121/1313116
【解决方案2】:

我为这种情况找到的解决方案是:

checkout([$class: 'GitSCM', branches: [[name: '*/' + branch]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: "**"]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'cred', url: 'git@bitbucket.org:repofolder/repo.git']]])

这里的关键是[$class: 'LocalBranch', localBranch: "**"]。它允许签出一个分支而不是一个修订版。

来源取自here

【讨论】:

    【解决方案3】:

    问题:

    正如torek 所提到的,如果您检查了一个提交(相对于一个分支),那么您就处于“detached HEAD”状态(HEAD detached at 123abc)

    为什么?

    --abbrev-ref 返回对象名称的明确短名称。 当前对象是您签出的提交,而不是分支。此外,git 无论如何都无法确定您想要哪个分支,因为您签出的提交可能很容易存在于多个分支中。

    解决方案:

    我会使用Vijay Ramaswamysuggestion,但是,您也可以在脚本中硬编码分支名称:

    env.GIT_BRANCH_NAME='my-branch-name'

    或者更简单

    git branch: 'my-branch-name', credentialsId: '******', url: 'https://*****/*****/*****.git'

    【讨论】:

      【解决方案4】:

      如果您使用的是多分支管道,分支名称应在环境变量中以env. BRANCH_NAME 的形式提供。您可以在步骤中使用sh 'printenv' 来打印所有可用的环境变量

      【讨论】:

      • 感谢 Kvk,我已经提到我没有使用多分支
      猜你喜欢
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2020-01-16
      • 2016-12-27
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      相关资源
      最近更新 更多