Подтвердить что ты не робот

Как получить локальное название ветки Git с плагином Jenkins Git?

Я использую опцию Branch Specifier для Jenkins Git плагин (v2.0) для запуска сборки на определенной ветки, например. 1.4.

${GIT_BRANCH} в этом случае содержит значение origin/1.4.

Как я могу получить имя локального ветки Git, используемого для клонирования (т.е. только 1.4 без префикса origin/?

Я пробовал Check out to specific local branch Дополнительное поведение с именем ветки 1.4, но ничего не изменилось.

Я видел связанный PR на GitHub, но он был отклонен (поскольку он исправляет только один случай с помощью только origin remote).

4b9b3361

Ответ 1

Вы можете легко удалить префикс из переменной: ${GIT_BRANCH##origin/}

Хотя это не очень общее решение, оно довольно простое, и я не видел репозиторий, клонированный Jenkins, который использовал бы что-то еще, чем origin для удаленного имени.

Обновить. На самом деле ${GIT_BRANCH#*/} будет работать для любого источника и даже для ветвей, содержащих косые черты. # выполняет нежелательное сопоставление glob, ## разрешает жадное сопоставление. Подробнее см. Bash Справочное руководство.

Ответ 2

По состоянию на март 2016 года (Git Плагин v2.4.3) теперь поддерживается в корне. Просто поставьте ** в качестве значения для Check out to specific local branch в плагине Git вместо любой макро/переменной.

Описание поля описывает новое поведение:

Если выбрано, а его значение - пустая строка или "**", имя ветки вычисляется из удаленной ветки без начала координат. В этом случае источник удаленной ветки/мастер будет проверен в локальном ветки с именем master, а удаленная ветвь origin/develop/new-feature будет проверена в локальной ветки с именем develop/newfeature.

Это было введено @roostergx и @NickVolynkin, упомянутым, когда оно было выпущено. Я просто документирую здесь, чтобы надеяться помочь людям в будущем.

Ответ 3

Мне удалось сделать это с помощью нескольких шагов:

  • Добавьте Execute shell предварительный шаг с этими:

    git_branch_local=$(echo $GIT_BRANCH | sed -e "s|origin/||g") echo GIT_BRANCH_LOCAL=$git_branch_local > build.properties

  • Добавьте предварительный шаг Inject environment variables для build.properties файла

тогда вы должны иметь переменную окружения GIT_BRANCH_LOCAL, которая не имеет origin/

Ответ 4

Если вы проверите его как локальную ветвь, а затем используйте ${GIT_LOCAL_BRANCH}, он дает имя локальной ветки (т.е. 'develop' вместо 'origin/develop'. (Git Версия плагина 3.0.0)

Ответ 5

Я отправил сообщение группе jenkins-ci (https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/jenkinsci-dev/xuweZbwn9zE/BAWfs-ZeFAAJ), предлагая усовершенствование плагина Git "Check Out to Local Branch". По умолчанию плагин Git проверяет отсоединенную головку. Локальный филиал позволяет указать конкретное имя ветки. При настройке, используя этот метод, имя локальной ветки точно соответствует указанному.

Если вы используете Jenkins для выпуска maven, обязательно, чтобы имя локальной ветки было таким же, как имя удаленной ветки. См. Сообщение в группах google для получения дополнительных сведений об этом.

Чтобы устранить это требование, я создал запрос на перенос (https://github.com/jenkinsci/git-plugin/pull/381) с кодом и тестовыми примерами.

Также была создана проблема JIRA (https://issues.jenkins-ci.org/browse/JENKINS-33202), чтобы документировать проблему.

Если кто-то нуждается в этой функции, я рекомендую вам опубликовать групповое обсуждение и проголосовать за JENKINS-33202.

Ответ 6

Хотя это верно, как говорит dtabuenc в комментарии к ответу Jan Včelák, этот синтаксис оболочки не будет работать с макросами токенов напрямую, если вы пытаетесь получить имя ветки на шаге сборки Execute Shell (или аналогичный), вы все равно можете использовать ту же идею.

TEMP_GIT_BRANCH=${GIT_BRANCH}
MY_GIT_BRANCH="${TEMP_GIT_BRANCH#*/}"

работает нормально (и что требуется действительный POSIX, no bash).

Ответ 7

В конвейере вы можете сделать это так:

// get arround a git scm anoying feature
stage ('Bootstrap') {
    sh "echo GIT_BRANCH_LOCAL=\\\"$GIT_BRANCH\\\" | sed -e 's|origin/||g' | tee version.properties"
}

stage('Checkout') {
    load('version.properties')
    checkout([$class: 'GitSCM', branches: [[name: '**']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: "${GIT_BRANCH_LOCAL}"]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/webofmars/grails-website.git']]])
}

Ответ 8

Я столкнулся с проблемой сегодня. Причина в том, что плагин Jenkins git добавит "origin/" к любому имени ветки, которое вы указали в параметре сборки GIT_BRANCH. Смотрите https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin.

Плагин git устанавливает несколько переменных среды, которые вы можете использовать в своих скриптах: GIT_BRANCH - Имя используемой в данный момент ветки, например, "master" или "origin/foo".

В результате, когда вы строите с параметром GIT_BRANCH = foo, Дженкинс просто добавит "origin/" перед ним. Затем, когда вы делаете

git check out ${GIT_BRANCH}

вы на самом деле делаете

git check out origin/foo

Чтобы избежать этого, вы можете использовать что-то еще в параметре сборки, например GIT_BRANCH_NAME или что-то еще, только не используйте GIT_BRANCH. В конфигурации удалите параметр GIT_BRANCH и добавьте еще один с именем GIT_BRANCH_NAME. Затем в поле "Построить с параметром" в разделе GIT_BRANCH_NAME укажите свою ветвь.

Ответ 9

Я столкнулся с этой проблемой и до сегодняшнего дня. Похоже, что когда я изменяю значение Check out to specific local branch, мне нужно удалить локальное репо на сервере сборки, прежде чем запускать новую сборку.

Ответ 10

Основываясь на этом SO-ответе: Как мне получить выходные данные команды оболочки, выполненной с использованием переменной в Jenkinsfile (groovy)?

Я использовал это и, наконец, смог заставить его работать (в приведенном ниже примере предполагается переменная ветки $Branch):

stage('Checkout') {
    GIT_BRANCH_LOCAL = sh (
        script: "echo $Branch | sed -e 's|origin/||g'",
        returnStdout: true
    ).trim()
    echo "Git branch: ${GIT_BRANCH_LOCAL}"
    git branch: "${GIT_BRANCH_LOCAL}", credentialsId: '...', url: '[email protected]:......git'
}

Ответ 11

Спустя долгое время я наконец-то нашел решение для своего случая, чтобы получить локальное имя git (для SonarQube) без "origin/" в моем фристайл-проекте Jenkins (не Jenkinsfile). Я использую среду Windows.

В Дженкинс:

  • В разделе "Управление исходным кодом" добавьте "Выписка в конкретный локальный филиал", а в поле "Название ветки" введите: **
  • В разделе "Сборка": я использовал и добавил "SonarScanner for MSBuild - Начать анализ", где в "Дополнительные аргументы" я добавил: /d:sonar.branch.name=${GIT_LOCAL_BRANCH}

Так что только с этой комбинацией ** и ${GIT_LOCAL_BRANCH} это сработало для меня.

Ответ 12

@Крис ответ помог мне. Спасибо!

Не забудьте добавить "Дополнительное поведение → Проверить в определенную локальную ветку" в разделе "Управление исходным кодом".

enter image description here

Пока я не добавил, что переменная $ {GIT_LOCAL_BRANCH} не была доступна, когда я пытался ее использовать. (Например: выполните команду оболочки 'printenv', затем проверьте вывод консоли)