Как получить имя ветки git, созданное Дженкинсом, при использовании стратегии обратного выбора ветки?

У нас есть одно задание Jenkins, которое создает каждую ветку, кроме master, когда появляются новые коммиты. Это поведение можно настроить с помощью плагина git «выбор стратегии: инверсия», чтобы он прослушивал каждую ветку, кроме указанной ветки.

Это работает очень хорошо. Но проблема в том, что переменная среды GIT_BRANCH всегда ссылается на исключенную ветвь (в нашем случае «origin/master»). Как запросить фактическую ветку, созданную Дженкинсом?

В настоящее время я использую обходной путь, который я получаю из сгенерированного файла changelog.xml. Но иногда случается, что changelog.xml пуст, когда Jenkins переключается между разными ветками, и я не могу найти эту информацию. Как правильно получить/запросить у Дженкинса ветку, которая была фактически построена?


person harish    schedule 20.02.2013    source источник


Ответы (4)


Поскольку git никогда не проверяет ветку, а только делает фиксацию напрямую, вам нужно сделать следующее:

Чтобы получить sha проверенного коммита:

git rev-parse HEAD

Чтобы получить все ветки, которые находятся под фиксацией:

git branch -a --contains SHA

Вывод второй команды может выглядеть так

master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
person Daniel Little    schedule 04.11.2013

Я успешно использовал этот синтаксис:

GIT_BRANCH=`git rev-parse HEAD | git branch -a --contains | grep remotes | sed s/.*remotes.origin.//`
person Piotr Kuczynski    schedule 08.01.2014
comment
Большой! Для всех остальных мне пришлось немного изменить это на: git rev-parse HEAD | git branch -a --contains | grep remotes | sed -e 's/.*remotes.origin.//' для OS X - person Jonathan Crooke; 22.01.2014
comment
Когда мастер проверен в репозитории, с которым я сейчас работаю, это приводит к HEAD -> origin/master\nmaster (\n на самом деле является новой строкой в ​​​​результате), что явно неверно. - person Matt Kantor; 09.04.2014
comment
Обратите внимание, что --contains также будет включать в себя ветки, которые новее текущего проверенного кода. Это сработало лучше для меня: git show-ref | grep $(git rev-parse HEAD) | grep remotes | grep -v HEAD | sed -e 's/.*remotes.origin.//' И, возможно, передать это head -n1, если вы хотите, чтобы оно произвольно выбирало имя первой ветки, если есть несколько ветвей, указывающих на эту фиксацию. - person Alex Varju; 26.08.2014
comment
Где я могу использовать это в Дженкинсе? Кажется, я не могу использовать его как свойство муравья. Где вы настроили это, чтобы использовать его? - person Rein Baarsma; 15.02.2017

Похоже, это ошибка Дженкинса? Вы можете получить в своем скрипте сборки имя проверенной ветки следующим образом:

git symbolic-ref -q --short HEAD

На самом деле у Дженкинса есть рабочая копия в отдельной HEAD, поэтому git branch возвращает «нет ветки». См. этот довольно подробный ответ для изучения согласования между отдельной HEAD и веткой.

person CharlesB    schedule 20.02.2013
comment
Спасибо, Чарльз. Это работает в обычной рабочей области git, но не в рабочей области jenkins, где команда ничего не возвращает. Запуск «ветки git» в рабочей области jenkins дает «* (нет ветки)». Вероятно, выбранная ветка должна быть каким-то образом запрошена у Дженкинса, поскольку кажется, что проверка выполняется на основе идентификатора фиксации в выбранной ветке. - person harish; 22.02.2013
comment
Да, Дженкинс работает в отдельном HEAD. см. мое редактирование и связанный ответ. Я уверен, что одна из команд, связанных с ним, должна работать. - person CharlesB; 22.02.2013
comment
Эта команда работает в CMD, но не в моем Jenkins, почему? C:\Tools\Jenkins\jobs\DevOps\jobs\Test-GitHub\workspace›git --version git version 2.7.0.windows.1 C:\Tools\Jenkins\jobs\DevOps\jobs\Test-GitHub\workspace ›git symbolic-ref -q --short HEAD C:\Tools\Jenkins\jobs\DevOps\jobs\Test-GitHub\workspace›exit 1 Шаг сборки «Выполнить пакетную команду Windows», сборка помечена как ошибка Завершено: ОШИБКА - person Jirong Hu; 03.03.2016

Не могу поверить, как это тяжело. Я делаю это и для Дженкинса. Я упаковал решение Петра Кучинского:

branch=`git rev-parse HEAD | git branch -a --contains | grep remotes | sed s/.*remotes.origin.//`
branch=`echo $branch | awk '{print $NF}'`

Потому что иногда, как указал Мэтт Кантор, решение Петра возвращает много мусора. Но последнее слово в этом барахле всегда оказывается правильным. Обратите внимание, что это решение работает только в том случае, если используемая вами ссылка точно соответствует ветке, которая существует на удаленном компьютере (поэтому локальные ветки не будут работать).

person Eli    schedule 02.12.2015