blob: 1881191ab24f18ac42709e674430888dd5707f58 [file] [log] [blame]
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from recipe_engine import recipe_api
class AddhocValidationApi(recipe_api.RecipeApi):
"""Wrapper api to run bash scripts as validation in LUCI builder steps.
This api expects all the bash or bat scripts to exist in its resources
directory and also expects the validation name to be listed in
available_validations method.
"""
def available_validations(self):
"""Returns the list of accepted validations."""
return [
'analyze', 'customer_testing', 'docs', 'fuchsia_precache',
'verify_binaries_codesigned',
]
def run(self, name, validation, env, env_prefixes, secrets=None):
"""Runs a validation as a recipe step.
Args:
name(str): The step group name.
validation(str): The name of a validation to run. This has to correlate
to a <validation>.sh for linux/mac or <validation>.bat for windows.
env(dict): Current environment variables.
env_prefixes(dict): Current environment prefixes variables.
secrets(dict): The key is the name of the secret and value is the path to kms.
"""
if validation not in self.available_validations():
msg = validation + ' is not listed in available_validations.'
raise AssertionError(msg)
secrets = secrets or {}
with self.m.step.nest(name):
resource_name = ''
deps = self.m.properties.get('dependencies', [])
self.m.kms.decrypt_secrets(env, secrets)
if self.m.platform.is_linux or self.m.platform.is_mac:
resource_name = self.resource('%s.sh' % validation)
self.m.step(
'Set execute permission',
['chmod', '755', resource_name],
infra_step=True,
)
elif self.m.platform.is_win:
resource_name = self.resource('%s.bat' % validation)
dep_list = [d['dependency'] for d in deps]
checkout_path = self.m.repo_util.sdk_checkout_path()
if 'xcode' in dep_list:
with self.m.osx_sdk('ios'):
self.m.flutter_deps.gems(
env, env_prefixes, checkout_path.join('dev', 'ci', 'mac')
)
with self.m.context(env=env, env_prefixes=env_prefixes):
self.m.test_utils.run_test(validation, [resource_name])
else:
with self.m.context(env=env, env_prefixes=env_prefixes):
self.m.test_utils.run_test(validation, [resource_name])
if validation == 'docs' and self.m.properties.get('firebase_project'):
docs_path = checkout_path.join('dev', 'docs')
project = self.m.properties.get('firebase_project')
self.m.firebase.deploy_docs(
env=env,
env_prefixes=env_prefixes,
docs_path=docs_path,
project=project
)