Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

API

Webhook to Jenkins hook settings can be updated via the Atlassian Bitbucket API via the following endpoint:

...

For more on the Bitbucket REST API for updating and changing hooks, you can read here.

We've created a sample python script which updates the settings for youto automate updating settings. It reads in a settings.json file which you can download here or below.

If you'd like to To change the webhook source, you can add jenkinsEndPointType to the json setting with one of the following values:

Bitbucket Branch Source Plugin

com.nerdwin15.stash.webhook.notifier.BitbucketSourceNotifier

Git Plugin

com.nerdwin15.stash.webhook.notifier.GitPluginNotifier

...

Direct Jobs Trigger

com.nerdwin15.stash.webhook.notifier.DirectJobsNotifier

Example scripts

Expand
titleExample of script for initial configuration
configure-webhook-jenkins.py
Code Block
languagepy
#!/usr/bin/python
import httplib
import sys
import json
import argparse
from urlparse import urlparse
from base64 import b64encode

parser = argparse.ArgumentParser(description='Sample script to update Webhook To Bitbucket settings examples.')
parser.add_argument('--bitbucket_url', type=str, help='Url for Bitbucket instance.',
                    default='http://localhost:7990/bitbucket')
parser.add_argument('--username', type=str, help='Username for user with access to repository',
                    default='admin')
parser.add_argument('--password', type=str, help='Password for user with access to repository',
                    default='admin')
parser.add_argument('--project', type=str, help='Project key where repository is located',
                    default='PROJECT_1')
parser.add_argument('--repository', type=str, help='Repository key for the instance',
                    default='rep_1')
parser.add_argument('--settings', type=str, help='Path to the settings file. JSON formatted.',
                    default='settings.json')
args = parser.parse_args()

bb_url = args.bitbucket_url
username = args.username
password = args.password
project_key = args.project
repository_slug = args.repository
settings_path = args.settings

end_point = "/rest/api/latest/projects/{0}/repos/{1}/settings/hooks/com.nerdwin15.stash-stash-webhook-jenkins" \
            "%3AjenkinsPostReceiveHook/enabled".format(project_key, repository_slug)

settings_file = open(settings_path, 'r')
try:

    settings = settings_file.read()
    try:
        j = json.loads(settings)  # just to validate
    except:
        print "Invalid JSON: %s" % settings
        sys.exit(1)
finally:
    settings_file.close()

url_obj = urlparse(bb_url)

headers = {
    'authorization': "Basic " + b64encode(username + ':' + password),
    'Content-Type': 'application/json'
}

connection = httplib.HTTPConnection(url_obj.hostname, url_obj.port)

try:
    connection.request("PUT", url_obj.path + end_point, body=settings, headers=headers)
    r1 = connection.getresponse()

    print r1.status, r1.reason, r1.getheaders()

    data1 = r1.read()
    print data1
finally:
    connection.close()
settings.json
Code Block
languagejson
{
    "branchOptions": "whitelist", 
    "branchOptionsBranches": "master, develop, feature-1", 
    "cloneType": "custom", 
    "cloneType2": "custom", 
    "gitRepoUrl": "http://172.17.0.1:7990/bitbucket/scm/project_1/rep_1.git",
    "gitRepoUrl2": "http://172.17.0.1:7990/bitbucket/scm/project_1/rep_1.git",
    "ignoreCommitters": "admin, user", 
    "jenkinsBase": "http://localhost:8080",
    "jenkinsBase2": "https://localhost:8083",
    "ignoreCerts": false,
    "omitHashCode": false,
    "omitBranchName": false,
    "omitTriggerBuildButton": false
}
Expand
titleExample of script to modify settings

Code Block
languagepy
#!/usr/bin/python
import requests
import string
import json


def get_projects(s):
    projects = []
    limit = 5
    start = 0
    is_last_page = False

    while not is_last_page:
        s.headers.update({'Content-Type': 'application/json'})
        r = s.get('{}/rest/api/1.0/projects?limit={}&start={}'.format(bitbucket_url, limit, start))
        data = r.json()
        is_last_page = data['isLastPage']
        if 'nextPageStart' in data:
            start = data['nextPageStart']
        
        for project in data['values']:
            projects.append(project['key'])

    return projects

def get_hook_settings(s, project_key):
    r = s.get((hook_api + '/settings').format(bitbucket_url, project_key))

    return r.json();

def update_hook_settings(s, project_key, config):
    r = s.put((hook_api + '/enabled').format(bitbucket_url, project_key), json = config)

    print r.status_code
    print r.text



bitbucket_url = "http://localhost:7990/bitbucket"
hook_api = "{}/rest/api/latest/projects/{}/settings/hooks/com.nerdwin15.stash-stash-webhook-jenkins%3AjenkinsPostReceiveHook"
username = "admin"
password = "admin"

s = requests.Session()
s.auth = (username, password)
s.headers.update({'X-Atlassian-Token':'nocheck'})
s.headers.update({'Content-Type': 'application/json'})

for project in get_projects(s):
    config = get_hook_settings(s, project)
    config['jenkinsBase']='http://localhost:8080/jenkins'
    
    update_hook_settings(s, project, config)

Parameter details

disabledEvents is a comma-separated list of class names of events to ignore. Supported class names are listed below, with links to the corresponding Bitbucket documentation explaining when each event is triggered:

...