| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 """Harvest data on the Try Server. | |
| 7 | |
| 8 Please use sparingly. Large values for horizon will trash the Try Server memory. | |
| 9 """ | |
| 10 | |
| 11 import os | |
| 12 import optparse | |
| 13 import sys | |
| 14 | |
| 15 | |
| 16 def get_failed_builds(builder, horizon): | |
| 17 """Constructs the list of failed builds.""" | |
| 18 builder.builds.cache() | |
| 19 return [ | |
| 20 builder.builds[i] for i in xrange(-horizon, 0) | |
| 21 if not builder.builds[i].simplified_result | |
| 22 ] | |
| 23 | |
| 24 | |
| 25 def get_parent_build(build): | |
| 26 """Returns the parent build for a triggered build.""" | |
| 27 parent_buildername = build.properties_as_dict['parent_buildername'] | |
| 28 parent_builder = build.builders[parent_buildername] | |
| 29 return parent_builder.builds[build.properties_as_dict['parent_buildnumber']] | |
| 30 | |
| 31 | |
| 32 def parse(b, horizon): | |
| 33 print('Processing last %d entries' % horizon) | |
| 34 failed_builds = get_failed_builds(b.builders['swarm_triggered'], horizon) | |
| 35 rate = 100. * (1. - float(len(failed_builds)) / float(horizon)) | |
| 36 print('Success: %3.1f%%' % rate) | |
| 37 | |
| 38 NO_KEY = 'Warning: Unable to find any tests with the name' | |
| 39 HTTP_404 = 'threw HTTP Error 404: Not Found' | |
| 40 for build in failed_builds: | |
| 41 print('%s/%d on %s' % (build.builder.name, build.number, build.slave.name)) | |
| 42 swarm_trigger_tests = build.steps['swarm_trigger_tests'] | |
| 43 base_unittests = build.steps['base_unittests'] | |
| 44 fail = '' | |
| 45 if swarm_trigger_tests.simplified_result: | |
| 46 fail = 'buildbot failed to pass arguments' | |
| 47 elif not swarm_trigger_tests.stdio: | |
| 48 fail = 'old swarm_trigger_step.py version' | |
| 49 else: | |
| 50 stdio = base_unittests.stdio | |
| 51 if NO_KEY in stdio: | |
| 52 fail = 'Failed to retrieve keys.' | |
| 53 elif HTTP_404 in stdio: | |
| 54 fail = 'Failed to retrieve keys with 404.' | |
| 55 | |
| 56 if fail: | |
| 57 print(' Triggering failed: %s' % fail) | |
| 58 else: | |
| 59 # Print the first few lines. | |
| 60 lines = base_unittests.stdio.splitlines()[:15] | |
| 61 print('\n'.join(' ' + l for l in lines)) | |
| 62 print(' %s %s %s %s' % ( | |
| 63 build.properties_as_dict['use_swarm_client_revision'], | |
| 64 build.properties_as_dict['swarm_hashes'], | |
| 65 build.properties_as_dict.get('use_swarm_client_revision'), | |
| 66 build.properties_as_dict.get('testfilter'))) | |
| 67 | |
| 68 | |
| 69 def main(): | |
| 70 parser = optparse.OptionParser() | |
| 71 parser.add_option('-b', '--buildbot_json', help='path to buildbot_json.py') | |
| 72 parser.add_option( | |
| 73 '-u', '--url', | |
| 74 default='http://build.chromium.org/p/tryserver.chromium/', | |
| 75 help='server url, default: %default') | |
| 76 parser.add_option('-H', '--horizon', default=100, type='int') | |
| 77 options, args = parser.parse_args(None) | |
| 78 if args: | |
| 79 parser.error('Unsupported args: %s' % args) | |
| 80 | |
| 81 if options.horizon < 10 or options.horizon > 2000: | |
| 82 parser.error('Use reasonable --horizon value') | |
| 83 | |
| 84 if options.buildbot_json: | |
| 85 options.buildbot_json = os.path.abspath(options.buildbot_json) | |
| 86 if not os.path.isdir(options.buildbot_json): | |
| 87 parser.error('Pass a valid directory path to --buildbot_json') | |
| 88 sys.path.insert(0, options.buildbot_json) | |
| 89 | |
| 90 try: | |
| 91 import buildbot_json # pylint: disable=F0401 | |
| 92 except ImportError: | |
| 93 parser.error('Pass a directory path to buildbot_json.py with -b') | |
| 94 | |
| 95 b = buildbot_json.Buildbot(options.url) | |
| 96 parse(b, options.horizon) | |
| 97 return 0 | |
| 98 | |
| 99 | |
| 100 if __name__ == '__main__': | |
| 101 sys.exit(main()) | |
| OLD | NEW |