| # Copyright 2022 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. |
| |
| """Update CIPD ensure files in a Git repository.""" |
| |
| from PB.recipes.fuchsia.cipd_ensure_file_roller import InputProperties |
| |
| PYTHON_VERSION_COMPATIBILITY = "PY3" |
| |
| DEPS = [ |
| "fuchsia/auto_roller", |
| "fuchsia/buildbucket_util", |
| "fuchsia/cipd_resolver", |
| "fuchsia/cipd_util", |
| "fuchsia/gerrit", |
| "fuchsia/git_checkout", |
| "recipe_engine/cipd", |
| "recipe_engine/json", |
| "recipe_engine/path", |
| "recipe_engine/properties", |
| ] |
| |
| PROPERTIES = InputProperties |
| |
| |
| def RunSteps(api, props): |
| props.tag = props.tag or "version" |
| props.ref = props.ref or "latest" |
| # Note that we only support Git checkouts. Jiri checkouts are not expected |
| # to have CIPD ensure files. |
| checkout_dir = api.path.mkdtemp("checkout") |
| api.git_checkout(props.remote, path=checkout_dir) |
| |
| all_packages = [] |
| for ensure_file, packages in props.packages_by_ensure_file.items(): |
| platforms = api.cipd_util.get_platforms( |
| "get platforms for %s" % ensure_file, |
| ensure_file=checkout_dir.join(ensure_file), |
| ) |
| all_packages += api.cipd_util.expand_packages_by_platforms( |
| "expand %s packages by platforms" % ensure_file, |
| packages=packages, |
| platforms=platforms, |
| ) |
| |
| all_packages = sorted(all_packages) |
| |
| candidate_versions = api.cipd_resolver.resolve_common_tags( |
| ref=props.ref, |
| tag_name=props.tag, |
| packages=all_packages, |
| ) |
| version = candidate_versions[0] |
| |
| for ensure_file, packages in props.packages_by_ensure_file.items(): |
| api.cipd_util.update_packages( |
| "update %s" % ensure_file, |
| ensure_file=checkout_dir.join(ensure_file), |
| packages=packages, |
| tag_name=props.tag, |
| version=version, |
| ) |
| api.cipd.ensure_file_resolve(checkout_dir.join(ensure_file)) |
| |
| change = api.auto_roller.attempt_roll( |
| api.gerrit.host_from_remote_url(props.remote), |
| gerrit_project=api.gerrit.project_from_remote_url(props.remote), |
| repo_dir=checkout_dir, |
| # TODO(atyfto): Improve the commit message. |
| commit_message="[roll] Update cipd ensure files to %s" % props.ref, |
| cl_notify_option=props.cl_notify_option, |
| create_unique_id=props.create_unique_change_id, |
| dry_run=props.dry_run, |
| ) |
| return api.auto_roller.raw_result(change) |
| |
| |
| def GenTests(api): |
| ensure_file = "foo.ensure" |
| packages = ["fuchsia/foo/${platform}", "fuchsia/bar/${platform}"] |
| default_props = api.properties( |
| packages_by_ensure_file={ensure_file: packages}, |
| remote="https://fuchsia.googlesource.com/integration", |
| ) |
| |
| def resolved_tags(tags): |
| return api.step_data("resolve common tags", api.json.output_stream(tags)) |
| |
| yield ( |
| api.buildbucket_util.test("roll", builder="cipd-roller") |
| + resolved_tags(["version:newest", "version:newer"]) |
| + api.cipd_util.get_platforms( |
| "get platforms for %s" % ensure_file, |
| ["linux-amd64", "linux-arm64", "mac-amd64"], |
| ) |
| + api.cipd_util.update_packages("update %s" % ensure_file, packages) |
| + api.auto_roller.success() |
| + default_props |
| ) |