| # Copyright 2020 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Recipe for triggering toolchain buildbucket builds.""" |
| |
| from recipe_engine.config import List |
| from recipe_engine.recipe_api import Property |
| from PB.go.chromium.org.luci.buildbucket.proto import rpc as rpc_pb2 |
| from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb2 |
| |
| DEPS = [ |
| 'fuchsia/status_check', |
| 'fuchsia/buildbucket_util', |
| 'recipe_engine/buildbucket', |
| 'recipe_engine/json', |
| 'recipe_engine/properties', |
| 'recipe_engine/raw_io', |
| 'recipe_engine/scheduler', |
| 'recipe_engine/step', |
| 'recipe_engine/swarming', |
| ] |
| |
| PROPERTIES = { |
| 'builders': |
| Property( |
| kind=List(basestring), |
| help='List of toolchain builders to trigger', |
| default=[]), |
| 'triggers': |
| Property( |
| kind=List(basestring), |
| help='List of triggers to trigger', |
| default=[]), |
| 'bucket': |
| Property(kind=str, help='bucket for builders', default=None), |
| 'interval': |
| Property( |
| kind=int, help='Delay between requests when waiting', default=None), |
| 'timeout': |
| Property( |
| kind=int, help='Time to wait for the builds to end', default=None), |
| } |
| |
| |
| def RunSteps(api, builders, triggers, bucket, interval, timeout): |
| # Trigger the builders. |
| build_results = api.buildbucket.run( |
| [ |
| api.buildbucket.schedule_request( |
| builder, |
| bucket=bucket, |
| swarming_parent_run_id=api.swarming.task_id) |
| for builder in builders |
| ], |
| collect_interval=interval, |
| timeout=timeout, |
| step_name='schedule builders', |
| ) |
| api.buildbucket_util.display_builds( |
| step_name='display builds', builds=build_results, raise_on_failure=True) |
| # Trigger next stage builders |
| api.scheduler.emit_trigger( |
| api.scheduler.BuildbucketTrigger(), |
| project='fuchsia', |
| jobs=triggers, |
| ) |
| |
| |
| def GenTests(api): |
| default_properties = api.properties( |
| builders=['clang-linux-x64', 'clang-mac-x64'], triggers=['clang-trigger']) |
| |
| test_build = api.buildbucket.ci_build_message(status='SUCCESS') |
| mock_schedule_data = api.buildbucket.simulated_schedule_output( |
| step_name='schedule builders.schedule', |
| batch_response=rpc_pb2.BatchResponse( |
| responses=[dict(schedule_build=dict(id=test_build.id))],)) |
| mock_collect_data = api.buildbucket.simulated_collect_output( |
| step_name='schedule builders.collect', |
| builds=[test_build], |
| ) |
| yield (api.test('default') + api.buildbucket.ci_build( |
| bucket='ci', |
| git_repo='https://fuchsia.googlesource.com/example', |
| revision='a' * 40, |
| )) + default_properties + mock_collect_data + mock_schedule_data |
| |
| test_build_failure = api.buildbucket.ci_build_message(status='FAILURE') |
| mock_failure_schedule_data = api.buildbucket.simulated_schedule_output( |
| step_name='schedule builders.schedule', |
| batch_response=rpc_pb2.BatchResponse( |
| responses=[dict(schedule_build=dict(id=test_build_failure.id))],)) |
| mock_failure_collect_data = api.buildbucket.simulated_collect_output( |
| step_name='schedule builders.collect', |
| builds=[test_build_failure], |
| ) |
| |
| yield ( |
| api.status_check.test('default fail', status='failure') + |
| api.buildbucket.ci_build( |
| bucket='ci', |
| git_repo='https://fuchsia.googlesource.com/example', |
| revision='a' * 40, |
| ) |
| ) + default_properties + mock_failure_schedule_data + mock_failure_collect_data |