Jenkinsfile:git rev-parse --abbrev-ref HEAD返回HEAD

cha*_*had 17 git jenkins jenkins-pipeline

我是jenkins/devops的新手; 我正在关注这个例子.当我在当地做(从终端):

git rev-parse --abbrev-ref HEAD
Run Code Online (Sandbox Code Playgroud)

我得到了当前分支的名称.但是从Jenkinsfile中,我得到的日志中:

HEAD
Run Code Online (Sandbox Code Playgroud)

在线研究了一段时间,到目前为止找不到原因.这种结果的潜在原因是什么?

额外细节

在我的jenkins文件中,我试图获取当前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'
      }
....
}
Run Code Online (Sandbox Code Playgroud)

在线

sh 'echo BRANCH_NAME ${GIT_BRANCH_NAME}'
Run Code Online (Sandbox Code Playgroud)

给了HEAD

我找到了一种解决方法,使用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]
}
Run Code Online (Sandbox Code Playgroud)

现在我得到了正确的分支名称和步骤,但我宁愿采用不那么苛刻的方式做事.

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

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

小智 12

我可能迟到了,但可能有一种更简单的方法.确保在Git配置中的其他行为下选择"签出到特定的本地分支".这将确保git检出您正在跟踪的确切分支,并且您的原始命令"git rev-parse --abbrev-ref HEAD"将正常工作.在此输入图像描述

  • 我认为该选项现在称为“签出以匹配本地分支”。 (3认同)

bki*_*idd 7

问题:

正如torek提到的,如果您签出了提交(相对于分支),您就处于“分离的 HEAD ”状态(HEAD detached at 123abc)

为什么?

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

解决方案:

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

env.GIT_BRANCH_NAME='my-branch-name'

或者更简单地说

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


Ole*_*nko 5

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

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

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

它的来源取自这里


Kvk*_*Kvk 1

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