Сборка Дженкинса провалилась для пиара от GitHub

Я использую конвейер jenkins для создания своего проекта на github. Когда я поднимаю запрос на загрузку (PR) на GitHub, это создает работу "pr-head"

скриншот работы

который терпит неудачу все время с ошибкой ниже

Скриншот ошибки

Дайте мне знать, если у вас есть какие-либо предложения для этого

Даже ответы в задании Git PullRequest не дали результатов. Не удалось найти ревизию для сборки. Убедитесь, что конфигурация репозитория и филиала для этой работы не решила мою проблему.

1 ответ

Об этом есть открытый билет: https://issues.jenkins-ci.org/browse/JENKINS-52668?filter=18657

РЕДАКТИРОВАТЬ:

Я смог воспроизвести эту проблему, используя многоотраслевой конвейер Jenkins вместе с плагином github и ручным вызовом checkout шаг.

Для Bitbucket я нашел несколько вариантов создания PR. Я сейчас даже нашел способ пропустить условное там. Увидеть ниже.

Рекомендация

По возможности я бы рекомендовал использовать checkout scm который легко работает для PR.

Если вам нужно использовать checkout шагая вручную, вы можете попытаться настроить свой Jenkinsfile, чтобы сделать все вручную, как я сделал для проверки репозитория Bitbucket.

Самый простой способ должен быть сделать checkout scm хотя бы один раз, чтобы увидеть, как это должно быть сделано, и использовать эти значения соответствующим образом на этапах ручной проверки. Вам понадобится условие if для случая, когда вы не создаете PR.


Github

Наконец-то я получил свой небольшой пример PR-проекта от github, используя следующий код. Для моего быстрого теста я сделал пиар из какой-то ветки. В случае, если вы используете вилку в качестве источника для PR, может потребоваться дополнительная настройка.

Как указано в /questions/192109/zadanie-git-pullrequest-ne-vyipolneno-ne-udalos-najti-reviziyu-dlya-sborki-proverte-konfiguratsiyu-hranilischa-i-filiala-dlya-etogo-zadaniya/192123#192123 вы можете пропустить опцию "ветки для сборки", чтобы не получить эту ошибку. Однако, в зависимости от вашей стратегии PR-слияния, вам все равно необходимо соответствующим образом настроить слияние:

def isPr() {
    env.CHANGE_ID != null
}

// github-specific refspec
def refspec = "+refs/pull/${env.CHANGE_ID}/head:refs/remotes/origin/PR-${env.CHANGE_ID} +refs/heads/master:refs/remotes/origin/master"
def url = 'https://github.com/orgi/workflow-durable-task-step-plugin.git'

def extensions = []
if (isPr()) {
    extensions = [[$class: 'PreBuildMerge', options: [mergeRemote: "refs/remotes/origin", mergeTarget: "PR-${env.CHANGE_ID}"]]]
}

checkout([
    $class: 'GitSCM',
    doGenerateSubmoduleConfigurations: false,
    extensions: extensions,
    submoduleCfg: [],
    userRemoteConfigs: [[
        refspec: refspec,
        credentialsId: '<your credentials>',
        url: url
    ]]
])

Bitbucket

Для битбакета вы должны сделать почти то же самое. Однако у вас будет возможность выполнить коммит слияния, выполненный непосредственно в bitbucket, в этом случае вам не нужно выполнять слияние в Jenkins, а вместо этого нужно переключиться на ветку PR. Вы можете либо работать с условной ссылкой или выбрать ветку условно. Это делает четыре варианта, показанные ниже. До сих пор я не нашел вариант, который не предполагает условного.:(

Рекомендуемые решения

Следующие решения мне кажутся наиболее полезными. Они не связаны с какими-либо условиями и используют BRANCH_NAME переменная. Однако мне пришло в голову, что иногда я получаю ошибку о недопустимом refspec. В этих случаях, пожалуйста, используйте одно из альтернативных решений, как написано ниже.

Использование Bitbucket Merge

Используйте слияние, подготовленное сервером Bitbucket.

def respec = '+refs/heads/*:refs/remotes/origin/* +refs/pull-requests/*/merge:refs/remotes/origin/PR-*'
checkout([$class: 'GitSCM',
    branches: [[name: env.BRANCH_NAME]],
    doGenerateSubmoduleConfigurations: false,
    submoduleCfg: [],
    userRemoteConfigs: [[
        refspec: respec,
        url: '<repo URL>'
    ]]
])

Использование Jenkins Merge

Или вы решили позволить Дженкинсу сделать слияние. Вы можете использовать условную ссылку или условное объединение в PR.

def refspec = '+refs/heads/*:refs/remotes/origin/* +refs/pull-requests/*/merge:refs/remotes/origin/PR-*'
checkout([$class: 'GitSCM',
    doGenerateSubmoduleConfigurations: false,
    extensions: [[$class: 'PreBuildMerge', options: [mergeRemote: "refs/remotes/origin", mergeTarget: env.BRANCH_NAME]]],
    submoduleCfg: [],
    userRemoteConfigs: [[
        refspec: refspec,
        url: '<repo URL>'
    ]]
])

Общая библиотека

Чтобы загрузить разделяемую библиотеку из какого-либо запроса извлечения, вам нужно сделать две вещи:

  1. Добавьте следующую ссылку в глобальную конфигурацию вашей общей библиотеки Jenkins:

    +refs/pull-requests/*/merge:refs/remotes/@{remote}/PR-*
    
  2. Вместо того, чтобы просто использовать env.BRANCH_NAME ты должен использовать"origin/${env.BRANCH_NAME}" при загрузке этой библиотеки, например:

    libBranch = env.BRANCH_NAME
    libId= "myLib@origin/${libBranch}"
    lib = library(libId)
    

Альтернативное решение с использованием Bitbucket Merge

Условный Refspec

Просто как запасной вариант; Я могу помнить, что рефспек, в том числе PR, иногда не работал для меня. В этом случае вы можете использовать:

def isPr() {
    env.CHANGE_ID != null
}

def respec = '+refs/heads/*:refs/remotes/origin/*'
if (isPr()) {
    respec += ' +refs/pull-requests/*/merge:refs/remotes/origin/PR-*'
}
checkout([$class: 'GitSCM',
    branches: [[name: env.BRANCH_NAME]],
    doGenerateSubmoduleConfigurations: false,
    submoduleCfg: [],
    userRemoteConfigs: [[
        refspec: respec,
        url: '<repo URL>'
    ]]
])

Условное название филиала

def isPr() {
    env.CHANGE_ID != null
}
def branch
if (isPr()) {
    branch = "refs/remotes/origin/pull-requests/${env.CHANGE_ID}/merge"
} else {
    branch = "*/master"
}

checkout([$class: 'GitSCM',
    branches: [[name: branch]],
    doGenerateSubmoduleConfigurations: false,
    submoduleCfg: [],
    userRemoteConfigs: [[
        refspec: '+refs/heads/*:refs/remotes/origin/* +refs/pull-requests/*:refs/remotes/origin/pull-requests/*',
        url: '<repo URL>'
    ]]
])

Альтернативное решение с использованием Merge в Jenkins

Условная ссылка

def isPr() {
    env.CHANGE_ID != null
}
def refspec = '+refs/heads/*:refs/remotes/origin/*'
if (isPr()) {
    refspec += ' +refs/pull-requests/*/merge:refs/remotes/origin/PR-*'
}
checkout([$class: 'GitSCM',
    doGenerateSubmoduleConfigurations: false,
    extensions: [[$class: 'PreBuildMerge', options: [mergeRemote: "refs/remotes/origin", mergeTarget: env.BRANCH_NAME]]],
    submoduleCfg: [],
    userRemoteConfigs: [[
        refspec: refspec,
        url: '<repo URL>'
    ]]
])

Условное слияние

def isPr() {
    env.CHANGE_ID != null
}
def extensions = []
if (isPr()) {
    extensions = [[$class: 'PreBuildMerge', options: [mergeRemote: "refs/remotes/origin/pull-requests", mergeTarget: "${env.CHANGE_ID}/from"]]]
}
checkout([$class: 'GitSCM',
    doGenerateSubmoduleConfigurations: false,
    extensions: extensions,
    submoduleCfg: [],
    userRemoteConfigs: [[
        refspec: '+refs/heads/*:refs/remotes/origin/* +refs/pull-requests/*:refs/remotes/origin/pull-requests/*',
        url: '<repo URL>'
    ]]
])
Другие вопросы по тегам