blob: e7317e853854978f2ae401289c4db12197c96af8 [file] [log] [blame]
# Copyright 2016 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.
"""A continuous builder which runs recipe tests."""
import json
from recipe_engine.recipe_api import Property
DEPS = [
'depot_tools/bot_update',
'depot_tools/gclient',
'recipe_engine/buildbucket',
'recipe_engine/context',
'recipe_engine/file',
'recipe_engine/json',
'recipe_engine/path',
'recipe_engine/properties',
'recipe_engine/python',
'recipe_engine/step',
]
PROPERTIES = {
'git_repo': Property(
kind=str,
default=None,
help='Git repo URL in which to simulate recipes. '
'It must contain infra/config/recipes.cfg file. '
'If not specified, uses buildbucket.gitiles_commit.'),
}
# Assumption of current recipe world.
CFG_PATH = 'infra/config/recipes.cfg'
def RunSteps(api, git_repo):
if api.buildbucket.gitiles_commit.project:
triggered_on = 'https://%s/%s' % (
api.buildbucket.gitiles_commit.host,
api.buildbucket.gitiles_commit.project)
if git_repo is None:
git_repo = triggered_on
elif git_repo != triggered_on:
raise api.step.InfraFailure(
'Conflicting git repo URLs:\n'
' `git_repo` property %r\n'
' but triggered on Gitiles commit {%s}' %
(git_repo, api.buildbucket.gitiles_commit))
safe_project_name = ''.join(
c if c.isalnum() else '_'
for c in git_repo.replace('.googlesource.com', ''))
root_dir = api.path['cache'].join('builder', safe_project_name)
api.file.ensure_directory('ensure cache dir', root_dir)
c = api.gclient.make_config()
soln = c.solutions.add()
soln.name = 's'
soln.url = git_repo
soln.revision = 'HEAD'
with api.context(cwd=root_dir):
api.bot_update.ensure_checkout(gclient_config=c)
recipes_cfg_path = root_dir.join('s', *CFG_PATH.split('/'))
cfg = json.loads(api.file.read_raw('read %s' % CFG_PATH, recipes_cfg_path))
recipes_py_path = root_dir.join(
's', *(cfg['recipes_path'].split('/') + ['recipes.py']))
api.step('recipe simulation test', [
recipes_py_path,
'test', 'run',
])
def GenTests(api):
yield (
api.test('gitiles_commit') +
api.buildbucket.ci_build(
# NOTE: this git_repo doesn't become a property, it's to simulate
# api.buildbucket.gitiles_commit.
git_repo='https://chromium.googlesource.com/chromium/tools/build',
) +
api.step_data('read %s' % CFG_PATH, api.file.read_raw('''
{
"api_version": 2,
"project_id": "build",
"recipes_path": "scripts/slave",
"repo_name": "build"
}
'''))
)
yield (
api.test('tip_of_tree') +
api.properties(
git_repo='https://chromium.googlesource.com/infra/infra',
) +
api.step_data('read %s' % CFG_PATH, api.file.read_raw('''
{
"api_version": 2,
"project_id": "infra",
"recipes_path": "recipes",
"repo_name": "infra"
}
'''))
)
yield (
api.test('conflicting_repo_urls') +
api.buildbucket.ci_build(
git_repo='https://chromium.googlesource.com/chromium/tools/build',
) +
api.properties(
git_repo='https://chromium.googlesource.com/infra/infra.GIT',
)
)