Add simple lucicfg configuration for art.

Notable changes:

  * Removes "luci-migration@appspot.gserviceaccount.com" group as
    Buildbucket Writers.
  * Removes "vpython:native-python-wrapper" from swarming_tags in
    builders (this has not had any functionality for a couple years
    at this point).
  * Replaces deprecated luci-notify "on_change" and "on_failure"
    settings with "on_new_status [FAILURE INFRA_FAILURE]".
  * Uses v2 bucket names in luci-scheduler.

The new configs will not be active until we change projects.cfg to
specify the new 'generated' folder.

Change-Id: I7a87a2ceb640af4cdb466d80ed4e03c1d5834f43
diff --git a/tools/luci/config/README.md b/tools/luci/config/README.md
new file mode 100644
index 0000000..2f1fd6f
--- /dev/null
+++ b/tools/luci/config/README.md
@@ -0,0 +1,20 @@
+## Configurations files for art LUCI builders.
+
+This directory contains art's configs for its LUCI builders.
+
+They are generated by the [lucicfg] tool based on Starlark code.
+See [main.star] for configs of production builders.
+
+After modifying any of the files, run `./main.star` to regenerate the configs.
+
+There are currently two helper scripts `format.sh` and `validate.sh`;
+Format is akin to `go fmt` and will automatically re-format the .star files.
+Validate will check to make sure the files are formatted and that their output
+matches the files in the `generated` directory (there is a TODO to integrate
+this with presubmit).
+
+Currently active version can be checked at
+https://luci-config.appspot.com/#/projects/art .
+
+[lucicfg]: https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/main/lucicfg/doc/README.md
+[main.star]: ./main.star
diff --git a/tools/luci/config/format.sh b/tools/luci/config/format.sh
new file mode 100755
index 0000000..2ee9e69
--- /dev/null
+++ b/tools/luci/config/format.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env sh
+# Formats all the .star files in this directory and subdirectories.
+lucicfg fmt
diff --git a/tools/luci/config/generated/cr-buildbucket.cfg b/tools/luci/config/generated/cr-buildbucket.cfg
new file mode 100644
index 0000000..d0e029c
--- /dev/null
+++ b/tools/luci/config/generated/cr-buildbucket.cfg
@@ -0,0 +1,518 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see BuildbucketCfg message:
+#   https://luci-config.appspot.com/schemas/projects:buildbucket.cfg
+
+buckets {
+  name: "ci"
+  acls {
+    role: WRITER
+    group: "project-art-admins"
+  }
+  acls {
+    group: "all"
+  }
+  swarming {
+    builders {
+      name: "angler-armv7-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:angler-armv7-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "angler-armv7-ndebug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:angler-armv7-ndebug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "angler-armv7-non-gen-cc"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:angler-armv7-non-gen-cc"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "angler-armv8-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:angler-armv8-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "angler-armv8-ndebug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:angler-armv8-ndebug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "angler-armv8-non-gen-cc"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:angler-armv8-non-gen-cc"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "bullhead-armv7-gcstress-ndebug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:bullhead-armv7-gcstress-ndebug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "bullhead-armv8-gcstress-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:bullhead-armv8-gcstress-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "bullhead-armv8-gcstress-ndebug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:bullhead-armv8-gcstress-ndebug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "fugu-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:fugu-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "fugu-ndebug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:fugu-ndebug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86-cms"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86-cms"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86-gcstress-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86-gcstress-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86-ndebug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86-ndebug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86-poison-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86-poison-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86_64-cdex-fast"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86_64-cdex-fast"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86_64-cms"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86_64-cms"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86_64-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86_64-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86_64-ndebug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86_64-ndebug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86_64-non-gen-cc"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86_64-non-gen-cc"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "host-x86_64-poison-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:host-x86_64-poison-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "walleye-armv7-poison-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:walleye-armv7-poison-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "walleye-armv8-poison-debug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:walleye-armv8-poison-debug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+    builders {
+      name: "walleye-armv8-poison-ndebug"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builder:walleye-armv8-poison-ndebug"
+      dimensions: "pool:luci.art.ci"
+      recipe {
+        name: "art"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "builder_group:\"client.art\""
+      }
+      execution_timeout_secs: 133200
+      expiration_secs: 36000
+      caches {
+        name: "art"
+        path: "art"
+      }
+      build_numbers: YES
+      service_account: "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    }
+  }
+}
diff --git a/tools/luci/config/generated/luci-logdog.cfg b/tools/luci/config/generated/luci-logdog.cfg
new file mode 100644
index 0000000..adc75be
--- /dev/null
+++ b/tools/luci/config/generated/luci-logdog.cfg
@@ -0,0 +1,9 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see ProjectConfig message:
+#   https://luci-config.appspot.com/schemas/projects:luci-logdog.cfg
+
+reader_auth_groups: "all"
+writer_auth_groups: "luci-logdog-chromium-writers"
+archive_gs_bucket: "chromium-luci-logdog"
diff --git a/tools/luci/config/generated/luci-milo.cfg b/tools/luci/config/generated/luci-milo.cfg
new file mode 100644
index 0000000..0ca098a
--- /dev/null
+++ b/tools/luci/config/generated/luci-milo.cfg
@@ -0,0 +1,140 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see Project message:
+#   https://luci-config.appspot.com/schemas/projects:luci-milo.cfg
+
+consoles {
+  id: "luci"
+  name: "ART LUCI Console"
+  repo_url: "https://android.googlesource.com/platform/art"
+  refs: "regexp:refs/heads/master"
+  manifest_name: "REVISION"
+  builders {
+    name: "buildbucket/luci.art.ci/angler-armv7-debug"
+    category: "angler|armv7"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/angler-armv7-non-gen-cc"
+    category: "angler|armv7"
+    short_name: "ngen"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/angler-armv7-ndebug"
+    category: "angler|armv7"
+    short_name: "ndbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/angler-armv8-debug"
+    category: "angler|armv8"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/angler-armv8-non-gen-cc"
+    category: "angler|armv8"
+    short_name: "ngen"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/angler-armv8-ndebug"
+    category: "angler|armv8"
+    short_name: "ndbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/bullhead-armv7-gcstress-ndebug"
+    category: "bullhead|armv7|gcstress"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/bullhead-armv8-gcstress-debug"
+    category: "bullhead|armv8|gcstress"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/bullhead-armv8-gcstress-ndebug"
+    category: "bullhead|armv8|gcstress"
+    short_name: "ndbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/fugu-debug"
+    category: "fugu"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/fugu-ndebug"
+    category: "fugu"
+    short_name: "ndbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86-cms"
+    category: "host|x86"
+    short_name: "cms"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86-debug"
+    category: "host|x86"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86-ndebug"
+    category: "host|x86"
+    short_name: "ndbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86-gcstress-debug"
+    category: "host|x86"
+    short_name: "gcs"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86-poison-debug"
+    category: "host|x86"
+    short_name: "psn"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86_64-cdex-fast"
+    category: "host|x64"
+    short_name: "cdx"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86_64-cms"
+    category: "host|x64"
+    short_name: "cms"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86_64-debug"
+    category: "host|x64"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86_64-non-gen-cc"
+    category: "host|x64"
+    short_name: "ngen"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86_64-ndebug"
+    category: "host|x64"
+    short_name: "ndbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/host-x86_64-poison-debug"
+    category: "host|x64"
+    short_name: "psn"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/walleye-armv7-poison-debug"
+    category: "walleye|armv7|poison"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/walleye-armv8-poison-debug"
+    category: "walleye|armv8|poison"
+    short_name: "dbg"
+  }
+  builders {
+    name: "buildbucket/luci.art.ci/walleye-armv8-poison-ndebug"
+    category: "walleye|armv8|poison"
+    short_name: "ndbg"
+  }
+  include_experimental_builds: true
+}
+logo_url: "https://storage.googleapis.com/chrome-infra-public/logo/art-logo.png"
diff --git a/tools/luci/config/generated/luci-notify.cfg b/tools/luci/config/generated/luci-notify.cfg
new file mode 100644
index 0000000..c509926
--- /dev/null
+++ b/tools/luci/config/generated/luci-notify.cfg
@@ -0,0 +1,331 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see ProjectConfig message:
+#   https://luci-config.appspot.com/schemas/projects:luci-notify.cfg
+
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "angler-armv7-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "angler-armv7-ndebug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "angler-armv7-non-gen-cc"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "angler-armv8-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "angler-armv8-ndebug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "angler-armv8-non-gen-cc"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "bullhead-armv7-gcstress-ndebug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "bullhead-armv8-gcstress-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "bullhead-armv8-gcstress-ndebug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "fugu-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "fugu-ndebug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86-cms"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86-gcstress-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86-ndebug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86-poison-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86_64-cdex-fast"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86_64-cms"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86_64-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86_64-ndebug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86_64-non-gen-cc"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "host-x86_64-poison-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "walleye-armv7-poison-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "walleye-armv8-poison-debug"
+  }
+}
+notifiers {
+  notifications {
+    on_new_status: FAILURE
+    on_new_status: INFRA_FAILURE
+    email {
+      recipients: "art-team+chromium-buildbot@google.com"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "walleye-armv8-poison-ndebug"
+  }
+}
diff --git a/tools/luci/config/generated/luci-notify/email-templates/default.template b/tools/luci/config/generated/luci-notify/email-templates/default.template
new file mode 100644
index 0000000..dba7b31
--- /dev/null
+++ b/tools/luci/config/generated/luci-notify/email-templates/default.template
@@ -0,0 +1,38 @@
+[Build Status] Builder "{{ .Build.Builder | formatBuilderID }}" {{ .Build.Status }}
+
+luci-notify detected a status change for builder "{{ .Build.Builder | formatBuilderID }}" at {{ .Build.UpdateTime | time }}.
+<br/>
+<table>
+  <tr>
+    <td>New status:</td>
+    <td><b>{{ .Build.Status }}</b></td>
+  </tr>
+  <tr>
+    <td>Previous status:</td>
+    <td>{{ .OldStatus }}</td>
+  </tr>
+  <tr>
+    <td>Builder:</td>
+    <td>{{ .Build.Builder | formatBuilderID }}</td>
+  </tr>
+  <tr>
+    <td>Created by:</td>
+    <td>{{ .Build.CreatedBy }}</td>
+  </tr>
+  <tr>
+    <td>Created at:</td>
+    <td>{{ .Build.CreateTime | time }}</td>
+  </tr>
+  <tr>
+    <td>Finished at:</td>
+    <td>{{ .Build.EndTime | time }}</td>
+  </tr>
+  <tr>
+    <td>Summary:</td>
+    <td>{{ .Build.SummaryMarkdown }}</td>
+  </tr>
+</table>
+<br/>
+Full details are available <a href="https://{{.BuildbucketHostname}}/build/{{.Build.Id}}">here</a>.
+<br/><br/>
+
diff --git a/tools/luci/config/generated/luci-scheduler.cfg b/tools/luci/config/generated/luci-scheduler.cfg
new file mode 100644
index 0000000..0e2818d
--- /dev/null
+++ b/tools/luci/config/generated/luci-scheduler.cfg
@@ -0,0 +1,340 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see ProjectConfig message:
+#   https://luci-config.appspot.com/schemas/projects:luci-scheduler.cfg
+
+job {
+  id: "angler-armv7-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "angler-armv7-debug"
+  }
+}
+job {
+  id: "angler-armv7-ndebug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "angler-armv7-ndebug"
+  }
+}
+job {
+  id: "angler-armv7-non-gen-cc"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "angler-armv7-non-gen-cc"
+  }
+}
+job {
+  id: "angler-armv8-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "angler-armv8-debug"
+  }
+}
+job {
+  id: "angler-armv8-ndebug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "angler-armv8-ndebug"
+  }
+}
+job {
+  id: "angler-armv8-non-gen-cc"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "angler-armv8-non-gen-cc"
+  }
+}
+job {
+  id: "bullhead-armv7-gcstress-ndebug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "bullhead-armv7-gcstress-ndebug"
+  }
+}
+job {
+  id: "bullhead-armv8-gcstress-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "bullhead-armv8-gcstress-debug"
+  }
+}
+job {
+  id: "bullhead-armv8-gcstress-ndebug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "bullhead-armv8-gcstress-ndebug"
+  }
+}
+job {
+  id: "fugu-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "fugu-debug"
+  }
+}
+job {
+  id: "fugu-ndebug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "fugu-ndebug"
+  }
+}
+job {
+  id: "host-x86-cms"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86-cms"
+  }
+}
+job {
+  id: "host-x86-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86-debug"
+  }
+}
+job {
+  id: "host-x86-gcstress-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86-gcstress-debug"
+  }
+}
+job {
+  id: "host-x86-ndebug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86-ndebug"
+  }
+}
+job {
+  id: "host-x86-poison-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86-poison-debug"
+  }
+}
+job {
+  id: "host-x86_64-cdex-fast"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86_64-cdex-fast"
+  }
+}
+job {
+  id: "host-x86_64-cms"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86_64-cms"
+  }
+}
+job {
+  id: "host-x86_64-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86_64-debug"
+  }
+}
+job {
+  id: "host-x86_64-ndebug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86_64-ndebug"
+  }
+}
+job {
+  id: "host-x86_64-non-gen-cc"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86_64-non-gen-cc"
+  }
+}
+job {
+  id: "host-x86_64-poison-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "host-x86_64-poison-debug"
+  }
+}
+job {
+  id: "walleye-armv7-poison-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "walleye-armv7-poison-debug"
+  }
+}
+job {
+  id: "walleye-armv8-poison-debug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "walleye-armv8-poison-debug"
+  }
+}
+job {
+  id: "walleye-armv8-poison-ndebug"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "walleye-armv8-poison-ndebug"
+  }
+}
+trigger {
+  id: "master-art-manifest-gitiles-trigger"
+  acl_sets: "ci"
+  triggers: "angler-armv7-debug"
+  triggers: "angler-armv7-ndebug"
+  triggers: "angler-armv7-non-gen-cc"
+  triggers: "angler-armv8-debug"
+  triggers: "angler-armv8-ndebug"
+  triggers: "angler-armv8-non-gen-cc"
+  triggers: "bullhead-armv7-gcstress-ndebug"
+  triggers: "bullhead-armv8-gcstress-debug"
+  triggers: "bullhead-armv8-gcstress-ndebug"
+  triggers: "fugu-debug"
+  triggers: "fugu-ndebug"
+  triggers: "host-x86-cms"
+  triggers: "host-x86-debug"
+  triggers: "host-x86-gcstress-debug"
+  triggers: "host-x86-ndebug"
+  triggers: "host-x86-poison-debug"
+  triggers: "host-x86_64-cdex-fast"
+  triggers: "host-x86_64-cms"
+  triggers: "host-x86_64-debug"
+  triggers: "host-x86_64-ndebug"
+  triggers: "host-x86_64-non-gen-cc"
+  triggers: "host-x86_64-poison-debug"
+  triggers: "walleye-armv7-poison-debug"
+  triggers: "walleye-armv8-poison-debug"
+  triggers: "walleye-armv8-poison-ndebug"
+  gitiles {
+    repo: "https://android.googlesource.com/platform/manifest"
+    refs: "regexp:refs/heads/master-art"
+  }
+}
+trigger {
+  id: "master-gitiles-trigger"
+  acl_sets: "ci"
+  triggers: "angler-armv7-debug"
+  triggers: "angler-armv7-ndebug"
+  triggers: "angler-armv7-non-gen-cc"
+  triggers: "angler-armv8-debug"
+  triggers: "angler-armv8-ndebug"
+  triggers: "angler-armv8-non-gen-cc"
+  triggers: "bullhead-armv7-gcstress-ndebug"
+  triggers: "bullhead-armv8-gcstress-debug"
+  triggers: "bullhead-armv8-gcstress-ndebug"
+  triggers: "fugu-debug"
+  triggers: "fugu-ndebug"
+  triggers: "host-x86-cms"
+  triggers: "host-x86-debug"
+  triggers: "host-x86-gcstress-debug"
+  triggers: "host-x86-ndebug"
+  triggers: "host-x86-poison-debug"
+  triggers: "host-x86_64-cdex-fast"
+  triggers: "host-x86_64-cms"
+  triggers: "host-x86_64-debug"
+  triggers: "host-x86_64-ndebug"
+  triggers: "host-x86_64-non-gen-cc"
+  triggers: "host-x86_64-poison-debug"
+  triggers: "walleye-armv7-poison-debug"
+  triggers: "walleye-armv8-poison-debug"
+  triggers: "walleye-armv8-poison-ndebug"
+  gitiles {
+    repo: "https://android.googlesource.com/platform/art"
+    refs: "regexp:refs/heads/master"
+  }
+}
+trigger {
+  id: "master-libcore-gitiles-trigger"
+  acl_sets: "ci"
+  triggers: "angler-armv7-debug"
+  triggers: "angler-armv7-ndebug"
+  triggers: "angler-armv7-non-gen-cc"
+  triggers: "angler-armv8-debug"
+  triggers: "angler-armv8-ndebug"
+  triggers: "angler-armv8-non-gen-cc"
+  triggers: "bullhead-armv7-gcstress-ndebug"
+  triggers: "bullhead-armv8-gcstress-debug"
+  triggers: "bullhead-armv8-gcstress-ndebug"
+  triggers: "fugu-debug"
+  triggers: "fugu-ndebug"
+  triggers: "host-x86-cms"
+  triggers: "host-x86-debug"
+  triggers: "host-x86-gcstress-debug"
+  triggers: "host-x86-ndebug"
+  triggers: "host-x86-poison-debug"
+  triggers: "host-x86_64-cdex-fast"
+  triggers: "host-x86_64-cms"
+  triggers: "host-x86_64-debug"
+  triggers: "host-x86_64-ndebug"
+  triggers: "host-x86_64-non-gen-cc"
+  triggers: "host-x86_64-poison-debug"
+  triggers: "walleye-armv7-poison-debug"
+  triggers: "walleye-armv8-poison-debug"
+  triggers: "walleye-armv8-poison-ndebug"
+  gitiles {
+    repo: "https://android.googlesource.com/platform/libcore"
+    refs: "regexp:refs/heads/master"
+  }
+}
+acl_sets {
+  name: "ci"
+  acls {
+    role: OWNER
+    granted_to: "group:project-art-admins"
+  }
+  acls {
+    granted_to: "group:all"
+  }
+}
diff --git a/tools/luci/config/generated/project.cfg b/tools/luci/config/generated/project.cfg
new file mode 100644
index 0000000..2270648
--- /dev/null
+++ b/tools/luci/config/generated/project.cfg
@@ -0,0 +1,8 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see ProjectCfg message:
+#   https://luci-config.appspot.com/schemas/projects:project.cfg
+
+name: "art"
+access: "group:all"
diff --git a/tools/luci/config/luci-notify.template b/tools/luci/config/luci-notify.template
new file mode 100644
index 0000000..dba7b31
--- /dev/null
+++ b/tools/luci/config/luci-notify.template
@@ -0,0 +1,38 @@
+[Build Status] Builder "{{ .Build.Builder | formatBuilderID }}" {{ .Build.Status }}
+
+luci-notify detected a status change for builder "{{ .Build.Builder | formatBuilderID }}" at {{ .Build.UpdateTime | time }}.
+<br/>
+<table>
+  <tr>
+    <td>New status:</td>
+    <td><b>{{ .Build.Status }}</b></td>
+  </tr>
+  <tr>
+    <td>Previous status:</td>
+    <td>{{ .OldStatus }}</td>
+  </tr>
+  <tr>
+    <td>Builder:</td>
+    <td>{{ .Build.Builder | formatBuilderID }}</td>
+  </tr>
+  <tr>
+    <td>Created by:</td>
+    <td>{{ .Build.CreatedBy }}</td>
+  </tr>
+  <tr>
+    <td>Created at:</td>
+    <td>{{ .Build.CreateTime | time }}</td>
+  </tr>
+  <tr>
+    <td>Finished at:</td>
+    <td>{{ .Build.EndTime | time }}</td>
+  </tr>
+  <tr>
+    <td>Summary:</td>
+    <td>{{ .Build.SummaryMarkdown }}</td>
+  </tr>
+</table>
+<br/>
+Full details are available <a href="https://{{.BuildbucketHostname}}/build/{{.Build.Id}}">here</a>.
+<br/><br/>
+
diff --git a/tools/luci/config/main.star b/tools/luci/config/main.star
new file mode 100755
index 0000000..b847be8
--- /dev/null
+++ b/tools/luci/config/main.star
@@ -0,0 +1,192 @@
+#!/usr/bin/env lucicfg
+#
+# Copyright (C) 2021 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+"""LUCI project configuration for the production instance of LUCI.
+
+After modifying this file execute it ('./main.star') to regenerate the configs.
+"""
+
+lucicfg.check_version("1.24.4", "Please update depot_tools")
+
+# Enable v2 bucket names in LUCI Scheduler config.
+lucicfg.enable_experiment("crbug.com/1182002")
+
+# Tell lucicfg what files it is allowed to touch.
+lucicfg.config(
+    config_dir = "generated",
+    fail_on_warnings = True,
+    lint_checks = ["default"],
+)
+
+# TODO: Switch to project-scoped service account.
+# TODO: Switch to realms.
+
+luci.project(
+    name = "art",
+    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 = [
+        # Publicly readable.
+        acl.entry(
+            roles = [
+                acl.BUILDBUCKET_READER,
+                acl.LOGDOG_READER,
+                acl.PROJECT_CONFIGS_READER,
+                acl.SCHEDULER_READER,
+            ],
+            groups = "all",
+        ),
+        acl.entry(
+            roles = [
+                acl.BUILDBUCKET_OWNER,
+                acl.SCHEDULER_OWNER,
+            ],
+            groups = "project-art-admins",
+        ),
+        acl.entry(
+            roles = acl.LOGDOG_WRITER,
+            groups = "luci-logdog-chromium-writers",
+        ),
+    ],
+)
+
+# Per-service tweaks.
+luci.logdog(gs_bucket = "chromium-luci-logdog")
+luci.milo(logo = "https://storage.googleapis.com/chrome-infra-public/logo/art-logo.png")
+
+# Resources shared by all subprojects.
+
+luci.bucket(name = "ci")
+
+luci.notifier_template(
+    name = "default",
+    body = io.read_file("luci-notify.template"),
+)
+
+luci.console_view(
+    name = "luci",
+    repo = "https://android.googlesource.com/platform/art",
+    title = "ART LUCI Console",
+    refs = ["refs/heads/master"],
+    include_experimental_builds = True,
+)
+
+luci.notifier(
+    name = "art-team+chromium-buildbot",
+    on_new_status = [
+        "FAILURE",
+        "INFRA_FAILURE",
+    ],
+    notify_emails = [
+        "art-team+chromium-buildbot@google.com",
+    ],
+)
+
+luci.gitiles_poller(
+    name = "master-gitiles-trigger",
+    bucket = "ci",
+    repo = "https://android.googlesource.com/platform/art",
+    refs = ["refs/heads/master"],
+)
+
+luci.gitiles_poller(
+    name = "master-libcore-gitiles-trigger",
+    bucket = "ci",
+    repo = "https://android.googlesource.com/platform/libcore",
+    refs = ["refs/heads/master"],
+)
+
+luci.gitiles_poller(
+    name = "master-art-manifest-gitiles-trigger",
+    bucket = "ci",
+    repo = "https://android.googlesource.com/platform/manifest",
+    refs = ["refs/heads/master-art"],
+)
+
+def ci_builder(name, category, short_name):
+    luci.builder(
+        name = name,
+        bucket = "ci",
+        executable = luci.recipe(
+            cipd_package = "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",
+            cipd_version = "refs/heads/master",
+            name = "art",
+        ),
+        dimensions = {
+            "pool": "luci.art.ci",
+
+            # Some builders require specific hardware, so we make the assignment in bots.cfg
+            "builder": name,
+        },
+        service_account = "art-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
+
+        # We have a limited set of runners, so put the expiration time close to
+        # the time it takes to run all steps on most builders.
+        expiration_timeout = 10 * time.hour,
+        execution_timeout = 37 * time.hour,
+        build_numbers = True,
+        properties = {
+            "builder_group": "client.art",
+        },
+        caches = [
+            # Directory called "art" that persists from build to build (one per bot).
+            # We can checkout and build in this directory to get fast incremental builds.
+            swarming.cache("art", name = "art"),
+        ],
+        notifies = ["art-team+chromium-buildbot"],
+        triggered_by = [
+            "master-gitiles-trigger",
+            "master-libcore-gitiles-trigger",
+            "master-art-manifest-gitiles-trigger",
+        ],
+    )
+    luci.console_view_entry(
+        console_view = "luci",
+        builder = name,
+        category = category,
+        short_name = short_name,
+    )
+
+ci_builder("angler-armv7-debug", "angler|armv7", "dbg")
+ci_builder("angler-armv7-non-gen-cc", "angler|armv7", "ngen")
+ci_builder("angler-armv7-ndebug", "angler|armv7", "ndbg")
+ci_builder("angler-armv8-debug", "angler|armv8", "dbg")
+ci_builder("angler-armv8-non-gen-cc", "angler|armv8", "ngen")
+ci_builder("angler-armv8-ndebug", "angler|armv8", "ndbg")
+ci_builder("bullhead-armv7-gcstress-ndebug", "bullhead|armv7|gcstress", "dbg")
+ci_builder("bullhead-armv8-gcstress-debug", "bullhead|armv8|gcstress", "dbg")
+ci_builder("bullhead-armv8-gcstress-ndebug", "bullhead|armv8|gcstress", "ndbg")
+ci_builder("fugu-debug", "fugu", "dbg")
+ci_builder("fugu-ndebug", "fugu", "ndbg")
+ci_builder("host-x86-cms", "host|x86", "cms")
+ci_builder("host-x86-debug", "host|x86", "dbg")
+ci_builder("host-x86-ndebug", "host|x86", "ndbg")
+ci_builder("host-x86-gcstress-debug", "host|x86", "gcs")
+ci_builder("host-x86-poison-debug", "host|x86", "psn")
+ci_builder("host-x86_64-cdex-fast", "host|x64", "cdx")
+ci_builder("host-x86_64-cms", "host|x64", "cms")
+ci_builder("host-x86_64-debug", "host|x64", "dbg")
+ci_builder("host-x86_64-non-gen-cc", "host|x64", "ngen")
+ci_builder("host-x86_64-ndebug", "host|x64", "ndbg")
+ci_builder("host-x86_64-poison-debug", "host|x64", "psn")
+ci_builder("walleye-armv7-poison-debug", "walleye|armv7|poison", "dbg")
+ci_builder("walleye-armv8-poison-debug", "walleye|armv8|poison", "dbg")
+ci_builder("walleye-armv8-poison-ndebug", "walleye|armv8|poison", "ndbg")
diff --git a/tools/luci/config/validate.sh b/tools/luci/config/validate.sh
new file mode 100755
index 0000000..7bc73da
--- /dev/null
+++ b/tools/luci/config/validate.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env sh
+# Validates that all generated outputs match main.star and also checks that
+# the star files are correctly formatted.
+#
+# TODO(reader) - Integrate this sensibly with //tools/test_presubmit.py  :)
+lucicfg validate main.star -log-level debug