OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 import collections | 7 import collections |
8 import copy | 8 import copy |
9 import json | 9 import json |
10 import optparse | 10 import optparse |
11 import os | 11 import os |
12 import pipes | 12 import pipes |
13 import subprocess | 13 import subprocess |
14 import sys | 14 import sys |
15 | 15 |
| 16 import bb_utils |
| 17 |
16 sys.path.append(os.path.join(os.path.dirname(__file__), '..')) | 18 sys.path.append(os.path.join(os.path.dirname(__file__), '..')) |
17 from pylib import buildbot_report | 19 from pylib import buildbot_report |
18 | 20 |
19 CHROME_SRC = os.path.abspath( | 21 CHROME_SRC = os.path.abspath( |
20 os.path.join(os.path.dirname(__file__), '..', '..', '..')) | 22 os.path.join(os.path.dirname(__file__), '..', '..', '..')) |
21 | 23 |
22 GLOBAL_SLAVE_PROPS = {} | 24 GLOBAL_SLAVE_PROPS = {} |
23 | 25 |
24 BotConfig = collections.namedtuple( | 26 BotConfig = collections.namedtuple( |
25 'BotConfig', ['bot_id', 'bash_funs', 'test_obj', 'slave_props']) | 27 'BotConfig', ['bot_id', 'host_opts', 'test_obj', 'slave_props']) |
26 TestConfig = collections.namedtuple('Tests', ['tests', 'extra_args']) | 28 TestConfig = collections.namedtuple('Tests', ['tests', 'extra_args']) |
27 Command = collections.namedtuple( | 29 Command = collections.namedtuple( |
28 'Command', ['step_name', 'command', 'testing_cmd']) | 30 'Command', ['step_name', 'command', 'testing_cmd']) |
29 | 31 |
| 32 CommandToString = bb_utils.CommandToString |
| 33 |
30 | 34 |
31 def GetCommands(options, bot_config): | 35 def GetCommands(options, bot_config): |
32 """Get a formatted list of commands. | 36 """Get a formatted list of commands. |
33 | 37 |
34 Args: | 38 Args: |
35 options: Options object. | 39 options: Options object. |
36 bot_config: A BotConfig named tuple. | 40 bot_config: A BotConfig named tuple. |
37 Returns: | 41 Returns: |
38 list of Command objects. | 42 list of Command objects. |
39 """ | 43 """ |
40 slave_props = dict(GLOBAL_SLAVE_PROPS) | 44 slave_props = dict(GLOBAL_SLAVE_PROPS) |
41 if bot_config.slave_props: | 45 if bot_config.slave_props: |
42 slave_props.update(bot_config.slave_props) | 46 slave_props.update(bot_config.slave_props) |
43 | 47 |
| 48 slave_properties = json.dumps(slave_props) |
44 property_args = [ | 49 property_args = [ |
45 '--factory-properties=%s' % json.dumps(options.factory_properties), | 50 '--factory-properties=%s' % json.dumps(options.factory_properties), |
46 '--build-properties=%s' % json.dumps(options.build_properties), | 51 '--build-properties=%s' % json.dumps(options.build_properties), |
47 '--slave-properties=%s' % json.dumps(slave_props)] | 52 '--slave-properties=%s' % slave_properties] |
48 | 53 |
49 commands = [] | 54 commands = [] |
50 def WrapWithBash(command): | 55 def WrapWithBash(command): |
51 """Wrap a bash command string with envsetup scripts.""" | 56 """Wrap a bash command string with envsetup scripts.""" |
52 return ['bash', '-exc', '; '.join([ | 57 return ['bash', '-exc', '; '.join([ |
53 '. build/android/buildbot/buildbot_functions.sh', | 58 '. build/android/buildbot/buildbot_functions.sh', |
54 'bb_baseline_setup %s %s' % ( | 59 'bb_baseline_setup %s --slave-properties=%s' % ( |
55 CHROME_SRC, | 60 CHROME_SRC, pipes.quote(slave_properties)), |
56 ' '.join(map(pipes.quote, property_args))), | |
57 command]) | 61 command]) |
58 ] | 62 ] |
59 | 63 |
60 if bot_config.bash_funs: | 64 if bot_config.host_opts: |
61 # bash_funs command does not have a testing mode. | 65 host_cmd = (['build/android/buildbot/bb_host_steps.py'] + |
62 commands.append( | 66 bot_config.host_opts + property_args) |
63 Command(None, WrapWithBash('; '.join(bot_config.bash_funs)), None)) | 67 commands.append(Command( |
| 68 'Host steps', |
| 69 WrapWithBash(' '.join(map(pipes.quote, host_cmd))), host_cmd)) |
64 | 70 |
65 test_obj = bot_config.test_obj | 71 test_obj = bot_config.test_obj |
66 if test_obj: | 72 if test_obj: |
67 run_test_cmd = [ | 73 run_test_cmd = [ |
68 'build/android/buildbot/bb_device_steps.py', '--reboot'] + property_args | 74 'build/android/buildbot/bb_device_steps.py', '--reboot'] + property_args |
69 for test in test_obj.tests: | 75 for test in test_obj.tests: |
70 run_test_cmd.extend(['-f', test]) | 76 run_test_cmd.extend(['-f', test]) |
71 if test_obj.extra_args: | 77 if test_obj.extra_args: |
72 run_test_cmd.extend(test_obj.extra_args) | 78 run_test_cmd.extend(test_obj.extra_args) |
73 commands.append(Command( | 79 commands.append(Command( |
74 'Run tests', | 80 'Run tests', |
75 WrapWithBash(' '.join(map(pipes.quote, run_test_cmd))), run_test_cmd)) | 81 WrapWithBash(' '.join(map(pipes.quote, run_test_cmd))), run_test_cmd)) |
76 | 82 |
77 return commands | 83 return commands |
78 | 84 |
79 | 85 |
80 def GetBotStepMap(): | 86 def GetBotStepMap(): |
81 compile_step = ['bb_compile'] | 87 compile_opt = ['--compile'] |
82 std_build_steps = ['bb_compile', 'bb_zip_build'] | 88 std_host_tests = ['--host-tests=check_webview_licenses,findbugs'] |
83 std_test_steps = ['bb_extract_build'] | 89 std_build_opts = ['--compile', '--zip-build'] |
| 90 std_test_opts = ['--extract-build'] |
84 std_tests = ['ui', 'unit'] | 91 std_tests = ['ui', 'unit'] |
85 flakiness_server = '--upload-to-flakiness-server' | 92 flakiness_server = '--upload-to-flakiness-server' |
86 extra_gyp = 'extra_gyp_defines' | 93 extra_gyp = 'extra_gyp_defines' |
87 | 94 |
88 def B(bot_id, bash_funs, test_obj=None, slave_props=None): | 95 def B(bot_id, bash_funs, test_obj=None, slave_props=None): |
89 return BotConfig(bot_id, bash_funs, test_obj, slave_props) | 96 return BotConfig(bot_id, bash_funs, test_obj, slave_props) |
90 | 97 |
91 def T(tests, extra_args=None): | 98 def T(tests, extra_args=None): |
92 return TestConfig(tests, extra_args) | 99 return TestConfig(tests, extra_args) |
93 | 100 |
94 bot_configs = [ | 101 bot_configs = [ |
95 # Main builders | 102 # Main builders |
96 B('main-builder-dbg', | 103 B('main-builder-dbg', std_build_opts + std_host_tests), |
97 ['bb_check_webview_licenses', 'bb_compile', 'bb_run_findbugs', | 104 B('main-builder-rel', std_build_opts), |
98 'bb_zip_build']), | 105 B('main-clang-builder', compile_opt, slave_props={extra_gyp: 'clang=1'}), |
99 B('main-builder-rel', ['bb_compile', 'bb_zip_build']), | 106 B('main-clobber', compile_opt), |
100 B('main-clang-builder', compile_step, slave_props={extra_gyp: 'clang=1'}), | 107 B('main-tests', std_test_opts, T(std_tests, [flakiness_server])), |
101 B('main-clobber', compile_step), | |
102 B('main-tests', std_test_steps, T(std_tests, [flakiness_server])), | |
103 | 108 |
104 # Other waterfalls | 109 # Other waterfalls |
105 B('asan-builder-tests', compile_step + ['bb_asan_tests_setup'], | 110 B('asan-builder-tests', compile_opt + ['--update-clang'], |
106 T(std_tests, ['--asan']), {extra_gyp: 'asan=1'}), | 111 T(std_tests, ['--asan']), {extra_gyp: 'asan=1'}), |
107 B('chromedriver-fyi-tests-dbg', std_test_steps, | 112 B('chromedriver-fyi-tests-dbg', std_test_opts, |
108 T(['chromedriver'], ['--install=ChromiumTestShell'])), | 113 T(['chromedriver'], ['--install=ChromiumTestShell'])), |
109 B('fyi-builder-dbg', | 114 B('fyi-builder-dbg', |
110 ['bb_check_webview_licenses', 'bb_compile', 'bb_compile_experimental', | 115 std_build_opts + std_host_tests + ['--experimental']), |
111 'bb_run_findbugs', 'bb_zip_build']), | 116 B('fyi-builder-rel', std_build_opts + ['--experimental']), |
112 B('fyi-builder-rel', | 117 B('fyi-tests-dbg-ics-gn', compile_opt + [ '--experimental'], |
113 ['bb_compile', 'bb_compile_experimental', 'bb_zip_build']), | |
114 B('fyi-tests-dbg-ics-gn', ['bb_compile', 'bb_compile_experimental'], | |
115 T(std_tests, ['--experimental', flakiness_server])), | 118 T(std_tests, ['--experimental', flakiness_server])), |
116 B('fyi-tests', std_test_steps, | 119 B('fyi-tests', std_test_opts, |
117 T(std_tests, ['--experimental', flakiness_server])), | 120 T(std_tests, ['--experimental', flakiness_server])), |
118 B('fyi-component-builder-tests-dbg', compile_step, | 121 B('fyi-component-builder-tests-dbg', compile_opt, |
119 T(std_tests, ['--experimental', flakiness_server]), | 122 T(std_tests, ['--experimental', flakiness_server]), |
120 {extra_gyp: 'component=shared_library'}), | 123 {extra_gyp: 'component=shared_library'}), |
121 B('perf-tests-rel', std_test_steps, T([], ['--install=ContentShell'])), | 124 B('perf-tests-rel', std_test_opts, T([], ['--install=ContentShell'])), |
122 B('webkit-latest-webkit-tests', std_test_steps, | 125 B('webkit-latest-webkit-tests', std_test_opts, |
123 T(['webkit_layout', 'webkit'])), | 126 T(['webkit_layout', 'webkit'])), |
124 B('webkit-latest-contentshell', compile_step, T(['webkit_layout'])), | 127 B('webkit-latest-contentshell', compile_opt, T(['webkit_layout'])), |
125 B('builder-unit-tests', compile_step, T(['unit'])), | 128 B('builder-unit-tests', compile_opt, T(['unit'])), |
126 | 129 |
127 # Generic builder config (for substring match). | 130 # Generic builder config (for substring match). |
128 B('builder', std_build_steps), | 131 B('builder', std_build_opts), |
129 ] | 132 ] |
130 | 133 |
131 bot_map = dict((config.bot_id, config) for config in bot_configs) | 134 bot_map = dict((config.bot_id, config) for config in bot_configs) |
132 | 135 |
133 # These bots have identical configuration to ones defined earlier. | 136 # These bots have identical configuration to ones defined earlier. |
134 copy_map = [ | 137 copy_map = [ |
135 ('lkgr-clobber', 'main-clobber'), | 138 ('lkgr-clobber', 'main-clobber'), |
136 ('try-builder-dbg', 'main-builder-dbg'), | 139 ('try-builder-dbg', 'main-builder-dbg'), |
137 ('try-builder-rel', 'main-builder-rel'), | 140 ('try-builder-rel', 'main-builder-rel'), |
138 ('try-clang-builder', 'main-clang-builder'), | 141 ('try-clang-builder', 'main-clang-builder'), |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 if substring_matches: | 193 if substring_matches: |
191 max_id = max(substring_matches, key=len) | 194 max_id = max(substring_matches, key=len) |
192 print 'Using config from id="%s" (substring match).' % max_id | 195 print 'Using config from id="%s" (substring match).' % max_id |
193 bot_config = bot_map[max_id] | 196 bot_config = bot_map[max_id] |
194 if not bot_config: | 197 if not bot_config: |
195 print 'Error: config for id="%s" cannot be inferred.' % bot_id | 198 print 'Error: config for id="%s" cannot be inferred.' % bot_id |
196 return 1 | 199 return 1 |
197 | 200 |
198 print 'Using config:', bot_config | 201 print 'Using config:', bot_config |
199 | 202 |
200 def CommandToString(command): | |
201 """Returns quoted command that can be run in bash shell.""" | |
202 return ' '.join(map(pipes.quote, command)) | |
203 | |
204 command_objs = GetCommands(options, bot_config) | 203 command_objs = GetCommands(options, bot_config) |
205 for command_obj in command_objs: | 204 for command_obj in command_objs: |
206 print 'Will run:', CommandToString(command_obj.command) | 205 print 'Will run:', CommandToString(command_obj.command) |
207 | 206 |
208 for command_obj in command_objs: | 207 for command_obj in command_objs: |
209 if command_obj.step_name: | 208 if command_obj.step_name: |
210 buildbot_report.PrintNamedStep(command_obj.step_name) | 209 buildbot_report.PrintNamedStep(command_obj.step_name) |
211 command = command_obj.command | 210 command = command_obj.command |
212 print CommandToString(command) | 211 print CommandToString(command) |
213 sys.stdout.flush() | 212 sys.stdout.flush() |
214 env = None | 213 env = None |
215 if options.TESTING: | 214 if options.TESTING: |
216 if not command_obj.testing_cmd: | 215 if not command_obj.testing_cmd: |
217 continue | 216 continue |
218 return_code = subprocess.call( | 217 return_code = subprocess.call( |
219 command_obj.testing_cmd, | 218 command_obj.testing_cmd, |
220 cwd=CHROME_SRC, | 219 cwd=CHROME_SRC, |
221 env=dict(os.environ, BUILDBOT_TESTING='1')) | 220 env=dict(os.environ, BUILDBOT_TESTING='1')) |
222 else: | 221 else: |
223 return_code = subprocess.call(command, cwd=CHROME_SRC, env=env) | 222 return_code = subprocess.call(command, cwd=CHROME_SRC, env=env) |
224 if return_code != 0: | 223 if return_code != 0: |
225 return return_code | 224 return return_code |
226 | 225 |
227 | 226 |
228 if __name__ == '__main__': | 227 if __name__ == '__main__': |
229 sys.exit(main(sys.argv)) | 228 sys.exit(main(sys.argv)) |
OLD | NEW |