| # Copyright 2019 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 running a specified script from a given repo.""" |
| |
| from recipe_engine.recipe_api import Property |
| |
| DEPS = [ |
| "fuchsia/git", |
| "fuchsia/status_check", |
| "recipe_engine/buildbucket", |
| "recipe_engine/cipd", |
| "recipe_engine/context", |
| "recipe_engine/file", |
| "recipe_engine/path", |
| "recipe_engine/properties", |
| "recipe_engine/step", |
| "recipe_engine/url", |
| ] |
| |
| PROPERTIES = { |
| "repo": Property(kind=str, help="Repository to checkout."), |
| "script": Property(kind=str, help="Relative path to the script to run."), |
| "upload_to_cipd": Property( |
| kind=bool, help="Whether to upload a package to CIPD.", default=False |
| ), |
| } |
| |
| |
| def RunSteps(api, repo, script, upload_to_cipd): |
| bb_input = api.buildbucket.build.input |
| |
| with api.step.nest("checkout"), api.context(infra_steps=True): |
| checkout_dir = api.path["start_dir"].join( |
| "run-script-%s" % api.url.quote(script.replace(".", "-")) |
| ) |
| api.git.checkout_from_build_input(path=checkout_dir, repo=repo) |
| |
| with api.context(cwd=checkout_dir): |
| script_cmd = [script] |
| if upload_to_cipd: |
| # Script must emit a newline-separated txt file of CIPD yaml paths, |
| # e.g. "/path/to/foo.yaml\n/path/to/bar.yaml" relative to the |
| # working dir i.e. the checkout dir. |
| assert bb_input.gitiles_commit.project, "we should only be uploading in CI" |
| cipd_yaml_manifest = api.path.mkstemp("cipd_manifest") |
| script_cmd += ["--cipd-yaml-manifest", cipd_yaml_manifest] |
| |
| api.step("run %s" % script, script_cmd) |
| |
| if upload_to_cipd: |
| # Create package(s) from the script's emitted CIPD yaml(s). |
| cipd_yaml_paths = ( |
| api.file.read_text( |
| "read CIPD yaml manifest", |
| cipd_yaml_manifest, |
| test_data="path/to/foo.yaml\npath/to/bar.yaml\n", |
| ) |
| .rstrip() |
| .split("\n") |
| ) |
| for cipd_yaml_path in cipd_yaml_paths: |
| api.cipd.create_from_yaml( |
| checkout_dir.join(cipd_yaml_path), |
| refs=["latest"], |
| tags={"git_revision": bb_input.gitiles_commit.id}, |
| ) |
| |
| |
| def GenTests(api): |
| repo = "https://fuchsia.googlesource.com/foo" |
| |
| yield ( |
| api.status_check.test("ci") |
| + api.properties(script="run-tests.sh", repo=repo) |
| + api.buildbucket.ci_build(git_repo=repo) |
| ) |
| |
| yield ( |
| api.status_check.test("ci_upload") |
| + api.properties(script="build-pkg.sh", repo=repo, upload_to_cipd=True) |
| + api.buildbucket.ci_build(git_repo=repo) |
| ) |
| |
| yield ( |
| api.status_check.test("cq") |
| + api.properties(script="run-tests.sh", repo=repo) |
| + api.buildbucket.try_build(git_repo=repo) |
| ) |
| |
| yield ( |
| api.status_check.test("script_failed", status="failure") |
| + api.properties(script="run-tests.sh", repo=repo) |
| + api.buildbucket.ci_build(git_repo=repo) |
| + api.step_data("run run-tests.sh", retcode=1) |
| ) |
| |
| yield ( |
| api.status_check.test("no_buildbucket_input") |
| + api.properties(script="run-tests.sh", repo=repo) |
| ) |