Jenkinsfile: git rev-parse --abbrev-ref HEAD возвращает HEAD

Я новичок в Дженкинс/Девопс; Я следую этому примеру. Когда я локально делаю (из терминала):

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 Я не использую мульти-разветвленный конвейер, и требования были не использовать мульти-ветвление.

Ответ 1

Я, вероятно, опаздываю с ответом, но есть потенциально более простой способ. Убедитесь, что вы выбрали "Извлечь в определенную локальную ветку" в разделе "Дополнительные действия в конфигурации Git". Это гарантирует, что git проверяет ту ветвь, которую вы отслеживаете, и ваша оригинальная команда "git rev-parse --abbrev-ref HEAD" будет работать нормально. enter image description here

Ответ 2

Если вы используете многоканальный конвейер, имя ветки должно быть доступно в переменных среды как env. BRANCH_NAME. вы можете использовать sh 'printenv' внутри вашего шага для печати всех доступных переменных среды

Ответ 3

Решение, которое я нашел для этой ситуации:

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

Ключом здесь является [$class: 'LocalBranch', localBranch: "**"]. Это позволяет оформить ветку, а не ревизию.

Источник для этого взят отсюда.

Ответ 4

Проблема:

Как Торек упоминалось выше, если вы проверили коммита (против ветки) вы находитесь в " отдельностоящий ГОЛОВЫ " состояние (HEAD detached at 123abc).

Зачем?

--abbrev-ref возвращает недвусмысленное короткое имя имени объекта. Текущий объект - это зафиксированный вами коммит, а не ветвь. Кроме того, git не сможет определить, какую ветку вы хотите получить, так как извлеченный вами коммит может легко находиться в нескольких ветвях.

Решение:

Я бы использовал предложение Виджая Рамасвами, однако вы также можете жестко закодировать название ветки в вашем скрипте:

env.GIT_BRANCH_NAME='my-branch-name'

или проще

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