Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1137)

Side by Side Diff: scripts/slave/recipes/skia/swarm_trigger.py

Issue 1829423002: Skia: Run recipes as swarming tasks (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/build.git@swarm_fix
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 5
6 # Recipe module for Skia Swarming trigger. 6 # Recipe module for Skia Swarming trigger.
7 7
8 8
9 import json 9 import json
10 10
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 dimensions['gpu'] = 'none' 70 dimensions['gpu'] = 'none'
71 # TODO(borenet): Add appropriate CPU dimension(s). 71 # TODO(borenet): Add appropriate CPU dimension(s).
72 #dimensions['cpu'] = builder_cfg['cpu_or_gpu_value'] 72 #dimensions['cpu'] = builder_cfg['cpu_or_gpu_value']
73 else: # pragma: no cover 73 else: # pragma: no cover
74 dimensions['gpu'] = builder_cfg['cpu_or_gpu_value'] 74 dimensions['gpu'] = builder_cfg['cpu_or_gpu_value']
75 else: 75 else:
76 dimensions['gpu'] = 'none' 76 dimensions['gpu'] = 'none'
77 return dimensions 77 return dimensions
78 78
79 79
80 def trigger_task(api, task_name, builder, builder_cfg, got_revision,
81 infrabots_dir, store_output=False, extra_isolate_hashes=None):
82 """Trigger the given bot to run as a Swarming task."""
83 # TODO(borenet): We're using Swarming directly to run the recipe through
84 # Kitchen. Once it's possible to track the state of a Buildbucket build,
85 # we should switch to use the trigger recipe module instead.
86
87 if not extra_isolate_hashes:
88 extra_isolate_hashes = []
89 # Kitchen binaries.
90 extra_isolate_hashes.append('8ba778e47df2a9b46355cf72c58b58fdb1a7f350')
rmistry 2016/03/28 12:52:16 Document where you got this hash from?
91
92 properties = {
93 'buildername': builder,
94 'mastername': api.properties['mastername'],
95 'buildnumber': api.properties['buildnumber'],
96 'reason': 'Triggered by Skia swarm_trigger Recipe',
97 'revision': got_revision,
98 'slavename': api.properties['slavename'],
99 'swarm_out_dir': '${ISOLATED_OUTDIR}',
100 }
101 if builder_cfg['is_trybot']:
102 properties['issue'] = str(api.properties['issue'])
103 properties['patchset'] = str(api.properties['patchset'])
104 properties['rietveld'] = api.properties['rietveld']
105
106 idempotent = False
107 store_output = True
108 if task_name == 'compile':
109 idempotent = True
110 store_output = False
111
112 extra_args = [
113 'cook',
114 '-repository', 'https://chromium.googlesource.com/chromium/tools/build',
115 '-revision', '',
116 '-recipe', 'skia/swarm_%s' % task_name,
117 '-properties', json.dumps(properties),
118 '-workdir', '../../..',
119 ]
120
121 isolate_base_dir = api.path['slave_build']
122 dimensions = swarm_dimensions(builder_cfg)
123 isolate_blacklist = ['.git', 'out', '*.pyc']
124 isolate_vars = {}
125
126 return api.skia_swarming.isolate_and_trigger_task(
127 infrabots_dir.join('%s_skia.isolate' % task_name),
128 isolate_base_dir,
129 '%s_skia' % task_name,
130 isolate_vars,
131 dimensions,
132 isolate_blacklist=isolate_blacklist,
133 extra_isolate_hashes=extra_isolate_hashes,
134 idempotent=idempotent,
135 store_output=store_output,
136 extra_args=extra_args)
137
138
80 def checkout_steps(api): 139 def checkout_steps(api):
81 """Run the steps to obtain a checkout of Skia.""" 140 """Run the steps to obtain a checkout of Skia."""
82 gclient_cfg = api.gclient.make_config(CACHE_DIR=None) 141 gclient_cfg = api.gclient.make_config(CACHE_DIR=None)
83 skia = gclient_cfg.solutions.add() 142 skia = gclient_cfg.solutions.add()
84 skia.name = 'skia' 143 skia.name = 'skia'
85 skia.managed = False 144 skia.managed = False
86 skia.url = 'https://skia.googlesource.com/skia.git' 145 skia.url = 'https://skia.googlesource.com/skia.git'
87 skia.revision = api.properties.get('revision') or 'origin/master' 146 skia.revision = api.properties.get('revision') or 'origin/master'
88 api.skia.update_repo(skia) 147 api.skia.update_repo(skia)
89 148
90 # Run 'gclient sync'. 149 # Run 'gclient sync'.
91 gclient_cfg.got_revision_mapping['skia'] = 'got_revision' 150 gclient_cfg.got_revision_mapping['skia'] = 'got_revision'
92 gclient_cfg.target_os.add('llvm') 151 gclient_cfg.target_os.add('llvm')
93 update_step = api.gclient.checkout(gclient_config=gclient_cfg) 152 update_step = api.gclient.checkout(gclient_config=gclient_cfg)
94 153
95 got_revision = update_step.presentation.properties['got_revision'] 154 got_revision = update_step.presentation.properties['got_revision']
96 api.tryserver.maybe_apply_issue() 155 api.tryserver.maybe_apply_issue()
97 return got_revision 156 return got_revision
98 157
99 158
100 def compile_steps_swarm(api, infrabots_dir, builder_cfg): 159 def compile_steps_swarm(api, builder_cfg, got_revision, infrabots_dir):
101 builder_name = derive_compile_bot_name(api.properties['buildername'], 160 builder_name = derive_compile_bot_name(api.properties['buildername'],
102 builder_cfg) 161 builder_cfg)
103 # Windows bots require a toolchain. 162 # Windows bots require a toolchain.
104 extra_hashes = None 163 extra_hashes = None
105 if 'Win' in builder_name: 164 if 'Win' in builder_name:
106 test_data = '''{ 165 test_data = '''{
107 "2013": "705384d88f80da637eb367e5acc6f315c0e1db2f", 166 "2013": "705384d88f80da637eb367e5acc6f315c0e1db2f",
108 "2015": "38380d77eec9164e5818ae45e2915a6f22d60e85" 167 "2015": "38380d77eec9164e5818ae45e2915a6f22d60e85"
109 }''' 168 }'''
110 hash_file = infrabots_dir.join('win_toolchain_hash.json') 169 hash_file = infrabots_dir.join('win_toolchain_hash.json')
111 j = api.skia._readfile(hash_file, 170 j = api.skia._readfile(hash_file,
112 name='Read win_toolchain_hash.json', 171 name='Read win_toolchain_hash.json',
113 test_data=test_data).rstrip() 172 test_data=test_data).rstrip()
114 hashes = json.loads(j) 173 hashes = json.loads(j)
115 extra_hashes = [hashes['2013']] 174 extra_hashes = [hashes['2013']]
116 175
117 # Isolate the inputs and trigger the task. 176 task = trigger_task(
118 isolate_path = infrabots_dir.join('compile_skia.isolate') 177 api,
119 isolate_vars = {'BUILDER_NAME': builder_name} 178 'compile',
120 dimensions = swarm_dimensions(builder_cfg) 179 builder_name,
121 task = api.skia_swarming.isolate_and_trigger_task( 180 builder_cfg,
122 isolate_path, infrabots_dir, 'compile_skia', isolate_vars, 181 got_revision,
123 dimensions, idempotent=True, store_output=False, 182 infrabots_dir,
124 isolate_blacklist=['.git', 'out', '*.pyc'],
125 extra_isolate_hashes=extra_hashes) 183 extra_isolate_hashes=extra_hashes)
126 184
127 # Wait for compile to finish, record the results hash. 185 # Wait for compile to finish, record the results hash.
128 return api.skia_swarming.collect_swarming_task_isolate_hash(task) 186 return api.skia_swarming.collect_swarming_task_isolate_hash(task)
129 187
130 188
131 def download_images(api, infrabots_dir): 189 def download_images(api, infrabots_dir):
132 api.python('Download images', 190 api.python('Download images',
133 script=infrabots_dir.join('download_images.py'), 191 script=infrabots_dir.join('download_images.py'),
134 env=api.skia.gsutil_env('chromium-skia-gm.boto')) 192 env=api.skia.gsutil_env('chromium-skia-gm.boto'))
135 193
136 194
137 def download_skps(api, infrabots_dir): 195 def download_skps(api, infrabots_dir):
138 api.python('Download SKPs', 196 api.python('Download SKPs',
139 script=infrabots_dir.join('download_skps.py'), 197 script=infrabots_dir.join('download_skps.py'),
140 env=api.skia.gsutil_env('chromium-skia-gm.boto')) 198 env=api.skia.gsutil_env('chromium-skia-gm.boto'))
141 199
142 200
143 def perf_steps_trigger(api, infrabots_dir, compile_hash, dimensions, 201 def perf_steps_trigger(api, builder_cfg, got_revision, infrabots_dir,
144 got_revision, is_trybot): 202 compile_hash):
145 """Trigger perf tests via Swarming.""" 203 """Trigger perf tests via Swarming."""
146 # Swarm the tests. 204 return trigger_task(
147 task_name = 'perf_skia' 205 api,
148 isolate_path = infrabots_dir.join('%s.isolate' % task_name) 206 'perf',
149 issue = str(api.properties['issue']) if is_trybot else '' 207 api.properties['buildername'],
150 patchset = str(api.properties['patchset']) if is_trybot else '' 208 builder_cfg,
151 isolate_vars = { 209 got_revision,
152 'MASTER_NAME': api.properties['mastername'], 210 infrabots_dir,
153 'BUILDER_NAME': api.properties['buildername'], 211 extra_isolate_hashes=[compile_hash])
154 'BUILD_NUMBER': str(api.properties['buildnumber']),
155 'SLAVE_NAME': api.properties['slavename'],
156 'REVISION': got_revision,
157 'ISSUE': issue,
158 'PATCHSET': patchset,
159 }
160 return api.skia_swarming.isolate_and_trigger_task(
161 isolate_path, infrabots_dir, task_name, isolate_vars, dimensions,
162 isolate_blacklist=['.git'], extra_isolate_hashes=[compile_hash])
163 212
164 213
165 def perf_steps_collect(api, task, upload_perf_results, got_revision, 214 def perf_steps_collect(api, task, upload_perf_results, got_revision,
166 is_trybot): 215 is_trybot):
167 """Wait for perf steps to finish and upload results.""" 216 """Wait for perf steps to finish and upload results."""
168 # Wait for nanobench to finish, download the results. 217 # Wait for nanobench to finish, download the results.
169 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) 218 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True)
170 api.skia_swarming.collect_swarming_task(task) 219 api.skia_swarming.collect_swarming_task(task)
171 220
172 # Upload the results. 221 # Upload the results.
(...skipping 20 matching lines...) Expand all
193 upload_args.append(api.properties['issue']) 242 upload_args.append(api.properties['issue'])
194 api.python( 243 api.python(
195 'Upload perf results', 244 'Upload perf results',
196 script=api.skia.resource('upload_bench_results.py'), 245 script=api.skia.resource('upload_bench_results.py'),
197 args=upload_args, 246 args=upload_args,
198 cwd=api.path['checkout'], 247 cwd=api.path['checkout'],
199 env=api.skia.gsutil_env('chromium-skia-gm.boto'), 248 env=api.skia.gsutil_env('chromium-skia-gm.boto'),
200 infra_step=True) 249 infra_step=True)
201 250
202 251
203 def test_steps_trigger(api, infrabots_dir, compile_hash, dimensions, 252 def test_steps_trigger(api, builder_cfg, got_revision, infrabots_dir,
204 got_revision, is_trybot): 253 compile_hash):
205 """Trigger DM via Swarming.""" 254 """Trigger DM via Swarming."""
206 # Swarm the tests. 255 return trigger_task(
207 task_name = 'test_skia' 256 api,
208 isolate_path = infrabots_dir.join('%s.isolate' % task_name) 257 'test',
209 issue = str(api.properties['issue']) if is_trybot else '' 258 api.properties['buildername'],
210 patchset = str(api.properties['patchset']) if is_trybot else '' 259 builder_cfg,
211 isolate_vars = { 260 got_revision,
212 'MASTER_NAME': api.properties['mastername'], 261 infrabots_dir,
213 'BUILDER_NAME': api.properties['buildername'], 262 extra_isolate_hashes=[compile_hash])
214 'BUILD_NUMBER': str(api.properties['buildnumber']),
215 'SLAVE_NAME': api.properties['slavename'],
216 'REVISION': got_revision,
217 'ISSUE': issue,
218 'PATCHSET': patchset,
219 }
220
221 return api.skia_swarming.isolate_and_trigger_task(
222 isolate_path, infrabots_dir, task_name, isolate_vars, dimensions,
223 isolate_blacklist=['.git'], extra_isolate_hashes=[compile_hash])
224 263
225 264
226 def test_steps_collect(api, task, upload_dm_results, got_revision, is_trybot): 265 def test_steps_collect(api, task, upload_dm_results, got_revision, is_trybot):
227 """Collect the DM results from Swarming.""" 266 """Collect the DM results from Swarming."""
228 # Wait for tests to finish, download the results. 267 # Wait for tests to finish, download the results.
229 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) 268 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True)
230 api.skia_swarming.collect_swarming_task(task) 269 api.skia_swarming.collect_swarming_task(task)
231 270
232 # Upload the results. 271 # Upload the results.
233 if upload_dm_results: 272 if upload_dm_results:
(...skipping 23 matching lines...) Expand all
257 got_revision = checkout_steps(api) 296 got_revision = checkout_steps(api)
258 builder_spec = api.skia.get_builder_spec(api.path['checkout'], 297 builder_spec = api.skia.get_builder_spec(api.path['checkout'],
259 api.properties['buildername']) 298 api.properties['buildername'])
260 builder_cfg = builder_spec['builder_cfg'] 299 builder_cfg = builder_spec['builder_cfg']
261 infrabots_dir = api.path['checkout'].join('infra', 'bots') 300 infrabots_dir = api.path['checkout'].join('infra', 'bots')
262 301
263 api.skia_swarming.setup( 302 api.skia_swarming.setup(
264 api.path['checkout'].join('infra', 'bots', 'tools', 'luci-go'), 303 api.path['checkout'].join('infra', 'bots', 'tools', 'luci-go'),
265 swarming_rev='') 304 swarming_rev='')
266 305
267 compile_hash = compile_steps_swarm(api, infrabots_dir, builder_cfg) 306 compile_hash = compile_steps_swarm(api, builder_cfg, got_revision,
307 infrabots_dir)
268 308
269 do_test_steps = builder_spec['do_test_steps'] 309 do_test_steps = builder_spec['do_test_steps']
270 do_perf_steps = builder_spec['do_perf_steps'] 310 do_perf_steps = builder_spec['do_perf_steps']
271 is_trybot = builder_cfg['is_trybot']
272 311
273 if not (do_test_steps or do_perf_steps): 312 if not (do_test_steps or do_perf_steps):
274 return 313 return
275 314
276 download_skps(api, infrabots_dir) 315 download_skps(api, infrabots_dir)
277 download_images(api, infrabots_dir) 316 download_images(api, infrabots_dir)
278 317
279 dimensions = swarm_dimensions(builder_cfg) 318 dimensions = swarm_dimensions(builder_cfg)
280 319
281 test_task = None 320 test_task = None
282 perf_task = None 321 perf_task = None
283 if do_test_steps: 322 if do_test_steps:
284 test_task = test_steps_trigger(api, infrabots_dir, compile_hash, dimensions, 323 test_task = test_steps_trigger(api, builder_cfg, got_revision,
285 got_revision, is_trybot) 324 infrabots_dir, compile_hash)
286 if do_perf_steps: 325 if do_perf_steps:
287 perf_task = perf_steps_trigger(api, infrabots_dir, compile_hash, dimensions, 326 perf_task = perf_steps_trigger(api, builder_cfg, got_revision,
288 got_revision, is_trybot) 327 infrabots_dir, compile_hash)
328 is_trybot = builder_cfg['is_trybot']
289 if test_task: 329 if test_task:
290 test_steps_collect(api, test_task, builder_spec['upload_dm_results'], 330 test_steps_collect(api, test_task, builder_spec['upload_dm_results'],
291 got_revision, is_trybot) 331 got_revision, is_trybot)
292 if perf_task: 332 if perf_task:
293 perf_steps_collect(api, perf_task, builder_spec['upload_perf_results'], 333 perf_steps_collect(api, perf_task, builder_spec['upload_perf_results'],
294 got_revision, is_trybot) 334 got_revision, is_trybot)
295 335
296 336
297 def GenTests(api): 337 def GenTests(api):
298 for mastername, slaves in TEST_BUILDERS.iteritems(): 338 for mastername, slaves in TEST_BUILDERS.iteritems():
299 for slavename, builders_by_slave in slaves.iteritems(): 339 for slavename, builders_by_slave in slaves.iteritems():
300 for builder in builders_by_slave: 340 for builder in builders_by_slave:
301 test = ( 341 test = (
302 api.test(builder) + 342 api.test(builder) +
303 api.properties(buildername=builder, 343 api.properties(buildername=builder,
304 mastername=mastername, 344 mastername=mastername,
305 slavename=slavename, 345 slavename=slavename,
306 buildnumber=5, 346 buildnumber=5,
307 revision='abc123') + 347 revision='abc123') +
308 api.path.exists( 348 api.path.exists(
309 api.path['slave_build'].join('skia'), 349 api.path['slave_build'].join('skia'),
310 api.path['slave_build'].join('tmp', 'uninteresting_hashes.txt') 350 api.path['slave_build'].join('tmp', 'uninteresting_hashes.txt')
311 ) 351 )
312 ) 352 )
313 if 'Trybot' in builder: 353 if 'Trybot' in builder:
314 test += api.properties(issue=500, 354 test += api.properties(issue=500,
315 patchset=1, 355 patchset=1,
316 rietveld='https://codereview.chromium.org') 356 rietveld='https://codereview.chromium.org')
317 if 'Win' in builder: 357 test += api.step_data(
318 test += api.step_data( 358 'upload new .isolated file for compile_skia',
319 'upload new .isolated file for compile_skia', 359 stdout=api.raw_io.output('def456 XYZ.isolated'))
320 stdout=api.raw_io.output('def456 XYZ.isolated'))
321 if 'Test' in builder: 360 if 'Test' in builder:
322 test += api.step_data( 361 test += api.step_data(
323 'upload new .isolated file for test_skia', 362 'upload new .isolated file for test_skia',
324 stdout=api.raw_io.output('def456 XYZ.isolated')) 363 stdout=api.raw_io.output('def456 XYZ.isolated'))
325 if ('Test' in builder and 'Debug' in builder) or 'Perf' in builder: 364 if ('Test' in builder and 'Debug' in builder) or 'Perf' in builder:
326 test += api.step_data( 365 test += api.step_data(
327 'upload new .isolated file for perf_skia', 366 'upload new .isolated file for perf_skia',
328 stdout=api.raw_io.output('def456 XYZ.isolated')) 367 stdout=api.raw_io.output('def456 XYZ.isolated'))
329 368
330 yield test 369 yield test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698