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 |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 skia_recipes_dir, | 161 skia_recipes_dir, |
162 'linux', | 162 'linux', |
163 'isolate_recipes', | 163 'isolate_recipes', |
164 {}) | 164 {}) |
165 return api.skia_swarming.batcharchive(['isolate_recipes'])[0][1] | 165 return api.skia_swarming.batcharchive(['isolate_recipes'])[0][1] |
166 | 166 |
167 | 167 |
168 def trigger_task(api, task_name, builder, master, slave, buildnumber, | 168 def trigger_task(api, task_name, builder, master, slave, buildnumber, |
169 builder_spec, got_revision, infrabots_dir, idempotent=False, | 169 builder_spec, got_revision, infrabots_dir, idempotent=False, |
170 store_output=True, extra_isolate_hashes=None, expiration=None, | 170 store_output=True, extra_isolate_hashes=None, expiration=None, |
171 hard_timeout=None, io_timeout=None): | 171 hard_timeout=None, io_timeout=None, cipd_packages=None): |
172 """Trigger the given bot to run as a Swarming task.""" | 172 """Trigger the given bot to run as a Swarming task.""" |
173 # TODO(borenet): We're using Swarming directly to run the recipe through | 173 # TODO(borenet): We're using Swarming directly to run the recipe through |
174 # recipes.py. Once it's possible to track the state of a Buildbucket build, | 174 # recipes.py. Once it's possible to track the state of a Buildbucket build, |
175 # we should switch to use the trigger recipe module instead. | 175 # we should switch to use the trigger recipe module instead. |
176 | 176 |
177 properties = { | 177 properties = { |
178 'buildername': builder, | 178 'buildername': builder, |
179 'mastername': master, | 179 'mastername': master, |
180 'buildnumber': buildnumber, | 180 'buildnumber': buildnumber, |
181 'reason': 'Triggered by Skia swarm_trigger Recipe', | 181 'reason': 'Triggered by Skia swarm_trigger Recipe', |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 '%s_skia' % task_name, | 213 '%s_skia' % task_name, |
214 isolate_vars, | 214 isolate_vars, |
215 dimensions, | 215 dimensions, |
216 isolate_blacklist=isolate_blacklist, | 216 isolate_blacklist=isolate_blacklist, |
217 extra_isolate_hashes=extra_isolate_hashes, | 217 extra_isolate_hashes=extra_isolate_hashes, |
218 idempotent=idempotent, | 218 idempotent=idempotent, |
219 store_output=store_output, | 219 store_output=store_output, |
220 extra_args=extra_args, | 220 extra_args=extra_args, |
221 expiration=expiration, | 221 expiration=expiration, |
222 hard_timeout=hard_timeout, | 222 hard_timeout=hard_timeout, |
223 io_timeout=io_timeout) | 223 io_timeout=io_timeout, |
| 224 cipd_packages=cipd_packages) |
224 | 225 |
225 | 226 |
226 def checkout_steps(api): | 227 def checkout_steps(api): |
227 """Run the steps to obtain a checkout of Skia.""" | 228 """Run the steps to obtain a checkout of Skia.""" |
228 gclient_cfg = api.gclient.make_config(CACHE_DIR=None) | 229 gclient_cfg = api.gclient.make_config(CACHE_DIR=None) |
229 skia = gclient_cfg.solutions.add() | 230 skia = gclient_cfg.solutions.add() |
230 skia.name = 'skia' | 231 skia.name = 'skia' |
231 skia.managed = False | 232 skia.managed = False |
232 skia.url = 'https://skia.googlesource.com/skia.git' | 233 skia.url = 'https://skia.googlesource.com/skia.git' |
233 skia.revision = api.properties.get('revision') or 'origin/master' | 234 skia.revision = api.properties.get('revision') or 'origin/master' |
(...skipping 21 matching lines...) Expand all Loading... |
255 builder_spec, | 256 builder_spec, |
256 got_revision, | 257 got_revision, |
257 infrabots_dir, | 258 infrabots_dir, |
258 idempotent=False, | 259 idempotent=False, |
259 store_output=False, | 260 store_output=False, |
260 extra_isolate_hashes=extra_isolate_hashes) | 261 extra_isolate_hashes=extra_isolate_hashes) |
261 return api.skia_swarming.collect_swarming_task(task) | 262 return api.skia_swarming.collect_swarming_task(task) |
262 | 263 |
263 | 264 |
264 def compile_steps_swarm(api, builder_spec, got_revision, infrabots_dir, | 265 def compile_steps_swarm(api, builder_spec, got_revision, infrabots_dir, |
265 extra_isolate_hashes): | 266 extra_isolate_hashes, cipd_packages): |
266 builder_name = derive_compile_bot_name(api.properties['buildername'], | 267 builder_name = derive_compile_bot_name(api.properties['buildername'], |
267 builder_spec) | 268 builder_spec) |
268 compile_builder_spec = builder_spec | 269 compile_builder_spec = builder_spec |
269 if builder_name != api.properties['buildername']: | 270 if builder_name != api.properties['buildername']: |
270 compile_builder_spec = api.skia.get_builder_spec( | 271 compile_builder_spec = api.skia.get_builder_spec( |
271 api.path['slave_build'].join('skia'), builder_name) | 272 api.path['slave_build'].join('skia'), builder_name) |
272 | 273 |
273 extra_hashes = extra_isolate_hashes[:] | 274 extra_hashes = extra_isolate_hashes[:] |
274 | 275 |
275 # Windows bots require a toolchain. | 276 # Windows bots require a toolchain. |
(...skipping 22 matching lines...) Expand all Loading... |
298 'compile', | 299 'compile', |
299 builder_name, | 300 builder_name, |
300 master, | 301 master, |
301 slave, | 302 slave, |
302 buildnumber, | 303 buildnumber, |
303 compile_builder_spec, | 304 compile_builder_spec, |
304 got_revision, | 305 got_revision, |
305 infrabots_dir, | 306 infrabots_dir, |
306 idempotent=True, | 307 idempotent=True, |
307 store_output=False, | 308 store_output=False, |
308 extra_isolate_hashes=extra_hashes) | 309 extra_isolate_hashes=extra_hashes, |
| 310 cipd_packages=cipd_packages) |
309 | 311 |
310 # Wait for compile to finish, record the results hash. | 312 # Wait for compile to finish, record the results hash. |
311 return api.skia_swarming.collect_swarming_task_isolate_hash(task) | 313 return api.skia_swarming.collect_swarming_task_isolate_hash(task) |
312 | 314 |
313 | 315 |
314 def get_timeouts(builder_cfg): | 316 def get_timeouts(builder_cfg): |
315 """Some builders require longer than the default timeouts. | 317 """Some builders require longer than the default timeouts. |
316 | 318 |
317 Returns tuple of (expiration, hard_timeout, io_timeout). If those values are | 319 Returns tuple of (expiration, hard_timeout, io_timeout). If those values are |
318 none then default timeouts should be used. | 320 none then default timeouts should be used. |
319 """ | 321 """ |
320 expiration = None | 322 expiration = None |
321 hard_timeout = None | 323 hard_timeout = None |
322 io_timeout = None | 324 io_timeout = None |
323 if 'Valgrind' in builder_cfg.get('extra_config', ''): | 325 if 'Valgrind' in builder_cfg.get('extra_config', ''): |
324 expiration = 2*24*60*60 | 326 expiration = 2*24*60*60 |
325 hard_timeout = 9*60*60 | 327 hard_timeout = 9*60*60 |
326 io_timeout = 60*60 | 328 io_timeout = 60*60 |
327 return expiration, hard_timeout, io_timeout | 329 return expiration, hard_timeout, io_timeout |
328 | 330 |
329 | 331 |
330 def perf_steps_trigger(api, builder_spec, got_revision, infrabots_dir, | 332 def perf_steps_trigger(api, builder_spec, got_revision, infrabots_dir, |
331 extra_hashes): | 333 extra_hashes, cipd_packages): |
332 """Trigger perf tests via Swarming.""" | 334 """Trigger perf tests via Swarming.""" |
333 | 335 |
334 expiration, hard_timeout, io_timeout = get_timeouts( | 336 expiration, hard_timeout, io_timeout = get_timeouts( |
335 builder_spec['builder_cfg']) | 337 builder_spec['builder_cfg']) |
336 return trigger_task( | 338 return trigger_task( |
337 api, | 339 api, |
338 'perf', | 340 'perf', |
339 api.properties['buildername'], | 341 api.properties['buildername'], |
340 api.properties['mastername'], | 342 api.properties['mastername'], |
341 api.properties['slavename'], | 343 api.properties['slavename'], |
342 api.properties['buildnumber'], | 344 api.properties['buildnumber'], |
343 builder_spec, | 345 builder_spec, |
344 got_revision, | 346 got_revision, |
345 infrabots_dir, | 347 infrabots_dir, |
346 extra_isolate_hashes=extra_hashes, | 348 extra_isolate_hashes=extra_hashes, |
347 expiration=expiration, | 349 expiration=expiration, |
348 hard_timeout=hard_timeout, | 350 hard_timeout=hard_timeout, |
349 io_timeout=io_timeout) | 351 io_timeout=io_timeout, |
| 352 cipd_packages=cipd_packages) |
350 | 353 |
351 | 354 |
352 def perf_steps_collect(api, task, upload_perf_results, got_revision, | 355 def perf_steps_collect(api, task, upload_perf_results, got_revision, |
353 is_trybot): | 356 is_trybot): |
354 """Wait for perf steps to finish and upload results.""" | 357 """Wait for perf steps to finish and upload results.""" |
355 # Wait for nanobench to finish, download the results. | 358 # Wait for nanobench to finish, download the results. |
356 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) | 359 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) |
357 api.skia_swarming.collect_swarming_task(task) | 360 api.skia_swarming.collect_swarming_task(task) |
358 | 361 |
359 # Upload the results. | 362 # Upload the results. |
(...skipping 21 matching lines...) Expand all Loading... |
381 api.python( | 384 api.python( |
382 'Upload perf results', | 385 'Upload perf results', |
383 script=api.skia.resource('upload_bench_results.py'), | 386 script=api.skia.resource('upload_bench_results.py'), |
384 args=upload_args, | 387 args=upload_args, |
385 cwd=api.path['checkout'], | 388 cwd=api.path['checkout'], |
386 env=api.skia.gsutil_env('chromium-skia-gm.boto'), | 389 env=api.skia.gsutil_env('chromium-skia-gm.boto'), |
387 infra_step=True) | 390 infra_step=True) |
388 | 391 |
389 | 392 |
390 def test_steps_trigger(api, builder_spec, got_revision, infrabots_dir, | 393 def test_steps_trigger(api, builder_spec, got_revision, infrabots_dir, |
391 extra_hashes): | 394 extra_hashes, cipd_packages): |
392 """Trigger DM via Swarming.""" | 395 """Trigger DM via Swarming.""" |
393 expiration, hard_timeout, io_timeout = get_timeouts( | 396 expiration, hard_timeout, io_timeout = get_timeouts( |
394 builder_spec['builder_cfg']) | 397 builder_spec['builder_cfg']) |
395 return trigger_task( | 398 return trigger_task( |
396 api, | 399 api, |
397 'test', | 400 'test', |
398 api.properties['buildername'], | 401 api.properties['buildername'], |
399 api.properties['mastername'], | 402 api.properties['mastername'], |
400 api.properties['slavename'], | 403 api.properties['slavename'], |
401 api.properties['buildnumber'], | 404 api.properties['buildnumber'], |
402 builder_spec, | 405 builder_spec, |
403 got_revision, | 406 got_revision, |
404 infrabots_dir, | 407 infrabots_dir, |
405 extra_isolate_hashes=extra_hashes, | 408 extra_isolate_hashes=extra_hashes, |
406 expiration=expiration, | 409 expiration=expiration, |
407 hard_timeout=hard_timeout, | 410 hard_timeout=hard_timeout, |
408 io_timeout=io_timeout) | 411 io_timeout=io_timeout, |
| 412 cipd_packages=cipd_packages) |
409 | 413 |
410 | 414 |
411 def test_steps_collect(api, task, upload_dm_results, got_revision, is_trybot, | 415 def test_steps_collect(api, task, upload_dm_results, got_revision, is_trybot, |
412 builder_cfg): | 416 builder_cfg): |
413 """Collect the test results from Swarming.""" | 417 """Collect the test results from Swarming.""" |
414 # Wait for tests to finish, download the results. | 418 # Wait for tests to finish, download the results. |
415 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) | 419 api.file.rmtree('results_dir', task.task_output_dir, infra_step=True) |
416 api.skia_swarming.collect_swarming_task(task) | 420 api.skia_swarming.collect_swarming_task(task) |
417 | 421 |
418 # Upload the results. | 422 # Upload the results. |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 api.skia_swarming.setup( | 528 api.skia_swarming.setup( |
525 api.path['checkout'].join('infra', 'bots', 'tools', 'luci-go'), | 529 api.path['checkout'].join('infra', 'bots', 'tools', 'luci-go'), |
526 swarming_rev='') | 530 swarming_rev='') |
527 | 531 |
528 # Run gsutil.py to ensure that it's installed. | 532 # Run gsutil.py to ensure that it's installed. |
529 api.gsutil(['help']) | 533 api.gsutil(['help']) |
530 | 534 |
531 recipes_hash = isolate_recipes(api) | 535 recipes_hash = isolate_recipes(api) |
532 extra_hashes = [recipes_hash] | 536 extra_hashes = [recipes_hash] |
533 | 537 |
| 538 # Get ready to compile. |
| 539 compile_cipd_deps = [] |
| 540 extra_compile_hashes = [recipes_hash] |
| 541 |
534 # Android bots require an SDK. | 542 # Android bots require an SDK. |
535 if 'Android' in api.properties['buildername']: | 543 if 'Android' in api.properties['buildername']: |
536 test_data = 'a27a70d73b85191b9e671ff2a44547c3f7cc15ee' | 544 android_sdk_version_file = infrabots_dir.join( |
537 hash_file = infrabots_dir.join('android_sdk_hash') | 545 'assets', 'android_sdk', 'VERSION') |
538 # try/except as a temporary measure to prevent breakages for backfills | 546 if api.path.exists(android_sdk_version_file): |
539 # and branches. | 547 android_sdk_version = api.skia._readfile(android_sdk_version_file, |
540 try: | 548 name='read android_sdk VERSION', |
541 h = api.skia._readfile(hash_file, | 549 test_data='0').rstrip() |
542 name='Read android_sdk_hash', | 550 android_sdk_version = 'version:%s' % android_sdk_version |
543 test_data=test_data).rstrip() | 551 pkg = ('android_sdk', 'skia/bots/android_sdk', android_sdk_version) |
544 except api.step.StepFailure: | 552 compile_cipd_deps.append(pkg) |
545 # Just fall back on the original hash. | 553 else: |
546 h = 'a27a70d73b85191b9e671ff2a44547c3f7cc15ee' | 554 # TODO(borenet): Remove this legacy method after 7/1/2016. |
547 extra_hashes.append(h) | 555 test_data = 'a27a70d73b85191b9e671ff2a44547c3f7cc15ee' |
| 556 hash_file = infrabots_dir.join('android_sdk_hash') |
| 557 # try/except as a temporary measure to prevent breakages for backfills |
| 558 # and branches. |
| 559 try: |
| 560 h = api.skia._readfile(hash_file, |
| 561 name='Read android_sdk_hash', |
| 562 test_data=test_data).rstrip() |
| 563 except api.step.StepFailure: |
| 564 # Just fall back on the original hash. |
| 565 h = 'a27a70d73b85191b9e671ff2a44547c3f7cc15ee' |
| 566 extra_hashes.append(h) |
| 567 extra_compile_hashes.append(h) |
548 | 568 |
| 569 # Compile. |
549 do_compile_steps = builder_spec.get('do_compile_steps', True) | 570 do_compile_steps = builder_spec.get('do_compile_steps', True) |
550 compile_hash = None | |
551 if do_compile_steps: | 571 if do_compile_steps: |
552 compile_hash = compile_steps_swarm(api, builder_spec, got_revision, | 572 extra_hashes.append(compile_steps_swarm( |
553 infrabots_dir, extra_hashes) | 573 api, builder_spec, got_revision, infrabots_dir, extra_compile_hashes, |
| 574 cipd_packages=compile_cipd_deps)) |
554 | 575 |
555 if builder_cfg['role'] == 'Housekeeper': | 576 if builder_cfg['role'] == 'Housekeeper': |
556 housekeeper_swarm(api, builder_spec, got_revision, infrabots_dir, | 577 housekeeper_swarm(api, builder_spec, got_revision, infrabots_dir, |
557 extra_hashes) | 578 extra_hashes) |
558 return | 579 return |
559 | 580 |
| 581 # Get ready to test/perf. |
| 582 |
| 583 # CIPD packages needed by test/perf. |
| 584 cipd_packages = [] |
| 585 |
560 do_test_steps = builder_spec['do_test_steps'] | 586 do_test_steps = builder_spec['do_test_steps'] |
561 do_perf_steps = builder_spec['do_perf_steps'] | 587 do_perf_steps = builder_spec['do_perf_steps'] |
562 | 588 |
563 if not (do_test_steps or do_perf_steps): | 589 if not (do_test_steps or do_perf_steps): |
564 return | 590 return |
565 | 591 |
566 if compile_hash: | |
567 extra_hashes.append(compile_hash) | |
568 | |
569 api.skia.download_skps(api.path['slave_build'].join('tmp'), | 592 api.skia.download_skps(api.path['slave_build'].join('tmp'), |
570 api.path['slave_build'].join('skps')) | 593 api.path['slave_build'].join('skps')) |
571 api.skia.download_images(api.path['slave_build'].join('tmp'), | 594 api.skia.download_images(api.path['slave_build'].join('tmp'), |
572 api.path['slave_build'].join('images')) | 595 api.path['slave_build'].join('images')) |
573 | 596 |
574 test_task = None | 597 test_task = None |
575 perf_task = None | 598 perf_task = None |
576 if do_test_steps: | 599 if do_test_steps: |
577 test_task = test_steps_trigger(api, builder_spec, got_revision, | 600 test_task = test_steps_trigger(api, builder_spec, got_revision, |
578 infrabots_dir, extra_hashes) | 601 infrabots_dir, extra_hashes, cipd_packages) |
579 if do_perf_steps: | 602 if do_perf_steps: |
580 perf_task = perf_steps_trigger(api, builder_spec, got_revision, | 603 perf_task = perf_steps_trigger(api, builder_spec, got_revision, |
581 infrabots_dir, extra_hashes) | 604 infrabots_dir, extra_hashes, cipd_packages) |
582 is_trybot = builder_cfg['is_trybot'] | 605 is_trybot = builder_cfg['is_trybot'] |
583 if test_task: | 606 if test_task: |
584 test_steps_collect(api, test_task, builder_spec['upload_dm_results'], | 607 test_steps_collect(api, test_task, builder_spec['upload_dm_results'], |
585 got_revision, is_trybot, builder_cfg) | 608 got_revision, is_trybot, builder_cfg) |
586 if perf_task: | 609 if perf_task: |
587 perf_steps_collect(api, perf_task, builder_spec['upload_perf_results'], | 610 perf_steps_collect(api, perf_task, builder_spec['upload_perf_results'], |
588 got_revision, is_trybot) | 611 got_revision, is_trybot) |
589 | 612 |
590 | 613 |
591 def test_for_bot(api, builder, mastername, slavename, testname=None): | 614 def test_for_bot(api, builder, mastername, slavename, testname=None, |
| 615 legacy_android_sdk=False): |
592 """Generate a test for the given bot.""" | 616 """Generate a test for the given bot.""" |
593 testname = testname or builder | 617 testname = testname or builder |
594 test = ( | 618 test = ( |
595 api.test(testname) + | 619 api.test(testname) + |
596 api.properties(buildername=builder, | 620 api.properties(buildername=builder, |
597 mastername=mastername, | 621 mastername=mastername, |
598 slavename=slavename, | 622 slavename=slavename, |
599 buildnumber=5, | 623 buildnumber=5, |
600 revision='abc123') + | 624 revision='abc123') + |
601 api.path.exists( | 625 api.path.exists( |
602 api.path['slave_build'].join('skia'), | 626 api.path['slave_build'].join('skia'), |
603 api.path['slave_build'].join('tmp', 'uninteresting_hashes.txt') | 627 api.path['slave_build'].join('tmp', 'uninteresting_hashes.txt') |
604 ) | 628 ) |
605 ) | 629 ) |
606 if 'Trybot' in builder: | 630 if 'Trybot' in builder: |
607 test += api.properties(issue=500, | 631 test += api.properties(issue=500, |
608 patchset=1, | 632 patchset=1, |
609 rietveld='https://codereview.chromium.org') | 633 rietveld='https://codereview.chromium.org') |
| 634 if 'Android' in builder: |
| 635 if not legacy_android_sdk: |
| 636 test += api.path.exists(api.path['slave_build'].join( |
| 637 'skia', 'infra', 'bots', 'assets', 'android_sdk', 'VERSION')) |
610 if 'Coverage' not in builder: | 638 if 'Coverage' not in builder: |
611 test += api.step_data( | 639 test += api.step_data( |
612 'upload new .isolated file for compile_skia', | 640 'upload new .isolated file for compile_skia', |
613 stdout=api.raw_io.output('def456 XYZ.isolated')) | 641 stdout=api.raw_io.output('def456 XYZ.isolated')) |
614 if 'Test' in builder: | 642 if 'Test' in builder: |
615 test += api.step_data( | 643 test += api.step_data( |
616 'upload new .isolated file for test_skia', | 644 'upload new .isolated file for test_skia', |
617 stdout=api.raw_io.output('def456 XYZ.isolated')) | 645 stdout=api.raw_io.output('def456 XYZ.isolated')) |
618 if ('Test' in builder and 'Debug' in builder) or 'Perf' in builder or ( | 646 if ('Test' in builder and 'Debug' in builder) or 'Perf' in builder or ( |
619 'Valgrind' in builder and 'Test' in builder): | 647 'Valgrind' in builder and 'Test' in builder): |
(...skipping 30 matching lines...) Expand all Loading... |
650 test += api.properties(test_downloaded_skp_version='999') | 678 test += api.properties(test_downloaded_skp_version='999') |
651 test += api.path.exists( | 679 test += api.path.exists( |
652 api.path['slave_build'].join('skia'), | 680 api.path['slave_build'].join('skia'), |
653 api.path['slave_build'].join('tmp', 'uninteresting_hashes.txt') | 681 api.path['slave_build'].join('tmp', 'uninteresting_hashes.txt') |
654 ) | 682 ) |
655 yield test | 683 yield test |
656 | 684 |
657 builder = 'Build-Ubuntu-GCC-Arm7-Release-Android_Vulkan' | 685 builder = 'Build-Ubuntu-GCC-Arm7-Release-Android_Vulkan' |
658 master = 'client.skia.compile' | 686 master = 'client.skia.compile' |
659 slave = 'skiabot-linux-compile-000' | 687 slave = 'skiabot-linux-compile-000' |
660 test = test_for_bot(api, builder, master, slave, 'Missing_android_sdk_hash') | 688 test = test_for_bot(api, builder, master, slave, 'legacy_android_sdk', |
| 689 legacy_android_sdk=True) |
| 690 test += api.step_data('Read android_sdk_hash', |
| 691 stdout=api.raw_io.output('<android_sdk_hash>')) |
| 692 yield test |
| 693 |
| 694 test = test_for_bot(api, builder, master, slave, 'Missing_android_sdk_hash', |
| 695 legacy_android_sdk=True) |
661 test += api.step_data('Read android_sdk_hash', retcode=1) | 696 test += api.step_data('Read android_sdk_hash', retcode=1) |
662 yield test | 697 yield test |
OLD | NEW |