crosvm/infra/config/main.star
Dennis Kempin 21ec73fc4c test runner: Allow retries of flaky tests
The test runner can now repeat tests in two ways:

- Via --repeat to run tests multiple times and fail if any one of them
  fails. Which will help us find flakes in post-submit.
- Via --retry, which will retry a test if it has failed. Which makes
  pre-submit tests more resilient to flakes.

Both can be configured by builder configs to adjust as needed.

Also slighly changes the repeat behavior to repeat tests in batches, so
we do not run the same test multiple times simultaneously, which can
cause some of them to fail. It's also easier to read the results.

BUG=b:238232551
TEST=added a random flake into some tests and used --repeat and --retry

Change-Id: I78e0ff0751da40a99a56080d9baf207307c9e93a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3751835
Tested-by: Dennis Kempin <denniskempin@google.com>
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
2022-07-08 20:41:40 +00:00

371 lines
10 KiB
Text
Executable file

#!/usr/bin/env lucicfg
lucicfg.check_version("1.30.9", "Please update depot_tools")
# Use LUCI Scheduler BBv2 names and add Scheduler realms configs.
lucicfg.enable_experiment("crbug.com/1182002")
lucicfg.config(
config_dir = "generated",
tracked_files = ["*.cfg"],
fail_on_warnings = True,
lint_checks = ["default", "-module-docstring"],
)
luci.project(
name = "crosvm",
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",
tricium = "tricium-prod.appspot.com",
bindings = [
# Allow owners to submit any task in any pool.
luci.binding(
roles = [
"role/swarming.poolOwner",
"role/swarming.poolUser",
"role/swarming.taskTriggerer",
],
groups = "mdb/crosvm-acl-luci-admin",
),
# Allow any googler to see all bots and tasks there.
luci.binding(
roles = "role/swarming.poolViewer",
groups = "googlers",
),
# Allow any googler to read/validate/reimport the project configs.
luci.binding(
roles = "role/configs.developer",
groups = "googlers",
),
],
acls = [
# Publicly readable.
acl.entry(
roles = [
acl.BUILDBUCKET_READER,
acl.LOGDOG_READER,
acl.PROJECT_CONFIGS_READER,
acl.SCHEDULER_READER,
],
groups = "all",
),
# Allow committers to use CQ and to force-trigger and stop CI builds.
acl.entry(
roles = [
acl.SCHEDULER_OWNER,
acl.CQ_COMMITTER,
],
groups = "mdb/crosvm-acl-luci-admin",
),
# Group with bots that have write access to the Logdog prefix.
acl.entry(
roles = acl.LOGDOG_WRITER,
groups = "luci-logdog-chromium-writers",
),
],
)
# Per-service tweaks.
luci.logdog(gs_bucket = "logdog-crosvm-archive")
# Realms with ACLs for corresponding Swarming pools.
luci.realm(name = "pools/ci")
luci.realm(name = "pools/try")
# Global recipe defaults
luci.recipe.defaults.cipd_version.set("refs/heads/main")
luci.recipe.defaults.cipd_package.set("infra/recipe_bundles/chromium.googlesource.com/crosvm/crosvm")
luci.recipe.defaults.use_python3.set(True)
# The try bucket will include builders which work on pre-commit or pre-review
# code.
luci.bucket(name = "try")
# The ci bucket will include builders which work on post-commit code.
luci.bucket(
name = "ci",
acls = [
acl.entry(
roles = acl.BUILDBUCKET_TRIGGERER,
groups = [
"mdb/crosvm-acl-luci-admin",
],
),
],
)
# The prod bucket will include builders which work on post-commit code and
# generate executable artifacts used by other users or machines.
luci.bucket(name = "prod")
# This sets the default CIPD ref to use in builds to get the right version of
# recipes for the build.
#
# The recipe bundler sets CIPD refs equal in name to the git refs that it
# processed the recipe code from.
#
# Note: This will cause all recipe commits to automatically deploy as soon
# as the recipe bundler compiles them from your refs/heads/main branch.
cipd_version = "refs/heads/main"
# Configure Change Verifier to watch crosvm
luci.cq(
status_host = "chromium-cq-status.appspot.com",
)
luci.cq_group(
name = "main",
watch = cq.refset(
repo = "https://chromium.googlesource.com/crosvm/crosvm",
refs = ["refs/heads/.+"], # will watch all branches
),
)
# Console showing all postsubmit verify builders
luci.console_view(
name = "Postsubmit",
repo = "https://chromium.googlesource.com/crosvm/crosvm",
)
# View showing all infra builders
luci.list_view(
name = "Infra",
)
# Allows builders to send email notifications on failures.
luci.notifier(
name = "postsubmit-failures",
on_status_change = True,
notify_emails = [
"denniskempin@google.com",
],
)
luci.notifier(
name = "infra-failures",
on_status_change = True,
notify_emails = [
"denniskempin@google.com",
],
)
def verify_builder(
name,
dimensions,
presubmit = True,
postsubmit = True,
properties = dict(),
presubmit_properties = dict(),
postsubmit_properties = dict(),
category = "generic",
**args):
"""Creates both a CI and try builder with the same properties.
The CI builder is attached to the gitlies poller and console view, and the try builder
is added to the change verifier.
Args:
name: Name of the builder
dimensions: Passed to luci.builder
presubmit: Create a presubmit builder (defaults to True)
postsubmit: Create a postsubmit builder (defaults to True)
category: Category of this builder in the concole view
properties: Builder properties for both presubmit and postsubmit
presubmit_properties: Builder properties for only presubmit
postsubmit_properties: Builder properties for only postsubmit
**args: Passed to luci.builder
"""
# CI builder
if postsubmit:
props = dict(**properties)
props.update(postsubmit_properties)
luci.builder(
name = name,
bucket = "ci",
service_account = "crosvm-luci-ci-builder@crosvm-infra.iam.gserviceaccount.com",
dimensions = dict(pool = "luci.crosvm.ci", **dimensions),
notifies = ["postsubmit-failures"],
properties = props,
**args
)
luci.gitiles_poller(
name = "main source",
bucket = "ci",
repo = "https://chromium.googlesource.com/crosvm/crosvm",
triggers = ["ci/%s" % name],
)
luci.console_view_entry(
console_view = "Postsubmit",
builder = "ci/%s" % name,
category = category,
)
# Try builder
if presubmit:
props = dict(**properties)
props.update(presubmit_properties)
luci.builder(
name = name,
bucket = "try",
service_account = "crosvm-luci-try-builder@crosvm-infra.iam.gserviceaccount.com",
dimensions = dict(pool = "luci.crosvm.try", **dimensions),
properties = props,
**args
)
# Attach try builder to Change Verifier
luci.cq_tryjob_verifier(
builder = "try/%s" % name,
cq_group = "main",
)
def verify_linux_builder(arch, crosvm_direct = False, **kwargs):
"""Creates a verify builder that builds crosvm on linux
Args:
arch: Architecture to build and test
crosvm_direct: Test crosvm-direct instead of crosvm
**kwargs: Passed to verify_builder
"""
name = "linux_%s" % arch
if crosvm_direct:
name += "_direct"
verify_builder(
name = name,
dimensions = {
"os": "Ubuntu",
"cpu": "x86-64",
},
executable = luci.recipe(
name = "build_linux",
),
properties = {
"test_arch": arch,
"crosvm_direct": crosvm_direct,
},
postsubmit_properties = {
"repeat_tests": 10,
},
presubmit_properties = {
"retry_tests": 2,
},
caches = [
swarming.cache("builder", name = "linux_builder_cache"),
],
category = "linux",
**kwargs
)
def verify_chromeos_builder(board, **kwargs):
"""Creates a verify builder that builds crosvm for ChromeOS
Args:
board: ChromeOS board to build and test
**kwargs: Passed to verify_builder
"""
verify_builder(
name = "chromeos_%s" % board,
dimensions = {
"os": "Ubuntu",
"cpu": "x86-64",
},
executable = luci.recipe(
name = "build_chromeos",
),
properties = {
"board": board,
},
category = "linux",
**kwargs
)
def infra_builder(name, postsubmit, **args):
"""Creates a ci job to run infra recipes that are not involved in verifying changes.
The builders are added to a separate infra dashboard.
Args:
name: Name of the builder
postsubmit: True if the builder should run after each submitted commit.
**args: Passed to luci.builder
"""
luci.builder(
name = name,
bucket = "ci",
service_account = "crosvm-luci-ci-builder@crosvm-infra.iam.gserviceaccount.com",
dimensions = {
"pool": "luci.crosvm.ci",
"os": "Ubuntu",
"cpu": "x86-64",
},
notifies = ["infra-failures"],
**args
)
if postsubmit:
luci.gitiles_poller(
name = "main source",
bucket = "ci",
repo = "https://chromium.googlesource.com/crosvm/crosvm",
triggers = ["ci/%s" % name],
)
luci.list_view_entry(
list_view = "Infra",
builder = "ci/%s" % name,
)
verify_linux_builder("x86_64")
verify_linux_builder("x86_64", crosvm_direct = True)
verify_linux_builder("aarch64")
verify_linux_builder("armhf")
verify_chromeos_builder("amd64-generic", presubmit = False)
verify_builder(
name = "windows",
dimensions = {
"os": "Windows",
"cpu": "x86-64",
},
executable = luci.recipe(
name = "build_windows",
),
presubmit = False,
category = "windows",
)
verify_builder(
name = "health_check",
dimensions = {
"os": "Ubuntu",
"cpu": "x86-64",
},
executable = luci.recipe(
name = "health_check",
),
caches = [
swarming.cache("builder", name = "linux_builder_cache"),
],
category = "linux",
)
infra_builder(
name = "push_to_github",
executable = luci.recipe(
name = "push_to_github",
),
postsubmit = True,
)
infra_builder(
name = "update_chromeos_merges",
executable = luci.recipe(
name = "update_chromeos_merges",
),
schedule = "0,30 * * * *", # Run every 30 minutes
postsubmit = False,
)