diff options
-rw-r--r-- | cros_utils/buildbot_utils.py | 169 | ||||
-rw-r--r-- | cros_utils/chromeos-toolchain-credentials.json | 12 |
2 files changed, 100 insertions, 81 deletions
diff --git a/cros_utils/buildbot_utils.py b/cros_utils/buildbot_utils.py index 3b0b916b..4cca08ed 100644 --- a/cros_utils/buildbot_utils.py +++ b/cros_utils/buildbot_utils.py @@ -5,10 +5,15 @@ from __future__ import print_function +import base64 +import json import os import time import urllib2 +# pylint: disable=no-name-in-module +from oauth2client.service_account import ServiceAccountCredentials + from cros_utils import command_executer from cros_utils import logger from cros_utils import buildbot_json @@ -34,13 +39,13 @@ class BuildbotTimeout(Exception): def ParseReportLog(url, build): """Scrape the trybot image name off the Reports log page. - This takes the URL for a trybot Reports Stage web page, - and a trybot build type, such as 'daisy-release'. It - opens the web page and parses it looking for the trybot - artifact name (e.g. something like - 'trybot-daisy-release/R40-6394.0.0-b1389'). It returns the - artifact name, if found. - """ + This takes the URL for a trybot Reports Stage web page, + and a trybot build type, such as 'daisy-release'. It + opens the web page and parses it looking for the trybot + artifact name (e.g. something like + 'trybot-daisy-release/R40-6394.0.0-b1389'). It returns the + artifact name, if found. + """ trybot_image = '' url += '/text' newurl = url.replace('uberchromegw', 'chromegw') @@ -60,10 +65,10 @@ def ParseReportLog(url, build): def GetBuildData(buildbot_queue, build_id): """Find the Reports stage web page for a trybot build. - This takes the name of a buildbot_queue, such as 'daisy-release' - and a build id (the build number), and uses the json buildbot api to - find the Reports stage web page for that build, if it exists. - """ + This takes the name of a buildbot_queue, such as 'daisy-release' + and a build id (the build number), and uses the json buildbot api to + find the Reports stage web page for that build, if it exists. + """ builder = buildbot_json.Buildbot( 'http://chromegw/p/tryserver.chromiumos/').builders[buildbot_queue] build_data = builder.builds[build_id].data @@ -76,65 +81,67 @@ def GetBuildData(buildbot_queue, build_id): return '' -def FindBuildRecordFromLog(description, log_info): +def FindBuildRecordFromLog(description, build_info): """Find the right build record in the build logs. - Get the first build record from build log with a reason field - that matches 'description'. ('description' is a special tag we - created when we launched the buildbot, so we could find it at this - point.) - """ - - current_line = 1 - while current_line < len(log_info): - my_dict = {} - # Read all the lines from one "Build" to the next into my_dict - while True: - key = log_info[current_line].split(':')[0].strip() - value = log_info[current_line].split(':', 1)[1].strip() - my_dict[key] = value - current_line += 1 - if 'Build' in key or current_line == len(log_info): - break - try: - # Check to see of the build record is the right one. - if str(description) in my_dict['reason']: - # We found a match; we're done. - return my_dict - except KeyError: - print("reason is not in dictionary: '%s'" % repr(my_dict)) - else: - # Keep going. - continue - - # We hit the bottom of the log without a match. + Get the first build record from build log with a reason field + that matches 'description'. ('description' is a special tag we + created when we launched the buildbot, so we could find it at this + point.) + """ + for build_log in build_info: + if description in build_log['reason']: + return build_log return {} -def GetBuildInfo(file_dir, builder): - """Get all the build records for the trybot builds. - - file_dir is the toolchain_utils directory. - """ - ce = command_executer.GetCommandExecuter() - commands = ('{0}/cros_utils/buildbot_json.py builds ' - 'http://chromegw/i/tryserver.chromiumos/'.format(file_dir)) - - if builder: - # For release builds, get logs from the 'release' builder. - if builder.endswith('-release'): - commands += ' -b release' - elif builder.endswith('-gcc-toolchain'): - commands += ' -b gcc_toolchain' - elif builder.endswith('-llvm-toolchain'): - commands += ' -b llvm_toolchain' - elif builder.endswith('-toolchain'): - commands += ' -b etc' - else: - commands += ' -b %s' % builder - _, buildinfo, _ = ce.RunCommandWOutput(commands, print_to_console=False) - build_log = buildinfo.splitlines() - return build_log +def GetBuildInfo(file_dir, waterfall_builder): + """Get all the build records for the trybot builds.""" + + builder = '' + if waterfall_builder.endswith('-release'): + builder = 'release' + elif waterfall_builder.endswith('-gcc-toolchain'): + builder = 'gcc_toolchain' + elif waterfall_builder.endswith('-llvm-toolchain'): + builder = 'llvm_toolchain' + + sa_file = os.path.expanduser( + os.path.join(file_dir, 'cros_utils', + 'chromeos-toolchain-credentials.json')) + scopes = ['https://www.googleapis.com/auth/userinfo.email'] + + credentials = ServiceAccountCredentials.from_json_keyfile_name( + sa_file, scopes=scopes) + url = ( + 'https://luci-milo.appspot.com/prpc/milo.Buildbot/GetBuildbotBuildsJSON') + + # NOTE: If we want to get build logs for the main waterfall builders, the + # 'master' field below should be 'chromeos' instead of 'chromiumos.tryserver'. + # Builder would be 'amd64-gcc-toolchain' or 'arm-llvm-toolchain', etc. + + body = json.dumps({ + 'master': 'chromiumos.tryserver', + 'builder': builder, + 'include_current': True, + 'limit': 100 + }) + access_token = credentials.get_access_token() + headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': 'Bearer %s' % access_token.access_token + } + r = urllib2.Request(url, body, headers) + u = urllib2.urlopen(r, timeout=60) + u.read(4) + o = json.load(u) + data = [base64.b64decode(item['data']) for item in o['builds']] + result = [] + for d in data: + tmp = json.loads(d) + result.append(tmp) + return result def FindArchiveImage(chromeos_root, build, build_id): @@ -182,28 +189,28 @@ def GetTrybotImage(chromeos_root, buildbot_name, patch_list, build_tag, - other_flags=[], + other_flags=None, build_toolchain=False, async=False): """Launch buildbot and get resulting trybot artifact name. - This function launches a buildbot with the appropriate flags to - build the test ChromeOS image, with the current ToT mobile compiler. It - checks every 10 minutes to see if the trybot has finished. When the trybot - has finished, it parses the resulting report logs to find the trybot - artifact (if one was created), and returns that artifact name. + This function launches a buildbot with the appropriate flags to + build the test ChromeOS image, with the current ToT mobile compiler. It + checks every 10 minutes to see if the trybot has finished. When the trybot + has finished, it parses the resulting report logs to find the trybot + artifact (if one was created), and returns that artifact name. - chromeos_root is the path to the ChromeOS root, needed for finding chromite - and launching the buildbot. + chromeos_root is the path to the ChromeOS root, needed for finding chromite + and launching the buildbot. - buildbot_name is the name of the buildbot queue, such as lumpy-release or - daisy-paladin. + buildbot_name is the name of the buildbot queue, such as lumpy-release or + daisy-paladin. - patch_list a python list of the patches, if any, for the buildbot to use. + patch_list a python list of the patches, if any, for the buildbot to use. - build_tag is a (unique) string to be used to look up the buildbot results - from among all the build records. - """ + build_tag is a (unique) string to be used to look up the buildbot results + from among all the build records. + """ ce = command_executer.GetCommandExecuter() cbuildbot_path = os.path.join(chromeos_root, 'chromite/cbuildbot') base_dir = os.getcwd() @@ -286,9 +293,9 @@ def GetTrybotImage(chromeos_root, # still have to wait for the buildbot job to finish running # however. pending = False - if 'True' in data_dict['completed']: + if True == data_dict['finished']: build_id = data_dict['number'] - build_status = int(data_dict['result']) + build_status = data_dict['results'] else: done = False diff --git a/cros_utils/chromeos-toolchain-credentials.json b/cros_utils/chromeos-toolchain-credentials.json new file mode 100644 index 00000000..aed9a527 --- /dev/null +++ b/cros_utils/chromeos-toolchain-credentials.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "chromeos-toolchain-u", + "private_key_id": "d0efe593ad39aad4c685273ee80e4c24bb3f2e92", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5Rm6aqSjMNrRp\ntYNc++ec79L3QZ2MxLMYKyhlgGhppVt6p/wiSvLdI19nS5TAkKMjKv71rb9DbQlG\nfQVckiY+MlADJKi29lJrwqqNDCcRgB7CL6hgDfmhWMKonZn2MwvBVROD0gi7sY+A\nipIe92jVeqG8Gvp5kOgsBxCRV5YQok8j1FxE5fIsS2sg93VS1YAzH8uPYadWb/Z5\n9uwc8U7SL0mEPjXjsLEm8Y70zovGVjv7kOLqYBMUmROLvSouG/HrZWy9uTgxFOb5\njOhxKhDcDMPVM3g8lfc0EwPUB1NxXztoST9qBJVqdzQmHpPjeDxgru0A+zaQMkWA\ne8Sn5EQrAgMBAAECggEAUnhbe1SY6G3hWLyHQLiQnHbUPWNjselMnxF25deGoqAM\nXEiyHsGl4XGBYgVurVi0hU76NnmkjWrXmhzEajRT+ZODsiJ7RxXWEkmQiUBDk7Kn\n/mAgXsFZwMw1ucCNa93E+cXY7fBsGsAq1FjaOhZ+/6eanpSTsdEix5ZNdaS7E6Op\n9zIba9EjLIvSl435+eWq0C3aU9nd1RbbRwD6vGpgG8L/r957s+AAALTqdSZGWxJX\nEC9OKT07e76qvwAsq2BoBx5vW0xmeQdZgKrA10LLDWa7UjFbwSDJIBESYtd4rYMj\nAqg5eND0bC1RrgzI+RD/10l6Vj8bBFo/403s0P5LYQKBgQDiVGVFkrw5LSy82CGC\nvSraxPriivEweMfpkp6buMbD2Je0RMR4glc1vW5m0QUJmy+ymiIHVMCmE9xNBwbS\nRyCBnrs2+3FtdnruNdcaGh6sbTlY+qJI0rEZUdbb5OhlHZF47KW66hI6sWJ1YF8O\niLQTokW8ejybprCtl1HvEHhEbwKBgQDRkD/acZrvmcnqqmorqW6mgJEkrRF/i5Th\npDo3WegXA4irX0tNqh5w+wms8r41vUZSCZYvyi0Of9LMObVdB/gA/qVzETE0p5he\ns3Skp/VK8nF53pAUd+4dKlnCvD3TOEkIq+kxuEOs2iHJcvSjmKtMgqfMK/UtieB4\n7+MaOcbyBQKBgHOUndMVyEF6rGoUBaj6abQm++hNBDa4t360fYMQrZC+P1qz85GH\nHno3LvYar/Pj6EvRIqeTxH4LjmlXuUgRQqxvHzRI2/gGlWio3hxaUmfDr5GdDNsb\nnY1MmejZ0UQyAWQ7lbcKahzHEXzXpjOJ5ExShkJmOiVSzs8Xg6QOSRzJAoGAemYs\nRWQxQFysqJlcZaASdsGFBMzo+XwHOzt2nTmv6zEvNBj2nKgOG6MkZZVqL20bk3Lx\n+3u0kVFrR8k0+t9apQoWjHywJrb0setS55EKHfo4+RtbP/lEZFiGEM1ttt6bGat/\nCoE7VcwaC9VOufbDpm5xnzjVfQGY0EocdQbmAhkCgYB/isdqeDyafawr+38fcU1r\nX2+cK5JCrEzHIwg2QN3Z56cRrqrb+kK1H3w/F7ZfrlPSmS8XMwZV73QwieoGNIYL\nie9UZqRoZSG73FzIw5mXhWWA1adFz8HpGG5wRNshnPI2liOPwhnblfadJUfXb2br\n021vPgpsxamLjHSDSmSf6Q==\n-----END PRIVATE KEY-----\n", + "client_email": "mobiletc-prebuild-2@chromeos-toolchain-u.iam.gserviceaccount.com", + "client_id": "114495086044042319417", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://accounts.google.com/o/oauth2/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/mobiletc-prebuild-2%40chromeos-toolchain-u.iam.gserviceaccount.com" +} |