| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Chromium auto-bisect tool | 6 """Chromium auto-bisect tool |
| 7 | 7 |
| 8 This script bisects a range of commits using binary search. It starts by getting | 8 This script bisects a range of commits using binary search. It starts by getting |
| 9 reference values for the specified "good" and "bad" commits. Then, for revisions | 9 reference values for the specified "good" and "bad" commits. Then, for revisions |
| 10 in between, it will get builds, run tests and classify intermediate revisions as | 10 in between, it will get builds, run tests and classify intermediate revisions as |
| (...skipping 2127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2138 if run_results_reverted[1]: | 2138 if run_results_reverted[1]: |
| 2139 return (None, None) | 2139 return (None, None) |
| 2140 | 2140 |
| 2141 run_results_tot = self._RunTestWithAnnotations( | 2141 run_results_tot = self._RunTestWithAnnotations( |
| 2142 'Re-Testing ToT', | 2142 'Re-Testing ToT', |
| 2143 'Failed to run ToT.', | 2143 'Failed to run ToT.', |
| 2144 head_revision, target_depot, command_to_run, metric, force_build) | 2144 head_revision, target_depot, command_to_run, metric, force_build) |
| 2145 | 2145 |
| 2146 return (run_results_tot, run_results_reverted) | 2146 return (run_results_tot, run_results_reverted) |
| 2147 | 2147 |
| 2148 def PostBisectResults(self, bisect_results): |
| 2149 """Posts bisect results to Perf Dashboard.""" |
| 2150 bisect_utils.OutputAnnotationStepStart('Post Results') |
| 2151 |
| 2152 results = bisect_results_json.Get( |
| 2153 bisect_results, self.opts, self.depot_registry) |
| 2154 data = {'data': results} |
| 2155 request = urllib2.Request(PERF_DASH_RESULTS_URL) |
| 2156 request.add_header('Content-Type', 'application/json') |
| 2157 try: |
| 2158 urllib2.urlopen(request, json.dumps(data)) |
| 2159 except urllib2.URLError as e: |
| 2160 print 'Failed to post bisect results. Error: %s.' % e |
| 2161 bisect_utils.OutputAnnotationStepWarning() |
| 2162 |
| 2163 bisect_utils.OutputAnnotationStepClosed() |
| 2164 |
| 2148 def _RunTestWithAnnotations( | 2165 def _RunTestWithAnnotations( |
| 2149 self, step_text, error_text, head_revision, | 2166 self, step_text, error_text, head_revision, |
| 2150 target_depot, command_to_run, metric, force_build): | 2167 target_depot, command_to_run, metric, force_build): |
| 2151 """Runs the performance test and outputs start/stop annotations. | 2168 """Runs the performance test and outputs start/stop annotations. |
| 2152 | 2169 |
| 2153 Args: | 2170 Args: |
| 2154 results: BisectResults from the bisect. | 2171 results: BisectResults from the bisect. |
| 2155 target_depot: The target depot we're bisecting. | 2172 target_depot: The target depot we're bisecting. |
| 2156 command_to_run: Specify the command to execute the performance test. | 2173 command_to_run: Specify the command to execute the performance test. |
| 2157 metric: The performance metric to monitor. | 2174 metric: The performance metric to monitor. |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2502 opts: The options parsed from the command line. | 2519 opts: The options parsed from the command line. |
| 2503 | 2520 |
| 2504 Returns: | 2521 Returns: |
| 2505 True if the platform and build system are supported. | 2522 True if the platform and build system are supported. |
| 2506 """ | 2523 """ |
| 2507 # Haven't tested the script out on any other platforms yet. | 2524 # Haven't tested the script out on any other platforms yet. |
| 2508 supported = ['posix', 'nt'] | 2525 supported = ['posix', 'nt'] |
| 2509 return os.name in supported | 2526 return os.name in supported |
| 2510 | 2527 |
| 2511 | 2528 |
| 2512 def _PostBisectResults(bisect_results, opts, src_cwd): | |
| 2513 """Posts bisect results to Perf Dashboard.""" | |
| 2514 bisect_utils.OutputAnnotationStepStart('Post Results') | |
| 2515 | |
| 2516 results = bisect_results_json.Get( | |
| 2517 bisect_results, opts, DepotDirectoryRegistry(src_cwd)) | |
| 2518 data = {'data': results} | |
| 2519 request = urllib2.Request(PERF_DASH_RESULTS_URL) | |
| 2520 request.add_header('Content-Type', 'application/json') | |
| 2521 try: | |
| 2522 urllib2.urlopen(request, json.dumps(data)) | |
| 2523 except urllib2.URLError as e: | |
| 2524 print 'Failed to post bisect results. Error: %s.' % e | |
| 2525 bisect_utils.OutputAnnotationStepWarning() | |
| 2526 | |
| 2527 bisect_utils.OutputAnnotationStepClosed() | |
| 2528 | |
| 2529 | |
| 2530 def RemoveBuildFiles(build_type): | 2529 def RemoveBuildFiles(build_type): |
| 2531 """Removes build files from previous runs.""" | 2530 """Removes build files from previous runs.""" |
| 2532 out_dir = os.path.join('out', build_type) | 2531 out_dir = os.path.join('out', build_type) |
| 2533 build_dir = os.path.join('build', build_type) | 2532 build_dir = os.path.join('build', build_type) |
| 2534 logging.info('Removing build files in "%s" and "%s".', | 2533 logging.info('Removing build files in "%s" and "%s".', |
| 2535 os.path.abspath(out_dir), os.path.abspath(build_dir)) | 2534 os.path.abspath(out_dir), os.path.abspath(build_dir)) |
| 2536 try: | 2535 try: |
| 2537 RemakeDirectoryTree(out_dir) | 2536 RemakeDirectoryTree(out_dir) |
| 2538 RemakeDirectoryTree(build_dir) | 2537 RemakeDirectoryTree(build_dir) |
| 2539 except Exception as e: | 2538 except Exception as e: |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2874 not opts.debug_ignore_sync and | 2873 not opts.debug_ignore_sync and |
| 2875 not opts.working_directory): | 2874 not opts.working_directory): |
| 2876 raise RuntimeError('You must switch to master branch to run bisection.') | 2875 raise RuntimeError('You must switch to master branch to run bisection.') |
| 2877 bisect_test = BisectPerformanceMetrics(opts, os.getcwd()) | 2876 bisect_test = BisectPerformanceMetrics(opts, os.getcwd()) |
| 2878 try: | 2877 try: |
| 2879 results = bisect_test.Run(opts.command, opts.bad_revision, | 2878 results = bisect_test.Run(opts.command, opts.bad_revision, |
| 2880 opts.good_revision, opts.metric) | 2879 opts.good_revision, opts.metric) |
| 2881 if results.error: | 2880 if results.error: |
| 2882 raise RuntimeError(results.error) | 2881 raise RuntimeError(results.error) |
| 2883 bisect_test.printer.FormatAndPrintResults(results) | 2882 bisect_test.printer.FormatAndPrintResults(results) |
| 2884 _PostBisectResults(results, opts, os.getcwd()) | 2883 bisect_test.PostBisectResults(results) |
| 2885 return 0 | 2884 return 0 |
| 2886 finally: | 2885 finally: |
| 2887 bisect_test.PerformCleanup() | 2886 bisect_test.PerformCleanup() |
| 2888 except RuntimeError as e: | 2887 except RuntimeError as e: |
| 2889 if opts.output_buildbot_annotations: | 2888 if opts.output_buildbot_annotations: |
| 2890 # The perf dashboard scrapes the "results" step in order to comment on | 2889 # The perf dashboard scrapes the "results" step in order to comment on |
| 2891 # bugs. If you change this, please update the perf dashboard as well. | 2890 # bugs. If you change this, please update the perf dashboard as well. |
| 2892 bisect_utils.OutputAnnotationStepStart('Results') | 2891 bisect_utils.OutputAnnotationStepStart('Results') |
| 2893 print 'Runtime Error: %s' % e | 2892 print 'Runtime Error: %s' % e |
| 2894 if opts.output_buildbot_annotations: | 2893 if opts.output_buildbot_annotations: |
| 2895 bisect_utils.OutputAnnotationStepClosed() | 2894 bisect_utils.OutputAnnotationStepClosed() |
| 2896 return 1 | 2895 return 1 |
| 2897 | 2896 |
| 2898 | 2897 |
| 2899 if __name__ == '__main__': | 2898 if __name__ == '__main__': |
| 2900 sys.exit(main()) | 2899 sys.exit(main()) |
| OLD | NEW |