| Index: buildbucket.py
|
| diff --git a/buildbucket.py b/buildbucket.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..97829d45b2a91f65a90224325426bd64363637f7
|
| --- /dev/null
|
| +++ b/buildbucket.py
|
| @@ -0,0 +1,104 @@
|
| +#!/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(
|
| + '-b',
|
| + '--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))
|
|
|