如何使用Jenkinsfile合并成功构建拉取请求

时间:2017-03-08 06:56:48

标签: git github jenkins jenkins-pipeline

TL; DR:给定以下声明性Jenkinsfile,如何在成功构建后合并pull请求? http://pastebin.com/uivA0MqF

在(多分支)作业配置中,在分支源>下;高级我有以下设置:

enter image description here

在GitHub中,我有一个可以监听pull requestpush事件的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文件检查基于直接推送和/或拉取请求的回购,构建开始,测试运行等等...但是缺少的部分正在合并拉回请求。

2 个答案:

答案 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
      }
    }
}