nemccarthy / stash-pullrequest-builder-plugin

A Jenkins plugin for Building Stash Pull Requests
https://wiki.jenkins-ci.org/display/JENKINS/Stash+pullrequest+builder+plugin
Other
64 stars 130 forks source link

Feature request: approve PR on successful build #107

Open osigida opened 7 years ago

osigida commented 7 years ago

it would be nice to approve/reject PR based on the build status: see https://developer.atlassian.com/static/rest/bitbucket-server/4.12.0/bitbucket-rest.html#idp2045632

when the build is successful, Jenkins can push APPROVE status, on failure NEEDS_WORK and then we can have further automation, like require successful build before merge.

loicalbertin commented 7 years ago

Hi @osigida

To do this I personally use the stash notifier plugin configured as described in the README and combined with a repository configured to allow PR merges only with successful builds.

Hope this helps.

sabberworm commented 7 years ago

I’m now using the following System groovy script as first build step:

import hudson.model.*
import groovy.json.JsonOutput
import stashpullrequestbuilder.stashpullrequestbuilder.*

// get current thread / Executor
def thr = Thread.currentThread()
// get current build
def build = thr?.executable

// get pull-request plugin impl
def cause = build.getCause(StashCause)
def trigger = build.project.getTrigger(StashBuildTrigger)

def url = "${cause.stashHost}/rest/api/1.0/projects/${cause.destinationRepositoryOwner}/repos/${cause.destinationRepositoryName}/pull-requests/${cause.pullRequestId}/participants/${trigger.username}"

def conn = new URL(url).openConnection()

String userCredentials = "${trigger.username}:${trigger.password}"
String basicAuth = "Basic ${userCredentials.bytes.encodeBase64().toString()}"
conn.setRequestProperty('Authorization', basicAuth)
conn.setRequestMethod('PUT')
conn.setRequestProperty('Content-Type', 'application/json; charset=utf-8')
conn.setRequestProperty('Accept', 'application/json; charset=utf-8')

conn.setDoOutput(true)

String out = JsonOutput.toJson([status: 'NEEDS_WORK'])

conn.connect()

def writer = new OutputStreamWriter(conn.outputStream);
writer.write(out)
writer.close()

And then I use the “Groovy postbuild” plugin to execute the following, almost identical script on successful builds:

import hudson.model.*
import groovy.json.JsonOutput
import stashpullrequestbuilder.stashpullrequestbuilder.*

if(manager.build.result.isBetterOrEqualTo(hudson.model.Result.UNSTABLE)) {
    def build = manager.build

    // get pull-request plugin impl
    def cause = build.getCause(StashCause)
    def trigger = build.project.getTrigger(StashBuildTrigger)

    def url = "${cause.stashHost}/rest/api/1.0/projects/${cause.destinationRepositoryOwner}/repos/${cause.destinationRepositoryName}/pull-requests/${cause.pullRequestId}/participants/${trigger.username}"

    def conn = new URL(url).openConnection()

    String userCredentials = "${trigger.username}:${trigger.password}"
    String basicAuth = "Basic ${userCredentials.bytes.encodeBase64().toString()}"
    conn.setRequestProperty('Authorization', basicAuth)
    conn.setRequestMethod('PUT')
    conn.setRequestProperty('Content-Type', 'application/json; charset=utf-8')
    conn.setRequestProperty('Accept', 'application/json; charset=utf-8')

    conn.setDoOutput(true)

    String out = JsonOutput.toJson([status: 'APPROVED'])

    conn.connect()

    def writer = new OutputStreamWriter(conn.outputStream);
    writer.write(out)
    writer.close()
}

This is a bit of a pain to configure and maintain but works fine. But I will look into the stashNotifier plugin too…

tettaji commented 7 years ago

I've opened a PR for this a couple of months ago, though it hasn't been approved yet: https://github.com/nemccarthy/stash-pullrequest-builder-plugin/pull/123

You could build my fork locally and upload the binary into Jenkins. Worked for me, at least.