# Flutter LUCI Service Configurations

Contains configuration and tools related to Flutter's build infrastructure.

Configuration is generated by `lucicfg`, which is part of `depot_tools`. Rather
than updating the individual .cfg files, updates should be made to
`config/main.star`. That file can then be run to regenerate the configuration.

## Updating the configuration

- Edit the desired `.star` files (do not edit `.cfg` files; those are generated).
- Execute `./config/main.star`.
- Observe that the `.cfg` files have been updated (e.g. via `git status`).
- Create a pull request containing changes both to the `.star` files and `.cfg` files.
- Review and submit the pull request as normal.
- Changes propagate to LUCI automatically. Go to [LUCI config UI][3]
  to check that new changes have been applied.

## Adding new framework test shards

This section talks about test shards defined in [dev/bots/test.dart][1] used to
split framework tests into smaller chunks that can be tested in parallel. This
does _not_ refer to [LUCI/Swarming][4] shards.

When you add a new shard it does not automatically run in LUCI. To add it to
LUCI you need to add a new builder in the [framework_config.star][2]. Typically,
you'll add two builders, one "try" builder that tests PRs, and one "prod" builder
that tests submitted PRs on the master branch.

Here's an example of a "try" builder:

```
    common.linux_try_builder(
        name = "Linux web_tests|web_tests",
        recipe = "flutter/flutter",
        repo = repos.FLUTTER,
        list_view_name = list_view_name,
        properties = {
            "shard": "web_tests",
            "subshards": ["0", "1", "2", "3", "4", "5", "6", "7_last"],
            "dependencies": [{"dependency": "android_sdk"}, {"dependency": "chrome_and_driver"}, {"dependency": "goldctl"}],
        },
        caches = [
            swarming.cache(name = "pub_cache", path = ".pub_cache"),
            swarming.cache(name = "android_sdk", path = "android29"),
        ],
    )
```

The easiest way to add a new one is to copy an existing builder and tweak the
parameters.

### Testing new shards

As of today, it is not possible to test configuration changes until after they
propagated to LUCI. One way to mitigate the risk of breakage is to run your test
shard using an existing builder. To do that, find a builder in one of the
`.star` files (e.g. `framework_config.star`) that satisfies the dependencies of
the new test shard, then use the `led` tool (bundled with `depot_tools`) to run
it.

For example, let's say you are adding an integration test shard for web, and the
new shard needs a Linux builder with Chrome and ChromeDriver in order to run.
Luckily, there's already the `Linux web_tests` builder that satisfies these
dependencies. To test the new shard, use the `Linux web_tests` builder, but ask
it to run a different shards and/or subshard. Let's say the new test shard is
called "foo", it has 3 subshards (0, 1, 2_last) and it's currently staged in pull
request 99999. You can run it using the following `led` command:

```
led get-builder "luci.flutter.try:Linux web_tests" \
  | led edit -pa git_ref='refs/pull/99999/head' \
  | led edit -pa git_url='https://github.com/flutter/flutter' \
  | led edit -pa shard='foo' \
  | led edit -pa subshard='1' \
  | led launch
```

## Forcing the propagation of these configurations

One may speed up the propagation of the
new configuration files by visiting the
[luci-config web ui][3], logging in, and
searching for projects/flutter. from there, one may click on the
projects/flutter search result and click the download icon to force an update.

[1]: https://github.com/flutter/flutter/blob/master/dev/bots/test.dart
[2]: https://flutter.googlesource.com/infra/+/refs/heads/main/README.md
[3]: https://luci-config.appspot.com/#/projects/flutter
[4]: https://www.chromium.org/developers/testing/isolated-testing/infrastructure
