Created
August 10, 2018 09:01
-
-
Save maheshgawali/30058cd0ad2effadce247a8a1e2a634d to your computer and use it in GitHub Desktop.
simple python script to check if a PR exists for the current branch in bitbucket pipeline, execute bitbucket pipelines only if a PR is created for a branch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import requests | |
import json | |
import argparse | |
PAGE_LENGTH = '50' | |
PR_STATE = 'OPEN' | |
def get_open_pr_branches(current_branch=None, | |
team=None, | |
repo=None, | |
username=None, | |
app_password=None): | |
# bitbucket api-endpoint | |
url = "https://api.bitbucket.org/2.0/repositories/{TEAM}/{REPO}/pullrequests".format( | |
TEAM=team, REPO=repo) | |
headers = {'Content-Type': 'application/json'} | |
branch_names = list() | |
params = {'pagelen': PAGE_LENGTH, 'state': PR_STATE} | |
while url: | |
r = requests.get( | |
url=url, | |
params=params, | |
auth=(username, app_password), | |
headers=headers) | |
response_dict = r.json() | |
url = response_dict.get('next', None) | |
all_vals = response_dict.get('values', []) | |
for val in all_vals: | |
branch_name = val['source']['branch']['name'] | |
# print("PR on source branch: %s" % branch_name) | |
branch_names.append(branch_name) | |
if current_branch == branch_name: | |
break | |
return branch_names | |
def main( | |
current_branch_name, | |
team, | |
repo, | |
username, | |
app_password, | |
): | |
branch_names = get_open_pr_branches( | |
current_branch_name, | |
team, | |
repo, | |
username, | |
app_password, | |
) | |
if current_branch_name in branch_names: | |
print("True") | |
else: | |
print("False") | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser( | |
description='bitbucket pull request checker script') | |
parser.add_argument( | |
'current_branch', | |
help= | |
'name of your current branch, in pipeline you can get it by using $BITBUCKET_BRANCH' | |
) | |
parser.add_argument('team', help='bitbucket team name, normally the owner of the repo') | |
parser.add_argument('repo', help='bitbucket repo slug') | |
parser.add_argument('username', help='bitbucket username') | |
parser.add_argument('app_password', help='bitbucket app password') | |
args = parser.parse_args() | |
main(args.current_branch, args.team, args.repo, args.username, | |
args.app_password) | |
# in bitbucket pipeline *.yml use as below | |
# $PR_CHECKER_USERNAME $PR_CHECKER_APP_PASSWORD export these using bitbucket pipeline environment variables | |
# - IS_PR=$(python bb-pr-checker.py $BITBUCKET_BRANCH $BITBUCKET_REPO_OWNER $BITBUCKET_REPO_SLUG $PR_CHECKER_USERNAME $PR_CHECKER_APP_PASSWORD) | |
# - if [ $IS_PR != 'True' ]; then echo Skipping tests as branch not a pull request; fi | |
# - if [ $IS_PR == 'True' ]; then | |
# - <do steps> | |
# - <do steps> | |
# - <do steps> | |
# - <do steps> | |
# - fi |
Usage
Export these env vars using bitbucket pipeline environment variables
- PR_CHECKER_USERNAME
- PR_CHECKER_APP_PASSWORD
to know how to create bitbucket app password refer this
Note: $BITBUCKET_BRANCH $BITBUCKET_REPO_OWNER $BITBUCKET_REPO_SLUG are built-in variables available in every pipeline
# in bitbucket pipeline *.yml use as below
- IS_PR=$(python bb-pr-checker.py $BITBUCKET_BRANCH $BITBUCKET_REPO_OWNER $BITBUCKET_REPO_SLUG $PR_CHECKER_USERNAME $PR_CHECKER_APP_PASSWORD)
- if [ $IS_PR != 'True' ]; then echo Skipping tests as branch not a pull request; fi
- if [ $IS_PR == 'True' ]; then
- <do steps>
- <do steps>
- <do steps>
- <do steps>
- fi
This is great! Only issue is that opening a PR on a branch doesn't trigger a rebuild. So a freshly opened PR looks like it already passed the tests. Users need to manually rebuild or push to the branch in order to trigger it. Nothing we can do about that though, this is as good as it gets until Bitbucket implements the feature properly.
FYI, to make it slightly simpler, you can do:
- IS_PR=$(python bb-pr-checker.py $BITBUCKET_BRANCH $BITBUCKET_REPO_OWNER $BITBUCKET_REPO_SLUG $PR_CHECKER_USERNAME $PR_CHECKER_APP_PASSWORD)
- if [ $IS_PR != 'True' ]; then echo "Skipping tests as branch not a pull request" && exit 0; fi
- <do steps>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
If you are running bitbucket pipelines for build or testing, and want to run it only when a Pull Request is created, or code committed to a branch for which a Pull Request exists use this gist.
Cheers!