Navigation Menu

Skip to content

Commit

Permalink
[FIXED JENKINS-28877] Adding BitBucket server webhook (#53)
Browse files Browse the repository at this point in the history
[JENKINS-28877] Adding BitBucket server webhook
  • Loading branch information
fbelzunc committed Dec 6, 2017
1 parent 5133e43 commit 5701ae3
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 0 deletions.
@@ -1,5 +1,7 @@
package com.cloudbees.jenkins.plugins;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;

Expand All @@ -25,6 +27,11 @@ public void processPayload(JSONObject payload, HttpServletRequest request) {
LOGGER.log(Level.INFO, "Processing new Webhooks payload");
processWebhookPayload(payload);
}
} else if (payload.has("actor") && payload.has("repository")) {
if ("repo:push".equals(request.getHeader("x-event-key"))) {
LOGGER.log(Level.INFO, "Processing new Webhooks payload");
processWebhookPayloadBitBucketServer(payload);
}
} else {
LOGGER.log(Level.INFO, "Processing old POST service payload");
processPostServicePayload(payload);
Expand Down Expand Up @@ -52,6 +59,33 @@ private void processWebhookPayload(JSONObject payload) {

}

/**
* Payload processor for BitBucket server. The plugin Post Webhooks for Bitbucket
* https://marketplace.atlassian.com/plugins/nl.topicus.bitbucket.bitbucket-webhooks/server/overview
* should be installed and configured
*
* @param payload
*/
private void processWebhookPayloadBitBucketServer(JSONObject payload) {
JSONObject repo = payload.getJSONObject("repository");
String user = payload.getJSONObject("actor").getString("username");
String url = "";
if (repo.getJSONObject("links").getJSONArray("self").size() != 0) {
try {
URL pushHref = new URL(repo.getJSONObject("links").getJSONArray("self").getJSONObject(0).getString("href"));
if (pushHref.getProtocol().equals("https")) {
url = pushHref.toString().replaceFirst(new String("projects.*"), new String("scm/" + repo.getString("fullName").toLowerCase()));
} else {
url = pushHref.toString().replaceFirst(new String("projects.*"), new String(repo.getString("fullName").toLowerCase()));
}
String scm = repo.has("scmId") ? repo.getString("scmId") : "git";
probe.triggerMatchingJobs(user, url, scm, payload.toString());
} catch (MalformedURLException e) {
LOGGER.log(Level.WARNING, String.format("URL %s is malformed", url), e);
}
}
}

/*
{
"canon_url": "https://bitbucket.org",
Expand Down
Expand Up @@ -5,6 +5,7 @@

import javax.servlet.http.HttpServletRequest;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.junit.Before;
Expand Down Expand Up @@ -60,6 +61,32 @@ public void testProcessWebhookPayload() {
verify(probe).triggerMatchingJobs(user, url, "hg", hgLoad.toString());
}

@Test
public void processWebhookPayloadBitBucketServer() {
// Set headers so that payload processor will parse as new Webhook payload
when(request.getHeader("user-agent")).thenReturn("Apache-HttpClient/4.5.1 (Java/1.8.0_102)");
when(request.getHeader("x-event-key")).thenReturn("repo:push");

String user = "test_user";
String url = "https://bitbucket.org/scm/ce/test_repo";

JSONObject href = new JSONObject();
href.element("href", "https://bitbucket.org/projects/CE/repos/test_repo/browse");

JSONObject payload = new JSONObject()
.element("actor", new JSONObject()
.element("username", user))
.element("repository", new JSONObject()
.element("links", new JSONObject()
.element("self", new JSONArray()
.element(href)))
.element("fullName", "CE/test_repo"));

payloadProcessor.processPayload(payload, request);

verify(probe).triggerMatchingJobs(user, url, "git", payload.toString());
}

@Test
public void testProcessPostServicePayload() {
// Ensure header isn't set so that payload processor will parse as old POST service payload
Expand Down

0 comments on commit 5701ae3

Please sign in to comment.