From 5f0788be20bad0cef4a31a88b7513da58822a157 Mon Sep 17 00:00:00 2001 From: "smut@google.com" Date: Tue, 9 Jun 2015 00:04:51 +0000 Subject: [PATCH] Add script for triggering Buildbucket builds BUG=493885 TESTED=See https://paste.googleplex.com/5622248052359168 Review URL: https://codereview.chromium.org/1164363003 git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@295569 0039d316-1c4b-4281-b951-d872f2087c98 --- buildbucket.py | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100755 buildbucket.py diff --git a/buildbucket.py b/buildbucket.py new file mode 100755 index 0000000000..7f8233b553 --- /dev/null +++ b/buildbucket.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# Copyright (c) 2015 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Tool for interacting with Buildbucket. + +Usage: + $ depot-tools-auth login https://cr-buildbucket.appspot.com + $ buildbucket.py \ + put \ + --bucket master.tryserver.chromium.linux \ + --builder my-builder \ + + Puts a build into buildbucket for my-builder on tryserver.chromium.linux. +""" + +import argparse +import json +import urlparse +import os +import sys + +from third_party import httplib2 + +import auth + + +BUILDBUCKET_URL = 'https://cr-buildbucket.appspot.com' +PUT_BUILD_URL = urlparse.urljoin( + BUILDBUCKET_URL, + '_ah/api/buildbucket/v1/builds', +) + + +def main(argv): + parser = argparse.ArgumentParser() + parser.add_argument( + '-v', + '--verbose', + action='store_true', + ) + subparsers = parser.add_subparsers(dest='command') + put_parser = subparsers.add_parser('put') + put_parser.add_argument( + '--bucket', + help=( + 'The bucket to schedule the build on. Typically the master name, e.g.' + ' master.tryserver.chromium.linux.' + ), + required=True, + ) + put_parser.add_argument( + '-n', + '--builder-name', + help='The builder to schedule the build on.', + required=True, + ) + put_parser.add_argument( + '-p', + '--properties', + help='A file to load a JSON dict of properties from.', + ) + args = parser.parse_args() + # TODO(smut): When more commands are implemented, refactor this. + assert args.command == 'put' + + properties = {} + if args.properties: + try: + with open(args.properties) as fp: + properties.update(json.load(fp)) + except (TypeError, ValueError): + sys.stderr.write('%s contained invalid JSON dict.\n' % args.properties) + raise + + authenticator = auth.get_authenticator_for_host( + BUILDBUCKET_URL, + auth.make_auth_config(use_oauth2=True), + ) + http = authenticator.authorize(httplib2.Http()) + http.force_exception_to_status_code = True + response, content = http.request( + PUT_BUILD_URL, + 'PUT', + body=json.dumps({ + 'bucket': args.bucket, + 'parameters_json': json.dumps({ + 'builder_name': args.builder_name, + 'properties': properties, + }), + }), + headers={'Content-Type': 'application/json'}, + ) + + if args.verbose: + print content + + return response.status != 200 + + +if __name__ == '__main__': + sys.exit(main(sys.argv))