TL; DR:给定以下声明性Jenkinsfile,如何在成功构建后合并pull请求? http://pastebin.com/uivA0MqF
在(多分支)作业配置中,在分支源>下;高级我有以下设置:
在GitHub中,我有一个可以监听pull request
和push
事件的Web钩子。
编辑:我尝试了以下操作,但目前因语法错误而失败:
def gitPullRequestNumber = null
...
...
stage ("Merge pull request") {
steps {
gitPullRequestNumber = sh "git ls-remote origin 'pull/*/head:develop'"
sh "curl -X PUT -d '{\'commit_title\': \'Merge pull request\'}' <<GIT REPO URL>>/pulls/${gitPullRequestNumber}/merge?access_token=<<ACCESS-TOKEN"
}
}
错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException:启动失败:
WorkflowScript: 58: Expected a step @ line 58, column 13.
gitPullRequestNumber = sh "git ls-remote origin 'pull/*/head:develop'"
^
1 error
背景:
我们有一个master
分支和一个develop
分支。开发人员将针对将运行测试的develop
分支执行拉取请求。如果测试通过,则应将pull请求合并到分支中。在打开拉取请求之前完成代码的检查。确定后,develop
分支将合并到master
分支。将来甚至可能只有一个分支。
我知道有些人可能会说这不会发生,但这是我们目前正在努力实现的目标。
如上所述,这一切都运行良好,作业开始并使用Jenkins文件检查基于直接推送和/或拉取请求的回购,构建开始,测试运行等等...但是缺少的部分正在合并拉回请求。
答案 0 :(得分:0)
使用git命令以书面形式合并
#Checkout main branch
git checkout master
#Merge it with pull request (insert your pull id)
git merge --no-ff pull/ID/head:develop
#TEST Local Merge Branch Compilation If Desired
#msbuild ...
#Push merged information back to git
git push origin master
答案 1 :(得分:0)
在检查构建原始PR(与基本分支合并)的复选框后,这启用了Jenkins提供的环境变量$CHANGE_ID
,在拉取请求的情况下,是拉请求号码。然后可以在阶段中使用它:
stage ("Merge pull request") {
steps {
withCredentials([usernamePassword(credentialsId: 'credential-value', usernameVariable: 'ACCESS_TOKEN_USERNAME', passwordVariable: 'ACCESS_TOKEN_PASSWORD',)]) {
sh "curl -X PUT -d '{\"commit_title\": \"Merge pull request\"}' https://github.ibm.com/api/v3/repos/org-name/repo-name/pulls/$CHANGE_ID/merge?access_token=$ACCESS_TOKEN_PASSWORD"
}
}
}
更新:验证合并是否实际成功:
script {
sh "curl -o - -s -w \"\n%{http_code}\n\" -X PUT -d '{\"commit_title\": \"Merge pull request\"}' https://github.ibm.com/api/v3/repos/****/****/pulls/$CHANGE_ID/merge?access_token=$JENKINSBOT_PSW | tail -1 > mergeResult.txt"
def mergeResult = readFile('mergeResult.txt').trim()
if (mergeResult != "200") {
error "Unable to merge!"
} else {
// Send a Slack message, etc
}
}
}