| #!/usr/bin/env lucicfg |
| |
| lucicfg.check_version("1.30.9", "Please use newer `lucicfg` binary") |
| |
| # Use LUCI Scheduler BBv2 names and add Scheduler realms configs. |
| lucicfg.enable_experiment("crbug.com/1182002") |
| |
| luci.builder.defaults.experiments.set({ |
| "luci.recipes.use_python3": 100 |
| }) |
| |
| |
| luci.project( |
| name = "r8", |
| 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 = "chrome-swarming.appspot.com", |
| acls = [ |
| acl.entry( |
| [ |
| acl.BUILDBUCKET_READER, |
| acl.LOGDOG_READER, |
| acl.PROJECT_CONFIGS_READER, |
| acl.SCHEDULER_READER, |
| ], |
| groups = ["all"], |
| ), |
| acl.entry( |
| [ |
| acl.BUILDBUCKET_TRIGGERER, |
| acl.SCHEDULER_OWNER, |
| |
| ], |
| groups = [ |
| "project-r8-committers" |
| ], |
| users = [ |
| "luci-scheduler@appspot.gserviceaccount.com" |
| ] |
| ), |
| acl.entry( |
| [ |
| acl.LOGDOG_WRITER, |
| ], |
| groups = [ |
| "luci-logdog-r8-writers" |
| ], |
| ), |
| ], |
| bindings = [ |
| luci.binding( |
| roles = "role/swarming.poolOwner", |
| groups = "mdb/r8-team", |
| ), |
| luci.binding( |
| roles = "role/swarming.poolViewer", |
| groups = "googlers", |
| ), |
| ], |
| ) |
| |
| luci.logdog(gs_bucket = "logdog-r8-archive") |
| |
| |
| # Allow the given users to use LUCI `led` tool and "Debug" button |
| # inside the given bucket & pool security realms. |
| def led_users(*, pool_realm, builder_realm, groups): |
| luci.realm( |
| name = pool_realm, |
| bindings = [ |
| luci.binding( |
| roles = "role/swarming.poolUser", |
| groups = groups, |
| ), |
| ], |
| ) |
| luci.binding( |
| realm = builder_realm, |
| roles = "role/swarming.taskTriggerer", |
| groups = groups, |
| ) |
| led_users( |
| pool_realm="pools/ci", |
| builder_realm="ci", |
| groups=[ |
| "mdb/r8-team", |
| "mdb/chrome-troopers", |
| ], |
| ) |
| |
| luci.bucket(name = "ci") |
| |
| luci.milo() |
| |
| luci.notifier( |
| name = "r8-failures", |
| on_failure = True, |
| on_new_failure = True, |
| notify_blamelist = True |
| ) |
| |
| luci.gitiles_poller( |
| name = "main-gitiles-trigger", |
| bucket = "ci", |
| repo = "https://r8.googlesource.com/r8" |
| ) |
| |
| luci.gitiles_poller( |
| name = "branch-gitiles-8.3-forward", |
| bucket = "ci", |
| repo = "https://r8.googlesource.com/r8", |
| refs = ["refs/heads/([8]\\.[3-9]+(\\.[0-9]+)?|[9]\\.[0-9]+(\\.[0-9]+)?)"], |
| path_regexps = ["src/main/java/com/android/tools/r8/Version.java"] |
| ) |
| |
| luci.gitiles_poller( |
| name = "branch-gitiles-8.1-forward", |
| bucket = "ci", |
| repo = "https://r8.googlesource.com/r8", |
| refs = ["refs/heads/([8]\\.[1-9]+(\\.[0-9]+)?|[9]\\.[0-9]+(\\.[0-9]+)?)"], |
| path_regexps = ["src/main/java/com/android/tools/r8/Version.java"] |
| ) |
| |
| luci.gitiles_poller( |
| name = "branch-gitiles-trigger", |
| bucket = "ci", |
| repo = "https://r8.googlesource.com/r8", |
| refs = ["refs/heads/[0-9]+\\.[0-9]+(\\.[0-9]+)?"], |
| path_regexps = ["src/main/java/com/android/tools/r8/Version.java"] |
| ) |
| |
| luci.console_view( |
| name = "main", |
| title = "R8 Main Console", |
| repo = "https://r8.googlesource.com/r8", |
| refs = ["refs/heads/.*"] |
| ) |
| |
| view_builders = [] |
| |
| def builder_view(name, category, short_name): |
| view_builders.append((name, category, short_name)) |
| |
| luci.recipe( |
| name="rex", |
| cipd_package = "infra_internal/recipe_bundles/" + |
| "chrome-internal.googlesource.com/chrome/" + |
| "tools/build_limited/scripts/slave", |
| cipd_version = "refs/heads/master", |
| use_bbagent = True |
| ) |
| |
| common_test_options = [ |
| "--tool=r8", |
| "--print-times", |
| "--no_internal", |
| "--one_line_per_test", |
| "--archive_failures" |
| ] |
| |
| default_timeout = time.hour * 6 |
| |
| def get_dimensions(windows=False, internal=False, archive=False): |
| # We use the following setup: |
| # windows -> always windows machine |
| # internal -> always internal, single small, machine |
| # archie -> archive or normal machines (normal machines set archive) |
| # all_other -> normal linux machines |
| dimensions = { |
| "cpu" : "x86-64", |
| "pool" : "luci.r8.ci" |
| } |
| if windows: |
| dimensions["os"] = "Windows-10" |
| else: |
| dimensions["os"] = "Ubuntu-20.04" |
| if internal: |
| dimensions["internal"] = "true" |
| elif archive: |
| dimensions["archive"] = "true" |
| else: |
| dimensions["normal"] = "true" |
| return dimensions |
| |
| def r8_builder(name, priority=26, trigger=True, category=None, |
| triggering_policy=None, release_trigger=None, |
| max_concurrent_invocations=1, **kwargs): |
| release = name.endswith("release") |
| triggered = None |
| if trigger: |
| if release: |
| triggered = release_trigger if release_trigger else ["branch-gitiles-trigger"] |
| else: |
| triggered = ["main-gitiles-trigger"] |
| triggering_policy = triggering_policy or scheduler.policy( |
| kind = scheduler.GREEDY_BATCHING_KIND, |
| max_batch_size = 1 if release else None, |
| max_concurrent_invocations = max_concurrent_invocations) |
| |
| luci.builder( |
| name = name, |
| bucket = "ci", |
| service_account = "r8-ci-builder@chops-service-accounts." + |
| "iam.gserviceaccount.com", |
| build_numbers = True, |
| swarming_tags = ["vpython:native-python-wrapper"], |
| notifies = ["r8-failures"] if trigger else None, |
| priority = priority, |
| triggered_by = triggered, |
| triggering_policy = triggering_policy, |
| executable = "rex", |
| **kwargs |
| ) |
| category = category if category else "R8" |
| category = "Release|" + category if release else category |
| builder_view(name, category, name.split("-")[-1].replace("_release", "")) |
| |
| def r8_tester(name, |
| test_options, |
| dimensions = None, |
| execution_timeout = default_timeout, |
| expiration_timeout = time.hour * 35, |
| max_concurrent_invocations = 1, |
| category=None, |
| release_trigger=None): |
| dimensions = dimensions if dimensions else get_dimensions() |
| for name in [name, name + "_release"]: |
| r8_builder( |
| name = name, |
| category = category, |
| execution_timeout = execution_timeout, |
| expiration_timeout = expiration_timeout, |
| dimensions = dimensions, |
| release_trigger=release_trigger, |
| max_concurrent_invocations = max_concurrent_invocations, |
| properties = { |
| "test_options" : test_options, |
| "builder_group" : "internal.client.r8" |
| } |
| ) |
| |
| def r8_tester_with_default(name, |
| test_options, |
| dimensions=None, |
| category=None, |
| release_trigger=None, |
| max_concurrent_invocations = 1, |
| execution_timeout = default_timeout): |
| r8_tester(name, test_options + common_test_options, |
| dimensions = dimensions, category = category, release_trigger=release_trigger, |
| max_concurrent_invocations = max_concurrent_invocations, |
| execution_timeout = execution_timeout) |
| |
| def archivers(): |
| for name in [ |
| "archive", |
| "archive_release", |
| "lib_desugar-archive-jdk11", |
| "lib_desugar-archive-jdk11-legacy", |
| "lib_desugar-archive-jdk8"]: |
| desugar = "desugar" in name |
| properties = { |
| "test_wrapper" : "tools/archive_desugar_jdk_libs.py" if desugar else "tools/archive.py", |
| "builder_group" : "internal.client.r8" |
| } |
| if desugar: |
| if name.endswith("jdk11"): |
| properties["test_options"] = ["--variant=jdk11_minimal", "--variant=jdk11", "--variant=jdk11_nio"] |
| elif name.endswith("jdk11-legacy"): |
| properties["test_options"] = ["--variant=jdk11_legacy"] |
| else: |
| properties["test_options"] = ["--variant=jdk8"] |
| |
| r8_builder( |
| name, |
| category = "library_desugar" if desugar else "archive", |
| dimensions = get_dimensions(archive=True), |
| triggering_policy = scheduler.policy( |
| kind = scheduler.GREEDY_BATCHING_KIND, |
| max_batch_size = 1, |
| max_concurrent_invocations = 1 |
| ), |
| priority = 25, |
| trigger = not desugar, |
| properties = properties, |
| execution_timeout = time.hour * 1, |
| expiration_timeout = time.hour * 35, |
| ) |
| archivers() |
| |
| r8_builder( |
| "check", |
| category = "archive", |
| dimensions = get_dimensions(), |
| triggering_policy = scheduler.policy( |
| kind = scheduler.GREEDY_BATCHING_KIND, |
| max_batch_size = 1, |
| max_concurrent_invocations = 1 |
| ), |
| priority = 25, |
| properties = { |
| "test_wrapper" : "tools/check-cherry-picks.py", |
| "builder_group" : "internal.client.r8" |
| }, |
| execution_timeout = time.minute * 30, |
| expiration_timeout = time.hour * 35, |
| ) |
| |
| r8_tester_with_default("linux-dex_default", |
| ["--runtimes=dex-default", "--command_cache_dir=/tmp/ccache"], |
| max_concurrent_invocations = 2) |
| r8_tester_with_default("linux-none", |
| ["--runtimes=none", "--command_cache_dir=/tmp/ccache"], |
| max_concurrent_invocations = 2) |
| r8_tester_with_default("linux-jdk8", |
| ["--runtimes=jdk8", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-jdk9", |
| ["--runtimes=jdk9", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-jdk11", |
| ["--runtimes=jdk11", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-jdk17", |
| ["--runtimes=jdk17", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-jdk21", |
| ["--runtimes=jdk21", "--command_cache_dir=/tmp/ccache"], |
| release_trigger=["branch-gitiles-8.3-forward"]) |
| |
| r8_tester_with_default("linux-android-4.0.4", |
| ["--dex_vm=4.0.4", "--all_tests", "--command_cache_dir=/tmp/ccache"], |
| max_concurrent_invocations = 2) |
| r8_tester_with_default("linux-android-4.4.4", |
| ["--dex_vm=4.4.4", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-5.1.1", |
| ["--dex_vm=5.1.1", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-6.0.1", |
| ["--dex_vm=6.0.1", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-7.0.0", |
| ["--dex_vm=7.0.0", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-8.1.0", |
| ["--dex_vm=8.1.0", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-9.0.0", |
| ["--dex_vm=9.0.0", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-10.0.0", |
| ["--dex_vm=10.0.0", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-12.0.0", |
| ["--dex_vm=12.0.0", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-13.0.0", |
| ["--dex_vm=13.0.0", "--all_tests", "--command_cache_dir=/tmp/ccache"]) |
| r8_tester_with_default("linux-android-14.0.0", |
| ["--dex_vm=14.0.0", "--all_tests", "--command_cache_dir=/tmp/ccache"], |
| release_trigger=["branch-gitiles-8.1-forward"]) |
| |
| |
| r8_tester_with_default("windows", ["--all_tests"], |
| dimensions=get_dimensions(windows=True), |
| execution_timeout = time.hour * 8, |
| max_concurrent_invocations = 2) |
| |
| def internal(): |
| for name in ["linux-internal", "linux-internal_release"]: |
| r8_builder( |
| name, |
| dimensions = get_dimensions(internal=True), |
| triggering_policy = scheduler.policy( |
| kind = scheduler.GREEDY_BATCHING_KIND, |
| max_concurrent_invocations = 1, |
| max_batch_size = 1 if "release" in name else 20 |
| ), |
| priority = 25, |
| properties = { |
| "test_options" : ["--bot"], |
| "test_wrapper" : "tools/internal_test.py", |
| "builder_group" : "internal.client.r8" |
| }, |
| execution_timeout = time.hour * 12, |
| expiration_timeout = time.hour * 35, |
| ) |
| internal() |
| |
| def app_dump(): |
| for release in ["", "_release"]: |
| properties = { |
| "builder_group" : "internal.client.r8", |
| "test_options" : ["--bot", "--workers", "4"], |
| "test_wrapper" : "tools/run_on_app_dump.py" |
| } |
| name = "linux-run-on-app-dump" + release |
| r8_builder( |
| name, |
| dimensions = get_dimensions(), |
| execution_timeout = time.hour * 12, |
| expiration_timeout = time.hour * 35, |
| properties = properties, |
| ) |
| app_dump() |
| |
| def desugared_library(): |
| test_options = [ |
| "--one_line_per_test", |
| "--archive_failures", |
| "--no_internal", |
| "--no_arttests", |
| "--desugared-library", |
| "HEAD", |
| "--desugared-library-configuration", |
| "jdk11" |
| ] |
| properties = { |
| "builder_group" : "internal.client.r8", |
| "test_options" : test_options, |
| } |
| r8_builder( |
| "desugared_library-jdk11_head", |
| category = "library_desugar", |
| dimensions = get_dimensions(), |
| execution_timeout = time.hour * 12, |
| expiration_timeout = time.hour * 35, |
| properties = properties, |
| ) |
| desugared_library() |
| |
| r8_builder( |
| "linux-kotlin_dev", |
| dimensions = get_dimensions(), |
| execution_timeout = time.hour * 12, |
| expiration_timeout = time.hour * 35, |
| properties = { |
| "builder_group" : "internal.client.r8", |
| "test_options" : ["--runtimes=dex-default:jdk11", "--kotlin-compiler-dev", "--one_line_per_test", "--archive_failures", "--no-internal", "*kotlin*", "*debug*"] |
| } |
| ) |
| |
| r8_builder( |
| "linux-kotlin_old", |
| dimensions = get_dimensions(), |
| execution_timeout = time.hour * 12, |
| expiration_timeout = time.hour * 35, |
| properties = { |
| "builder_group" : "internal.client.r8", |
| "test_options" : ["--runtimes=dex-default:jdk11", "--kotlin-compiler-old", "--one_line_per_test", "--archive_failures", "--no-internal", "*kotlin*", "*debug*"] |
| } |
| ) |
| |
| r8_builder( |
| "smali", |
| category = "aux", |
| trigger = False, |
| dimensions = get_dimensions(), |
| triggering_policy = scheduler.policy( |
| kind = scheduler.GREEDY_BATCHING_KIND, |
| max_concurrent_invocations = 1, |
| max_batch_size = 1, |
| ), |
| properties = { |
| "test_wrapper" : "tools/archive_smali.py", |
| "builder_group" : "internal.client.smali" |
| }, |
| execution_timeout = time.hour * 12, |
| expiration_timeout = time.hour * 35, |
| ) |
| |
| order_of_categories = [ |
| "archive", |
| "R8", |
| "library_desugar", |
| "Release|archive", |
| "Release|R8", |
| ] |
| |
| categories_with_no_console = [ |
| "aux", |
| ] |
| |
| def add_view_entries(): |
| # Ensure that all categories are ordered |
| for v in view_builders: |
| if v[1] in categories_with_no_console: |
| continue |
| if not v[1] in order_of_categories: |
| fail() |
| for category in order_of_categories: |
| for v in [x for x in view_builders if x[1] == category]: |
| luci.console_view_entry( |
| console_view = "main", |
| builder = v[0], |
| category = v[1], |
| short_name = v[2] |
| ) |
| add_view_entries() |