blob: c18f74182706421cf8e2a3074e5fc9771057982f [file] [log] [blame]
# 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.
from PB.recipes.fuchsia.contrib.winsdk import InputProperties
DEPS = [
"fuchsia/cipd_util",
"fuchsia/docker",
"fuchsia/gitiles",
"fuchsia/status_check",
"recipe_engine/cipd",
"recipe_engine/context",
"recipe_engine/file",
"recipe_engine/path",
"recipe_engine/platform",
"recipe_engine/properties",
"recipe_engine/step",
]
PROPERTIES = InputProperties
# TODO(fxbug.dev/99600): Replace it with CIPD prebuilt once we build this script and upload it to CIPD.
WINSDK_REPO = "fuchsia.googlesource.com"
WINSDK_PROJECT = "fuchsia"
WINSDK_REF = "refs/heads/main"
WINSDK_PATH = "tools/winsdk/winsdk.go"
def RunSteps(api, props):
# This recipe only works under windows.
if not api.platform.is_win:
raise api.step.InfraFailure("This recipe only works on windows")
winsdk_temp_dir = api.path.mkdtemp("windsdk_docker")
api.file.ensure_directory("ensure working directory", winsdk_temp_dir)
api.file.copy(
"copy dockerfile",
api.resource("Dockerfile"),
winsdk_temp_dir.join("Dockerfile"),
)
# Logging wrapper from MS. Though we don't keep these logs
# but docker build will fail with error code 3010 if this
# wrapper is not used.
api.file.copy(
"copy install.cmd",
api.resource("Install.cmd"),
winsdk_temp_dir.join("Install.cmd"),
)
# Fetch winsdk packer tool from CIPD
pkgs = api.cipd.EnsureFile()
pkgs.add_package("infra/3pp/tools/go/windows-amd64", "latest")
api.cipd.ensure(winsdk_temp_dir, pkgs)
script_data = api.gitiles.fetch(
host=WINSDK_REPO,
project=WINSDK_PROJECT,
path=WINSDK_PATH,
ref=WINSDK_REF,
step_name="fetch winsdk script",
default_test_data="",
)
api.file.write_raw(
"write winsdk script file", winsdk_temp_dir.join("winsdk.go"), script_data
)
api.step(
"build winsdk script",
[
winsdk_temp_dir.join("bin", "go.exe"),
"build",
"-o",
winsdk_temp_dir.join("winsdk.exe"),
winsdk_temp_dir.join("winsdk.go"),
],
)
with api.context(cwd=winsdk_temp_dir):
api.docker.build(
dockerfile=winsdk_temp_dir.join("Dockerfile"),
tags=["vs2022"],
docker_args=[
"-m",
"2GB",
],
)
api.docker.run(
image="vs2022:latest",
cmd_args=[
"C:\\TEMP\\winsdk\\winsdk.exe",
"--dryrun" if props.dry_run else "--output=C:\\TEMP\\winsdk\\winsdk",
],
dir_mapping=[(winsdk_temp_dir, "C:\\TEMP\\winsdk")],
step_name="pack winsdk",
)
api.docker.cleanup()
if not props.dry_run:
sdk_dir = winsdk_temp_dir.join("winsdk")
lockfile = api.file.read_json(
name="read lockfile",
source=sdk_dir.join("content.lock"),
test_data={
"updated": "2022-07-22T15:30:52.3133295-07:00",
"hash": "3bf53ee8f76154537b0903095a7c402de0c67d8a58f85a2105113460db491a73",
},
)
api.cipd_util.upload_package(
props.cipd_path,
sdk_dir,
search_tag={"lock_hash": lockfile["hash"]},
metadata=[("updated", lockfile["updated"])],
)
def GenTests(api):
default_properties = api.properties(
dry_run=False,
cipd_path="fuchsia/test/winsdk",
)
dryrun_properties = api.properties(
dry_run=True,
)
yield api.status_check.test("default", status="infra_failure") + default_properties
yield api.status_check.test("win_x64") + default_properties + api.platform.name(
"win"
)
yield api.status_check.test(
"win_x64_dry_run"
) + dryrun_properties + api.platform.name("win")