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'