OLD | NEW |
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 |
11 | 11 |
12 DEPS = [ | 12 DEPS = [ |
13 'depot_tools/gclient', | 13 'depot_tools/gclient', |
14 'depot_tools/git', | 14 'depot_tools/git', |
| 15 'depot_tools/infra_paths', |
15 'depot_tools/tryserver', | 16 'depot_tools/tryserver', |
16 'file', | 17 'file', |
17 'gsutil', | 18 'gsutil', |
18 'recipe_engine/path', | 19 'recipe_engine/path', |
19 'recipe_engine/properties', | 20 'recipe_engine/properties', |
20 'recipe_engine/python', | 21 'recipe_engine/python', |
21 'recipe_engine/raw_io', | 22 'recipe_engine/raw_io', |
22 'recipe_engine/time', | 23 'recipe_engine/time', |
23 'skia', | 24 'skia', |
24 'skia_swarming', | 25 'skia_swarming', |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 else: | 112 else: |
112 dimensions['gpu'] = 'none' | 113 dimensions['gpu'] = 'none' |
113 return dimensions | 114 return dimensions |
114 | 115 |
115 | 116 |
116 def isolate_recipes(api): | 117 def isolate_recipes(api): |
117 """Isolate the recipes.""" | 118 """Isolate the recipes.""" |
118 # This directory tends to be missing for some reason. | 119 # This directory tends to be missing for some reason. |
119 api.file.makedirs( | 120 api.file.makedirs( |
120 'third_party_infra', | 121 'third_party_infra', |
121 api.path['build'].join('third_party', 'infra'), | 122 api.infra_paths['build'].join('third_party', 'infra'), |
122 infra_step=True) | 123 infra_step=True) |
123 skia_recipes_dir = api.path['build'].join( | 124 skia_recipes_dir = api.infra_paths['build'].join( |
124 'scripts', 'slave', 'recipes', 'skia') | 125 'scripts', 'slave', 'recipes', 'skia') |
125 api.skia_swarming.create_isolated_gen_json( | 126 api.skia_swarming.create_isolated_gen_json( |
126 skia_recipes_dir.join('swarm_recipe.isolate'), | 127 skia_recipes_dir.join('swarm_recipe.isolate'), |
127 skia_recipes_dir, | 128 skia_recipes_dir, |
128 'linux', | 129 'linux', |
129 'isolate_recipes', | 130 'isolate_recipes', |
130 {}) | 131 {}) |
131 return api.skia_swarming.batcharchive(['isolate_recipes'])[0][1] | 132 return api.skia_swarming.batcharchive(['isolate_recipes'])[0][1] |
132 | 133 |
133 | 134 |
(...skipping 21 matching lines...) Expand all Loading... |
155 properties['patchset'] = str(api.properties['patchset']) | 156 properties['patchset'] = str(api.properties['patchset']) |
156 properties['rietveld'] = api.properties['rietveld'] | 157 properties['rietveld'] = api.properties['rietveld'] |
157 | 158 |
158 extra_args = [ | 159 extra_args = [ |
159 '--workdir', '../../..', | 160 '--workdir', '../../..', |
160 'skia/swarm_%s' % task_name, | 161 'skia/swarm_%s' % task_name, |
161 ] | 162 ] |
162 for k, v in properties.iteritems(): | 163 for k, v in properties.iteritems(): |
163 extra_args.append('%s=%s' % (k, v)) | 164 extra_args.append('%s=%s' % (k, v)) |
164 | 165 |
165 isolate_base_dir = api.path['slave_build'] | 166 isolate_base_dir = api.infra_paths['slave_build'] |
166 dimensions = swarm_dimensions(builder_spec) | 167 dimensions = swarm_dimensions(builder_spec) |
167 isolate_blacklist = ['.git', 'out', '*.pyc'] | 168 isolate_blacklist = ['.git', 'out', '*.pyc'] |
168 isolate_vars = { | 169 isolate_vars = { |
169 'BUILD': api.path['build'], | 170 'BUILD': api.infra_paths['build'], |
170 'WORKDIR': api.path['slave_build'], | 171 'WORKDIR': api.infra_paths['slave_build'], |
171 } | 172 } |
172 | 173 |
173 isolate_file = '%s_skia.isolate' % task_name | 174 isolate_file = '%s_skia.isolate' % task_name |
174 if 'Coverage' == builder_cfg['configuration']: | 175 if 'Coverage' == builder_cfg['configuration']: |
175 isolate_file = 'coverage_skia.isolate' | 176 isolate_file = 'coverage_skia.isolate' |
176 return api.skia_swarming.isolate_and_trigger_task( | 177 return api.skia_swarming.isolate_and_trigger_task( |
177 infrabots_dir.join(isolate_file), | 178 infrabots_dir.join(isolate_file), |
178 isolate_base_dir, | 179 isolate_base_dir, |
179 '%s_skia' % task_name, | 180 '%s_skia' % task_name, |
180 isolate_vars, | 181 isolate_vars, |
(...skipping 28 matching lines...) Expand all Loading... |
209 return got_revision | 210 return got_revision |
210 | 211 |
211 | 212 |
212 def compile_steps_swarm(api, builder_spec, got_revision, infrabots_dir, | 213 def compile_steps_swarm(api, builder_spec, got_revision, infrabots_dir, |
213 extra_isolate_hashes): | 214 extra_isolate_hashes): |
214 builder_name = derive_compile_bot_name(api.properties['buildername'], | 215 builder_name = derive_compile_bot_name(api.properties['buildername'], |
215 builder_spec) | 216 builder_spec) |
216 compile_builder_spec = builder_spec | 217 compile_builder_spec = builder_spec |
217 if builder_name != api.properties['buildername']: | 218 if builder_name != api.properties['buildername']: |
218 compile_builder_spec = api.skia.get_builder_spec( | 219 compile_builder_spec = api.skia.get_builder_spec( |
219 api.path['slave_build'].join('skia'), builder_name) | 220 api.infra_paths['slave_build'].join('skia'), builder_name) |
220 # Windows bots require a toolchain. | 221 # Windows bots require a toolchain. |
221 extra_hashes = extra_isolate_hashes[:] | 222 extra_hashes = extra_isolate_hashes[:] |
222 if 'Win' in builder_name: | 223 if 'Win' in builder_name: |
223 test_data = '''{ | 224 test_data = '''{ |
224 "2013": "705384d88f80da637eb367e5acc6f315c0e1db2f", | 225 "2013": "705384d88f80da637eb367e5acc6f315c0e1db2f", |
225 "2015": "38380d77eec9164e5818ae45e2915a6f22d60e85" | 226 "2015": "38380d77eec9164e5818ae45e2915a6f22d60e85" |
226 }''' | 227 }''' |
227 hash_file = infrabots_dir.join('win_toolchain_hash.json') | 228 hash_file = infrabots_dir.join('win_toolchain_hash.json') |
228 j = api.skia._readfile(hash_file, | 229 j = api.skia._readfile(hash_file, |
229 name='Read win_toolchain_hash.json', | 230 name='Read win_toolchain_hash.json', |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 | 286 |
286 def perf_steps_collect(api, task, upload_perf_results, got_revision, | 287 def perf_steps_collect(api, task, upload_perf_results, got_revision, |
287 is_trybot): | 288 is_trybot): |
288 """Wait for perf steps to finish and upload results.""" | 289 """Wait for perf steps to finish and upload results.""" |
289 # Wait for nanobench to finish, download the results. | 290 # Wait for nanobench to finish, download the results. |
290 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) | 291 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) |
291 api.skia_swarming.collect_swarming_task(task) | 292 api.skia_swarming.collect_swarming_task(task) |
292 | 293 |
293 # Upload the results. | 294 # Upload the results. |
294 if upload_perf_results: | 295 if upload_perf_results: |
295 perf_data_dir = api.path['slave_build'].join( | 296 perf_data_dir = api.infra_paths['slave_build'].join( |
296 'perfdata', api.properties['buildername'], 'data') | 297 'perfdata', api.properties['buildername'], 'data') |
297 git_timestamp = api.git.get_timestamp(test_data='1408633190', | 298 git_timestamp = api.git.get_timestamp(test_data='1408633190', |
298 infra_step=True) | 299 infra_step=True) |
299 api.file.rmtree('perf_dir', perf_data_dir, infra_step=True) | 300 api.file.rmtree('perf_dir', perf_data_dir, infra_step=True) |
300 api.file.makedirs('perf_dir', perf_data_dir, infra_step=True) | 301 api.file.makedirs('perf_dir', perf_data_dir, infra_step=True) |
301 src_results_file = task.task_output_dir.join( | 302 src_results_file = task.task_output_dir.join( |
302 '0', 'perfdata', api.properties['buildername'], 'data', | 303 '0', 'perfdata', api.properties['buildername'], 'data', |
303 'nanobench_%s.json' % got_revision) | 304 'nanobench_%s.json' % got_revision) |
304 dst_results_file = perf_data_dir.join( | 305 dst_results_file = perf_data_dir.join( |
305 'nanobench_%s_%s.json' % (got_revision, git_timestamp)) | 306 'nanobench_%s_%s.json' % (got_revision, git_timestamp)) |
306 api.file.copy('perf_results', src_results_file, dst_results_file, | 307 api.file.copy('perf_results', src_results_file, dst_results_file, |
307 infra_step=True) | 308 infra_step=True) |
308 | 309 |
309 gsutil_path = api.path['depot_tools'].join( | 310 gsutil_path = api.infra_paths['depot_tools'].join( |
310 'third_party', 'gsutil', 'gsutil') | 311 'third_party', 'gsutil', 'gsutil') |
311 upload_args = [api.properties['buildername'], api.properties['buildnumber'], | 312 upload_args = [api.properties['buildername'], api.properties['buildnumber'], |
312 perf_data_dir, got_revision, gsutil_path] | 313 perf_data_dir, got_revision, gsutil_path] |
313 if is_trybot: | 314 if is_trybot: |
314 upload_args.append(api.properties['issue']) | 315 upload_args.append(api.properties['issue']) |
315 api.python( | 316 api.python( |
316 'Upload perf results', | 317 'Upload perf results', |
317 script=api.skia.resource('upload_bench_results.py'), | 318 script=api.skia.resource('upload_bench_results.py'), |
318 args=upload_args, | 319 args=upload_args, |
319 cwd=api.path['checkout'], | 320 cwd=api.path['checkout'], |
(...skipping 21 matching lines...) Expand all Loading... |
341 | 342 |
342 def test_steps_collect(api, task, upload_dm_results, got_revision, is_trybot, | 343 def test_steps_collect(api, task, upload_dm_results, got_revision, is_trybot, |
343 builder_cfg): | 344 builder_cfg): |
344 """Collect the test results from Swarming.""" | 345 """Collect the test results from Swarming.""" |
345 # Wait for tests to finish, download the results. | 346 # Wait for tests to finish, download the results. |
346 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) | 347 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) |
347 api.skia_swarming.collect_swarming_task(task) | 348 api.skia_swarming.collect_swarming_task(task) |
348 | 349 |
349 # Upload the results. | 350 # Upload the results. |
350 if upload_dm_results: | 351 if upload_dm_results: |
351 dm_dir = api.path['slave_build'].join('dm') | 352 dm_dir = api.infra_paths['slave_build'].join('dm') |
352 dm_src = task.task_output_dir.join('0', 'dm') | 353 dm_src = task.task_output_dir.join('0', 'dm') |
353 api.file.rmtree('dm_dir', dm_dir, infra_step=True) | 354 api.file.rmtree('dm_dir', dm_dir, infra_step=True) |
354 api.file.copytree('dm_dir', dm_src, dm_dir, infra_step=True) | 355 api.file.copytree('dm_dir', dm_src, dm_dir, infra_step=True) |
355 | 356 |
356 # Upload them to Google Storage. | 357 # Upload them to Google Storage. |
357 api.python( | 358 api.python( |
358 'Upload DM Results', | 359 'Upload DM Results', |
359 script=api.skia.resource('upload_dm_results.py'), | 360 script=api.skia.resource('upload_dm_results.py'), |
360 args=[ | 361 args=[ |
361 dm_dir, | 362 dm_dir, |
362 got_revision, | 363 got_revision, |
363 api.properties['buildername'], | 364 api.properties['buildername'], |
364 api.properties['buildnumber'], | 365 api.properties['buildnumber'], |
365 api.properties['issue'] if is_trybot else '', | 366 api.properties['issue'] if is_trybot else '', |
366 api.path['slave_build'].join('skia', 'common', 'py', 'utils'), | 367 api.infra_paths['slave_build'].join('skia', 'common', 'py', 'utils'), |
367 ], | 368 ], |
368 cwd=api.path['checkout'], | 369 cwd=api.path['checkout'], |
369 env=api.skia.gsutil_env('chromium-skia-gm.boto'), | 370 env=api.skia.gsutil_env('chromium-skia-gm.boto'), |
370 infra_step=True) | 371 infra_step=True) |
371 | 372 |
372 if builder_cfg['configuration'] == 'Coverage': | 373 if builder_cfg['configuration'] == 'Coverage': |
373 upload_coverage_results(api, task, got_revision, is_trybot) | 374 upload_coverage_results(api, task, got_revision, is_trybot) |
374 | 375 |
375 | 376 |
376 def upload_coverage_results(api, task, got_revision, is_trybot): | 377 def upload_coverage_results(api, task, got_revision, is_trybot): |
(...skipping 26 matching lines...) Expand all Loading... |
403 # into the nanobench_${git_hash}_${timestamp}.json file | 404 # into the nanobench_${git_hash}_${timestamp}.json file |
404 # upload_bench_results.py expects. | 405 # upload_bench_results.py expects. |
405 src_nano_file = results_dir.join('nanobench_%s.json' % got_revision) | 406 src_nano_file = results_dir.join('nanobench_%s.json' % got_revision) |
406 dst_nano_file = results_dir.join( | 407 dst_nano_file = results_dir.join( |
407 'nanobench_%s_%s.json' % (got_revision, git_timestamp)) | 408 'nanobench_%s_%s.json' % (got_revision, git_timestamp)) |
408 api.file.copy('nanobench JSON', src_nano_file, dst_nano_file, | 409 api.file.copy('nanobench JSON', src_nano_file, dst_nano_file, |
409 infra_step=True) | 410 infra_step=True) |
410 api.file.remove('old nanobench JSON', src_nano_file) | 411 api.file.remove('old nanobench JSON', src_nano_file) |
411 | 412 |
412 # Upload nanobench JSON data. | 413 # Upload nanobench JSON data. |
413 gsutil_path = api.path['depot_tools'].join( | 414 gsutil_path = api.infra_paths['depot_tools'].join( |
414 'third_party', 'gsutil', 'gsutil') | 415 'third_party', 'gsutil', 'gsutil') |
415 upload_args = [api.properties['buildername'], api.properties['buildnumber'], | 416 upload_args = [api.properties['buildername'], api.properties['buildnumber'], |
416 results_dir, got_revision, gsutil_path] | 417 results_dir, got_revision, gsutil_path] |
417 if is_trybot: | 418 if is_trybot: |
418 upload_args.append(api.properties['issue']) | 419 upload_args.append(api.properties['issue']) |
419 api.python( | 420 api.python( |
420 'upload nanobench coverage results', | 421 'upload nanobench coverage results', |
421 script=api.skia.resource('upload_bench_results.py'), | 422 script=api.skia.resource('upload_bench_results.py'), |
422 args=upload_args, | 423 args=upload_args, |
423 cwd=api.path['checkout'], | 424 cwd=api.path['checkout'], |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 do_test_steps = builder_spec['do_test_steps'] | 468 do_test_steps = builder_spec['do_test_steps'] |
468 do_perf_steps = builder_spec['do_perf_steps'] | 469 do_perf_steps = builder_spec['do_perf_steps'] |
469 | 470 |
470 if not (do_test_steps or do_perf_steps): | 471 if not (do_test_steps or do_perf_steps): |
471 return | 472 return |
472 | 473 |
473 extra_hashes = [recipes_hash] | 474 extra_hashes = [recipes_hash] |
474 if compile_hash: | 475 if compile_hash: |
475 extra_hashes.append(compile_hash) | 476 extra_hashes.append(compile_hash) |
476 | 477 |
477 api.skia.download_skps(api.path['slave_build'].join('tmp'), | 478 api.skia.download_skps(api.infra_paths['slave_build'].join('tmp'), |
478 api.path['slave_build'].join('skps'), | 479 api.infra_paths['slave_build'].join('skps'), |
479 False) | 480 False) |
480 api.skia.download_images(api.path['slave_build'].join('tmp'), | 481 api.skia.download_images(api.infra_paths['slave_build'].join('tmp'), |
481 api.path['slave_build'].join('images'), | 482 api.infra_paths['slave_build'].join('images'), |
482 False) | 483 False) |
483 | 484 |
484 test_task = None | 485 test_task = None |
485 perf_task = None | 486 perf_task = None |
486 if do_test_steps: | 487 if do_test_steps: |
487 test_task = test_steps_trigger(api, builder_spec, got_revision, | 488 test_task = test_steps_trigger(api, builder_spec, got_revision, |
488 infrabots_dir, extra_hashes) | 489 infrabots_dir, extra_hashes) |
489 if do_perf_steps: | 490 if do_perf_steps: |
490 perf_task = perf_steps_trigger(api, builder_spec, got_revision, | 491 perf_task = perf_steps_trigger(api, builder_spec, got_revision, |
491 infrabots_dir, extra_hashes) | 492 infrabots_dir, extra_hashes) |
492 is_trybot = builder_cfg['is_trybot'] | 493 is_trybot = builder_cfg['is_trybot'] |
493 if test_task: | 494 if test_task: |
494 test_steps_collect(api, test_task, builder_spec['upload_dm_results'], | 495 test_steps_collect(api, test_task, builder_spec['upload_dm_results'], |
495 got_revision, is_trybot, builder_cfg) | 496 got_revision, is_trybot, builder_cfg) |
496 if perf_task: | 497 if perf_task: |
497 perf_steps_collect(api, perf_task, builder_spec['upload_perf_results'], | 498 perf_steps_collect(api, perf_task, builder_spec['upload_perf_results'], |
498 got_revision, is_trybot) | 499 got_revision, is_trybot) |
499 | 500 |
500 | 501 |
501 def test_for_bot(api, builder, mastername, slavename, testname=None): | 502 def test_for_bot(api, builder, mastername, slavename, testname=None): |
502 """Generate a test for the given bot.""" | 503 """Generate a test for the given bot.""" |
503 testname = testname or builder | 504 testname = testname or builder |
504 test = ( | 505 test = ( |
505 api.test(testname) + | 506 api.test(testname) + |
506 api.properties(buildername=builder, | 507 api.properties(buildername=builder, |
507 mastername=mastername, | 508 mastername=mastername, |
508 slavename=slavename, | 509 slavename=slavename, |
509 buildnumber=5, | 510 buildnumber=5, |
510 revision='abc123') + | 511 revision='abc123') + |
511 api.path.exists( | 512 api.infra_paths.exists( |
512 api.path['slave_build'].join('skia'), | 513 api.infra_paths['slave_build'].join('skia'), |
513 api.path['slave_build'].join('tmp', 'uninteresting_hashes.txt') | 514 api.infra_paths['slave_build'].join('tmp', 'uninteresting_hashes.txt') |
514 ) | 515 ) |
515 ) | 516 ) |
516 if 'Trybot' in builder: | 517 if 'Trybot' in builder: |
517 test += api.properties(issue=500, | 518 test += api.properties(issue=500, |
518 patchset=1, | 519 patchset=1, |
519 rietveld='https://codereview.chromium.org') | 520 rietveld='https://codereview.chromium.org') |
520 if 'Coverage' not in builder: | 521 if 'Coverage' not in builder: |
521 test += api.step_data( | 522 test += api.step_data( |
522 'upload new .isolated file for compile_skia', | 523 'upload new .isolated file for compile_skia', |
523 stdout=api.raw_io.output('def456 XYZ.isolated')) | 524 stdout=api.raw_io.output('def456 XYZ.isolated')) |
(...skipping 14 matching lines...) Expand all Loading... |
538 for mastername, slaves in TEST_BUILDERS.iteritems(): | 539 for mastername, slaves in TEST_BUILDERS.iteritems(): |
539 for slavename, builders_by_slave in slaves.iteritems(): | 540 for slavename, builders_by_slave in slaves.iteritems(): |
540 for builder in builders_by_slave: | 541 for builder in builders_by_slave: |
541 yield test_for_bot(api, builder, mastername, slavename) | 542 yield test_for_bot(api, builder, mastername, slavename) |
542 | 543 |
543 builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Swarming' | 544 builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-Swarming' |
544 master = 'client.skia' | 545 master = 'client.skia' |
545 slave = 'skiabot-linux-test-000' | 546 slave = 'skiabot-linux-test-000' |
546 test = test_for_bot(api, builder, master, slave, 'No_downloaded_SKP_VERSION') | 547 test = test_for_bot(api, builder, master, slave, 'No_downloaded_SKP_VERSION') |
547 test += api.step_data('Get downloaded SKP_VERSION', retcode=1) | 548 test += api.step_data('Get downloaded SKP_VERSION', retcode=1) |
548 test += api.path.exists( | 549 test += api.infra_paths.exists( |
549 api.path['slave_build'].join('skia'), | 550 api.infra_paths['slave_build'].join('skia'), |
550 api.path['slave_build'].join('tmp', 'uninteresting_hashes.txt') | 551 api.infra_paths['slave_build'].join('tmp', 'uninteresting_hashes.txt') |
551 ) | 552 ) |
552 yield test | 553 yield test |
OLD | NEW |