Сборка Дженкинса провалилась для пиара от 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>'
]]
])
Общая библиотека
Чтобы загрузить разделяемую библиотеку из какого-либо запроса извлечения, вам нужно сделать две вещи:
Добавьте следующую ссылку в глобальную конфигурацию вашей общей библиотеки Jenkins:
+refs/pull-requests/*/merge:refs/remotes/@{remote}/PR-*
Вместо того, чтобы просто использовать
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>'
]]
])