Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/infra/config/main.star
1697 views
#!/usr/bin/env lucicfg
#
# Copyright 2021 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.
#
# main.star: lucicfg configuration for ANGLE's standalone builers.

lucicfg.config(
    fail_on_warnings = True,
    lint_checks = [
        "default",
        "-module-docstring",
        "-function-docstring",
    ],
)

# Enable LUCI Realms support.
lucicfg.enable_experiment("crbug.com/1085650")
# Launch 0% of Swarming tasks for builds in "realms-aware mode"
# TODO(https://crbug.com/1204972): ramp up to 100%.
# luci.builder.defaults.experiments.set({"luci.use_realms": 0})

# Enable LUCI Realms support.
lucicfg.enable_experiment("crbug.com/1085650")

# Launch all builds and tasks in Angle in realms mode.
luci.builder.defaults.experiments.set({"luci.use_realms": 100})

luci.project(
    name = "angle",
    buildbucket = "cr-buildbucket.appspot.com",
    logdog = "luci-logdog.appspot.com",
    milo = "luci-milo.appspot.com",
    notify = "luci-notify.appspot.com",
    scheduler = "luci-scheduler.appspot.com",
    swarming = "chromium-swarm.appspot.com",
    acls = [
        acl.entry(
            roles = [
                acl.PROJECT_CONFIGS_READER,
                acl.LOGDOG_READER,
                acl.BUILDBUCKET_READER,
                acl.SCHEDULER_READER,
            ],
            groups = "all",
        ),
        acl.entry(
            roles = [
                acl.SCHEDULER_OWNER,
            ],
            groups = "project-angle-admins",
        ),
        acl.entry(
            roles = [
                acl.LOGDOG_WRITER,
            ],
            groups = "luci-logdog-angle-writers",
        ),
    ],
    bindings = [
        luci.binding(
            roles = "role/swarming.poolOwner",
            groups = ["project-angle-owners", "mdb/chrome-troopers"],
        ),
        luci.binding(
            roles = "role/swarming.poolViewer",
            groups = "all",
        ),
        # Allow any Angle build to trigger a test ran under testing accounts
        # used on shared chromium tester pools.
        luci.binding(
            roles = "role/swarming.taskServiceAccount",
            users = [
                "[email protected]",
                "[email protected]",
            ],
        ),
    ],
)

# Swarming permissions
luci.realm(name = "pools/ci")
luci.realm(name = "pools/try")

# Allow Angle owners and Chrome troopers to run tasks directly for testing and
# development on all Angle bots. E.g. via `led` tool or "Debug" button in Swarming Web UI.
luci.binding(
    realm = "@root",
    roles = "role/swarming.poolUser",
    groups = ["project-angle-owners", "mdb/chrome-troopers"],
)
luci.binding(
    realm = "@root",
    roles = "role/swarming.taskTriggerer",
    groups = ["project-angle-owners", "mdb/chrome-troopers"],
)

def _generate_project_pyl(ctx):
    ctx.output["project.pyl"] = "\n".join([
        "# This is a non-LUCI generated file",
        "# This is consumed by presubmit checks that need to validate the config",
        repr(dict(
            # We don't validate matching source-side configs for simplicity.
            validate_source_side_specs_have_builder = False,
        )),
        "",
    ])

lucicfg.generator(_generate_project_pyl)

luci.milo(
    logo = "https://storage.googleapis.com/chrome-infra/OpenGL%20ES_RGB_June16.svg",
    monorail_project = "angleproject",
    monorail_components = ["Infra"],
)

luci.logdog(gs_bucket = "chromium-luci-logdog")

# The category for an os: a more generic grouping than specific OS versions that
# can be used for computing defaults
os_category = struct(
    ANDROID = "Android",
    LINUX = "Linux",
    MAC = "Mac",
    WINDOWS = "Windows",
)

def os_enum(dimension, category, console_name):
    return struct(dimension = dimension, category = category, console_name = console_name)

os = struct(
    ANDROID = os_enum("Ubuntu", os_category.ANDROID, "android"),
    LINUX = os_enum("Ubuntu", os_category.LINUX, "linux"),
    MAC = os_enum("Mac", os_category.MAC, "mac"),
    WINDOWS = os_enum("Windows", os_category.WINDOWS, "win"),
)

# Recipes

_RECIPE_NAME_PREFIX = "recipe:"
_DEFAULT_BUILDERLESS_OS_CATEGORIES = [os_category.LINUX, os_category.WINDOWS]
_GOMA_RBE_PROD = {
    "server_host": "goma.chromium.org",
    "rpc_extra_params": "?prod",
}

def _recipe_for_package(cipd_package):
    def recipe(*, name, cipd_version = None, recipe = None, use_bbagent = False):
        # Force the caller to put the recipe prefix rather than adding it
        # programatically to make the string greppable
        if not name.startswith(_RECIPE_NAME_PREFIX):
            fail("Recipe name {!r} does not start with {!r}"
                .format(name, _RECIPE_NAME_PREFIX))
        if recipe == None:
            recipe = name[len(_RECIPE_NAME_PREFIX):]
        return luci.recipe(
            name = name,
            cipd_package = cipd_package,
            cipd_version = cipd_version,
            recipe = recipe,
            use_bbagent = use_bbagent,
        )

    return recipe

build_recipe = _recipe_for_package(
    "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",
)

build_recipe(
    name = "recipe:angle",
)

build_recipe(
    name = "recipe:run_presubmit",
)

def get_os_from_name(name):
    if name.startswith("android"):
        return os.ANDROID
    if name.startswith("linux"):
        return os.LINUX
    if name.startswith("win"):
        return os.WINDOWS
    if name.startswith("mac"):
        return os.MAC
    return os.MAC

def get_gpu_type_from_builder_name(name):
    return name.split("-")[1]

# Adds both the CI and Try standalone builders.
def angle_builder(name, debug, cpu, toolchain = "clang", uwp = False, test_mode = "compile_and_test"):
    properties = {
        "builder_group": "angle",
    }
    config_os = get_os_from_name(name)
    dimensions = {}
    dimensions["os"] = config_os.dimension

    goma_props = {}
    goma_props.update(_GOMA_RBE_PROD)

    if config_os.category in _DEFAULT_BUILDERLESS_OS_CATEGORIES:
        dimensions["builderless"] = "1"
        goma_props["enable_ats"] = True

    properties["$build/goma"] = goma_props
    properties["platform"] = config_os.console_name
    properties["toolchain"] = toolchain

    if toolchain == "gcc":
        properties["test_mode"] = "checkout_only"
    elif debug or toolchain == "msvc" or (config_os.category == os_category.ANDROID and cpu == "arm"):
        properties["test_mode"] = "compile_only"
    else:
        properties["test_mode"] = test_mode

    luci.builder(
        name = name,
        bucket = "ci",
        triggered_by = ["master-poller"],
        executable = "recipe:angle",
        service_account = "[email protected]",
        properties = properties,
        dimensions = dimensions,
        build_numbers = True,
        resultdb_settings = resultdb.settings(enable = True),
    )

    is_perf = "-perf" in name

    # Trace tests are only included automatically if files in the capture folder change.
    if test_mode == "trace_tests":
        config = "trace"
        location_regexp = [
            ".+/[+]/src/libANGLE/capture/.+",
            ".+/[+]/src/tests/capture.+",
        ]
    elif is_perf:
        config = "perf"
    else:
        config = "angle"
        location_regexp = None

    if uwp:
        os_name = "winuwp"
    else:
        os_name = config_os.console_name

    if is_perf:
        short_name = get_gpu_type_from_builder_name(name)
    elif debug:
        short_name = "dbg"
    else:
        short_name = "rel"

    luci.console_view_entry(
        console_view = "ci",
        builder = "ci/" + name,
        category = config + "|" + os_name + "|" + toolchain + "|" + cpu,
        short_name = short_name,
    )

    # Do not include perf tests in "try".
    if not is_perf:
        luci.list_view_entry(
            list_view = "try",
            builder = "try/" + name,
        )

        luci.builder(
            name = name,
            bucket = "try",
            executable = "recipe:angle",
            service_account = "[email protected]",
            properties = properties,
            dimensions = dimensions,
            build_numbers = True,
            resultdb_settings = resultdb.settings(enable = True),
        )

        # Include all other bots in the CQ by default except the placeholder GCC configs.
        if toolchain != "gcc":
            luci.cq_tryjob_verifier(
                cq_group = "master",
                builder = "angle:try/" + name,
                location_regexp = location_regexp,
            )

luci.bucket(
    name = "ci",
    acls = [
        acl.entry(
            acl.BUILDBUCKET_TRIGGERER,
            users = [
                "[email protected]",
            ],
        ),
    ],
)

luci.bucket(
    name = "try",
    acls = [
        acl.entry(
            acl.BUILDBUCKET_TRIGGERER,
            groups = [
                "project-angle-tryjob-access",
                "service-account-cq",
            ],
        ),
    ],
)

luci.builder(
    name = "presubmit",
    bucket = "try",
    executable = "recipe:run_presubmit",
    service_account = "[email protected]",
    build_numbers = True,
    dimensions = {
        "os": os.LINUX.dimension,
    },
    properties = {
        "repo_name": "angle",
        "runhooks": True,
    },
    resultdb_settings = resultdb.settings(enable = True),
)

luci.gitiles_poller(
    name = "master-poller",
    bucket = "ci",
    repo = "https://chromium.googlesource.com/angle/angle",
    refs = [
        "refs/heads/master",
    ],
    schedule = "with 10s interval",
)

# name, clang, debug, cpu, uwp, trace_tests
angle_builder("android-arm-dbg", debug = True, cpu = "arm")
angle_builder("android-arm-rel", debug = False, cpu = "arm")
angle_builder("android-arm64-dbg", debug = True, cpu = "arm64")
angle_builder("android-arm64-rel", debug = False, cpu = "arm64")
angle_builder("linux-clang-dbg", debug = True, cpu = "x64")
angle_builder("linux-clang-rel", debug = False, cpu = "x64")
angle_builder("linux-gcc-dbg", debug = True, cpu = "x64", toolchain = "gcc")
angle_builder("linux-gcc-rel", debug = False, cpu = "x64", toolchain = "gcc")
angle_builder("mac-dbg", debug = True, cpu = "x64")
angle_builder("mac-rel", debug = False, cpu = "x64")
angle_builder("win-clang-x86-dbg", debug = True, cpu = "x86")
angle_builder("win-clang-x86-rel", debug = False, cpu = "x86")
angle_builder("win-clang-x64-dbg", debug = True, cpu = "x64")
angle_builder("win-clang-x64-rel", debug = False, cpu = "x64")
angle_builder("win-msvc-x86-dbg", debug = True, cpu = "x86", toolchain = "msvc")
angle_builder("win-msvc-x86-rel", debug = False, cpu = "x86", toolchain = "msvc")
angle_builder("win-msvc-x64-dbg", debug = True, cpu = "x64", toolchain = "msvc")
angle_builder("win-msvc-x64-rel", debug = False, cpu = "x64", toolchain = "msvc")
angle_builder("winuwp-x64-dbg", debug = True, cpu = "x64", toolchain = "msvc", uwp = True)
angle_builder("winuwp-x64-rel", debug = False, cpu = "x64", toolchain = "msvc", uwp = True)

angle_builder("linux-trace-rel", debug = False, cpu = "x64", test_mode = "trace_tests")
angle_builder("win-trace-rel", debug = False, cpu = "x64", test_mode = "trace_tests")

angle_builder("android-pixel4-perf", debug = False, cpu = "arm64")
angle_builder("linux-intel-hd630-perf", debug = False, cpu = "x64")
angle_builder("linux-nvidia-p400-perf", debug = False, cpu = "x64")
angle_builder("win10-intel-hd630-perf", debug = False, cpu = "x64")
angle_builder("win10-nvidia-p400-perf", debug = False, cpu = "x64")

# Views

luci.console_view(
    name = "ci",
    title = "ANGLE CI Builders",
    repo = "https://chromium.googlesource.com/angle/angle",
    refs = ["refs/heads/master"],
)

luci.list_view(
    name = "try",
    title = "ANGLE Try Builders",
)

luci.list_view_entry(
    list_view = "try",
    builder = "try/presubmit",
)

# CQ

luci.cq(
    status_host = "chromium-cq-status.appspot.com",
    submit_max_burst = 4,
    submit_burst_delay = 480 * time.second,
)

luci.cq_group(
    name = "master",
    watch = cq.refset(
        "https://chromium.googlesource.com/angle/angle",
        refs = [r"refs/heads/master", r"refs/heads/main"],
    ),
    acls = [
        acl.entry(
            acl.CQ_COMMITTER,
            groups = "project-angle-committers",
        ),
        acl.entry(
            acl.CQ_DRY_RUNNER,
            groups = "project-angle-tryjob-access",
        ),
    ],
    verifiers = [
        luci.cq_tryjob_verifier(
            builder = "angle:try/presubmit",
            disable_reuse = True,
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/android-angle-chromium-try",
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/android-angle-try",
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/fuchsia-angle-try",
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/linux-angle-chromium-try",
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/linux-swangle-try-tot-angle-x64",
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/mac-angle-chromium-try",
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/win-angle-chromium-x64-try",
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/win-angle-chromium-x86-try",
        ),
        luci.cq_tryjob_verifier(
            builder = "chromium:try/win-swangle-try-tot-angle-x86",
        ),
    ],
)