【问题标题】:How to merge a successful build of a pull request using a Jenkinsfile如何使用 Jenkinsfile 合并成功构建的拉取请求
【发布时间】:2017-03-08 06:56:47
【问题描述】:

TL;DR:鉴于以下声明性 Jenkinsfile,我如何在成功构建后合并拉取请求? http://pastebin.com/uivA0MqF

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

在 GitHub 中,我有一个监听 pull request 和 push 事件的网络挂钩。

编辑:我尝试了以下操作,但目前失败并出现语法错误:

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 分支执行拉取请求。如果测试通过,则拉取请求应合并到分支中。在打开拉取请求之前完成对代码的审查。确定后,develop 分支将合并到master 分支。将来甚至可能只有一个分支。

我知道有些人可能会说这不会发生是一件好事,但这是我们目前正在努力实现的目标。

如前所述,这一切正常,工作开始并使用 Jenkinsfile 根据直接推送和/或拉取请求检查 repo,构建开始,测试运行等等......但是缺少的部分正在合并拉取请求。

【问题讨论】:

  • 或许 Jon S 或 @Christopher Orr 可以提供一些信息?
  • 您不能在声明式管道中分配变量,script 块内除外。
  • 像往常一样,克里斯托弗,你的经历照亮了道路。

标签: git github jenkins jenkins-pipeline


【解决方案1】:

使用 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

【讨论】:

  • 找出作为 Jenkinsfile 一部分的拉取请求编号正是我所要求的。
  • 按照how to list all pull request with count of files changed 尝试git ls-remote origin 'pull/*/head:develop'。或者考虑使用 ruby​​ gem git-pulls
  • 很抱歉,git ls-remote origin 'pull/*/head:develop' 是否提供了当前正在测试的拉取请求的编号?
  • 我试过了,但目前失败了。请参阅我编辑的问题。
  • FWIW, git merge @{-1} 将从您所在的上一个分支合并(尽管这可能不适用于 Git 插件,因为它检查提交而不是分支)。 stackoverflow.com/a/17819027/234938 似乎有答案了。
【解决方案2】:

在选中 Build origin PRs (merged with base branch) 复选框后,这启用了 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
      }
    }
}

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多