This reverts commit f827eb3a78.
Reason for revert: The tests being run, and the results being compared to, are changing dramatically, causing all sorts of test results going from [status] -> Skipped and from New Test -> [status].
Something is really going wrong.
Original change's description:
> Balance tests equally across shards.
>
> The sharded test runner invocations are now passed the previous results
> which contains the test timing, which are used to simulate how long each
> shard would take to run. The shards are now balanced as evenly as
> possible on a test level, taking multiple cores into account.
>
> Sharded tests are now run starting with the slowest test first, such
> that extremely long running tests finish as early as possible. This
> behavior ensures the cores are saturated and can be padded with fast
> tests near the end, rather than waiting for a few slow tests to complete
> while the rest of the system is idle.
>
> The algorithm works very well whenever it's able to accurately predict
> the time to run shards. In a number of cases, the model doesn't quite
> reflect reality and the data, which makes it fairly imperfect but still
> reasonably good. I think a second order feedback loop might kick in once
> it reorders the tests across shards and the test timing data reflects
> the new test timings.
>
> Multitests are no longer always sent to the same shard, since the data
> isn't available at the moment, and the change as-is speeds up the test
> running considerably.
>
> The front end unit test suites currently ignore the feature as there are
> no benefits yet to improving those quick shards.
>
> Upgrade the language version to 3.0.0 so patterns can be used and fix
> a mixin not being a mixin.
>
> Fixes: b/291585137
> Change-Id: I3cc1b1d96038d5b46e836b091e299097717c226c
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/314081
> Reviewed-by: William Hesse <whesse@google.com>
> Commit-Queue: Jonas Termansen <sortie@google.com>
Change-Id: I233e4bfa6d6ecf0cea4f97c1e47f1635f7b9040c
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/315060
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Auto-Submit: William Hesse <whesse@google.com>
Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
tools/bots
This folder contains scripts and configuration files used by Dart's continuous integration and testing infrastructure.
Test matrix
The file test_matrix.json defines the test configurations run by Dart's CI
infrastructure. Changes to the test matrix affect all builds that include them.
Structure
The test matrix is a JSON document and consists of the "filesets" object, the
"configurations" list, and the "builder_configurations" list as well as a
"branches" list.
Filesets
The file sets define files and/or directories that need to be present for a test
configuration at runtime. Any directory specified will be included along with
its subdirectories recursively. Directory names must have a / at the end. All
paths are relative to the SDK checkout's root directory.
"filesets": {
"a_fileset_name": [
"a/directory/",
"a/file"
],
"another_fileset_name": [
"another/directory/",
"another/file"
]
}
Configurations
The configurations describe all named configurations that the CI infrastructure supports. It consists of a list of configuration descriptions.
Each configuration description defines one or more configuration names using a
simple template syntax, where a group (a|b|c) means taking each of the
options for a different configuration name. The set of all configuration names
is the result of picking each combination of group options.
The configuration name implicitly defines the options of the configuration
(system, architecture, compiler, etc.), but additional options can be given in
an options field.
"configurations": {
"unittest-(linux|win|mac)": {
"options": {
"compiler": "dartk",
"mode": "release",
}},
Builder Configurations
The builder configurations describes all test configurations a specific builder must execute. Each builder configuration is an object that specifies which builders it applies to, defines the build steps for the builders, and some additional metadata. Only one builder configuration can apply to a builder.
"builder_configurations": [
{
"builders": [
"a-builder",
"another-builder"
],
"meta": {
"description": "Description of this configuration."
},
"steps": [
]
}
]
Each step is an object and must have a name. A step may also specify a script to
run instead of the default script: tools/test.py. Additional arguments may be
specified. These arguments will be passed to the script.
Inside arguments, the following variables will be expanded to values extracted from the builder name:
${mode}: the mode in which to run the tests; e.g.,release,debug${arch}: architecture to run the tests on; e.g.,ia32,x64$[system}: the system on which to run the tests; e.g.,win,linux,mac${runtime}: the runtime to use to run the tests; e.g.,vm,chrome,d8
"steps": [
{
"name": "build it",
"script": "tools/build.py",
"arguments": ["--a-flag", "target", "another_target"]
},
{
"name": "test it",
"arguments": ["-nconfiguration-${system}"]
}
]
A step that uses the script tools/test.py either explicitly or by default is
called a "test step". Test steps must include the -n command line argument to
select one of the named configurations defined in the configurations section.
A step using the default script may also be sharded across many machines using
the "shards" parameter. If a step is sharded, it must specify a "fileset".
Only the files and directories defined by the file set will be available to the
script when it's running on a shard.
{
"name": "shard the tests",
"shards": 10,
"fileset": "a_fileset_name"
}
Builders
Builder name parsing
The builder names are split by '-' and each part is then examined if it is an
option. Options can be runtimes (e.g. "chrome"), architectures (e.g. x64) and
operating system families (e.g. win). For each valid option, additional
arguments are passed to the tools/build.py script.
Adding a new builder
To add a builder:
- Decide on a name.
- Add the builder name to a new or existing configuration.
- File an issue labelled "area-infrastructure" to get your builder activated.
Testing a new or modified builder
Builders can be tested using a tool called led that is included in
depot_tools. Replace buildername and CL number with the correct values and run:
led get-builder luci.dart.ci:<builder name> | \
led edit-cr-cl 'https://dart-review.googlesource.com/c/<cl number>' | \
led launch
Adding a builder to the commit queue
For now, file an issue labeled "area-infrastructure" to get your builder added to the commit queue.
Glossary
Builder
A builder has a name and defines the steps the need to be run when it is executed by a bot. In general, a builder defines how to build and test software.
Bot
A physical or virtual machine (or even a docker container) that executes all commands it receives. Often, these commands are the steps defined by a builder.
Sharding
Sharded steps copy all files in a file set to as many bots as specified and runs the same command on all of the shards. Each shard has a shard number. The shard number and the total number of shards are passed as arguments to the command. The command is then responsible for running a subset of its work on each shard based on these arguments.