我想构建一个集成多个存储库的Pipeline。
总体思路:
请注意,我不尝试从Pull-Request触发构建本身。
触发Job只是一个普通的Pipeline脚本。
所以checkout scm
不适用于我的情况。
我很乐意从Pull-Requests中触发这个。
Jenkins的许多Multi-Branch插件虽然没有帮助我,因为他们只假设一个存储库是构建的一部分。
到目前为止,我大多避免从git
步骤调用sh
,因为这会让我接近抛弃任何和所有Jenkins-Git集成。
如果有的话,我可以使用Pipeline checkout
方法直接检出Pull-Request吗?
这是否在checkout
方法的范围内?
可能,我正在寻找的是直接与Jenkins的JGit客户端进行交互,此时我也可以使用sh
命令......
答案 0 :(得分:1)
事实证明,这可以通过在结帐配置对象上设置refspec属性来实现:
checkoutConfig.with {
branches = [[ name: 'pr/4711' ]]
userRemoteConfigs[0].refspec = '+refs/pull/*/head:refs/remotes/origin/pr/*'
}
答案 1 :(得分:0)
基于this doc关于获取拉取请求的信息。
假设您将PR编号作为参数传递:
lastName
这是怎么回事:
checkout([$class: 'GitSCM', branches: [[name: "FETCH_HEAD"]],
extensions: [[$class: 'LocalBranch']],
userRemoteConfigs: [[refspec: "+refs/pull/${params.PR_NUMBER}/head:refs/remotes/origin/PR-${params.PR_NUMBER}", url: "https://${GITHUB_TOKEN}@github.com/${YOUR_REPO}"]]])
是避免在Jenkins代理上使用detached HEAD 干杯!
答案 2 :(得分:0)
受先前回复和消息来源https://www.git-tower.com/learn/git/faq/detached-head-when-checkout-commit的启发,我编写了一个简单的共享库管道步骤:
checkoutPullRequest.groovy
Void call(String prNbr, String repo) {
checkout([$class: 'GitSCM',
branches: [[name: "FETCH_HEAD"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'LocalBranch'], [$class: 'RelativeTargetDirectory', relativeTargetDir: "${repo}"]],
userRemoteConfigs: [[refspec: "+refs/pull/${prNbr}/head:refs/remotes/origin/PR-${prNbr} +refs/heads/master:refs/remotes/origin/master",
url: "https://${env.GITHUB_TOKEN}@github.com/githubusername/${repo}"]]
])
}
因此您可以在管道Jenkinsfile中使用
checkoutPullRequest('926', 'appgitrepo')
答案 3 :(得分:0)
如果您正在使用Bitbucket:
checkout([$class: 'GitSCM', branches: [[name: 'FETCH_HEAD']],
doGenerateSubmoduleConfigurations: false, extensions: [
[$class: 'LocalBranch'],
[$class: 'CleanBeforeCheckout']],
submoduleCfg: [], userRemoteConfigs: [
[refspec: "refs/pull-requests/${prNumber}/from:pr/${prNumber}",
credentialsId: "${credentialId}",url: "${cloneurl}"]]])