Update builder configs
diff --git a/ci/builders/README.md b/ci/builders/README.md
index 12fcaac..4cba7ca 100644
--- a/ci/builders/README.md
+++ b/ci/builders/README.md
@@ -1,131 +1,85 @@
-## SUMMARY
+# Flutter Engine Build Definition Language
-Flutter Engine Build Definition Language uses json to describe a complex build using a combination of sub-builds, archives, generators and dependencies. It simplifies sharding by mapping build inputs to workflows listing explicitly the generated artifacts. The build definition language along with the Engine Recipes V2 and the generation of artifacts using GN+Ninja set the groundwork for efficient builds with dependency reusability.
+The ***Flutter Engine Build Definition Language*** describes a build on CI
+by defining a combination of *sub-builds*, *archives*, *generators* and *dependencies*. It
+makes it simple to shard sub-builds by mapping build inputs to workflows, and listing
+the sub-build-generated artifacts explicitly. The Build Definition Language, Engine
+Recipes V2 and the generation of artifacts using GN+Ninja set the groundwork
+for efficient builds with dependency reusability.
-**Author: Godofredo Contreras (godofredoc)**
+**Author: Godofredo Contreras (godofredoc)**\
+**Go Link: flutter.dev/go/engine-build-definition-language**\
+**Created:** 01/2023 / **Last updated:** 04/2023
-**Go Link: flutter.dev/go/engine-build-definition-language**
+## Glossary
-**Created:** 01/2023 / **Last updated: **01/2023
-
-
-## WHAT PROBLEM IS THIS SOLVING?
-
-Engine builds are a complex combination of recipe source code, gn+ninja commands, fuzzy dependencies hidden by running everything in a single builder, and multiple helper scripts using bash and python to generate artifacts combining build system outputs. This complexity is error prone and impacts the velocity of the whole team as adding|removing|updating artifacts require multiple coordinated pull requests and an in-depth knowledge of the engine source code, build system, recipes and infrastructure.
-
-The build definition language targets the following goals:
-
-
-
-
-
-* Remove complexity of the engine build system describing the builds in a single place and using a common language.
-* Remove the requirement for engine developers to learn recipes and python.
-* Make slow builds faster with automated and efficient sharding.
-* Add clarity about what a build is doing by clearly defining its components.
-* Simplify builds by separating build, test, generate and archive steps.
-* Get early feedback through presubmit on changes adding/deleting/updating engine artifacts.
-
-
-## BACKGROUND
-
-Engine builds use LUCI recipes to build, test and archive artifacts. The workflow requires to checkout the engine repository, run gn, run ninja, create artifacts and upload them to GCS. These steps are implemented differently for different platforms usually by copy/pasting blocks of recipe code. This copy/paste process generated a large and complex [engine.py](https://cs.opensource.google/flutter/recipes/+/main:recipes/engine/engine.py) recipe (2K+ lines of code) which is difficult to update/maintain without breaking the builds.
-
-Having the build logic as a sequence of build steps in a monolithic recipe makes it very difficult to identify dependencies in between sub-builds, sometimes duplicating logic in multiple places and making it very difficult for engineers to add/remove logic.
-
-
-#### Audience
-
-Flutter Engine contributors that add/update/remove builds, platforms and artifacts from the build system.
-
-
-#### Glossary
-
-
-
-* **[recipes](https://github.com/luci/recipes-py)** - domain specific language for specifying sequences of subprocess calls in a cross-platform and testable way.
-* **Generator **- scripts in dart, python or bash that generates artifacts combining the output of sub-builds.
-* **Builder** - a combination of configuration and recipes used with a given commit to build artifacts and test them.
-* **Build** - a builder running with specific properties, repository and commit.
-* **[Gn](https://gn.googlesource.com/gn/)**, a meta-build system that generates build files for [Ninja](https://ninja-build.org/).
-* **[Ninja](https://ninja-build.org)**, Ninja is a small build system with a focus on speed.
-* **CAS**, a service that stores arbitrary binary blobs addressed by (hash of) their content. It is specialized for low latency, high volume query/read/write operations.
-
-
-## OVERVIEW
-
-To describe engine builds in a generic and scalable way we are creating a build definition language that supports all the current build use cases. The definition language is using json to describe builds, tests, archives, and dependency relations.
-
-This definition language will be used by generic recipes to trigger independent build units in different machines using cas for intermediate storage and an orchestrator recipe that collects and integrates the multiple pieces.
-
-On top of the current use cases the definition language also supports configurations for code signing and describing the artifacts explicitly. These two new use cases are required for the implementation of SLSA requirements and the implementation of a single command Flutter SDK release.
-
-The definition language makes heavy use of GN and Ninja to move most of the build/test/archive logic to the flutter/engine repository. This will help us remove most of the logic from recipes and make the recipes implementation generic and reusable by Dart & Flutter teams.
-
-
-#### Non-goals
-
-Using a format different from json to describe the engine builds.
-
+* **[recipes](https://github.com/luci/recipes-py)** - domain specific
+language for specifying sequences of subprocess calls in a cross-platform and
+testable way.
+* **Generator** - scripts in Dart, python or bash that combine the output of
+sub-builds to generate artifacts.
+* **Builder** - a combination of configuration, recipes and a given commit to
+build and test artifacts.
+* **Build** - a builder running with specific properties, repository and
+commit.
+* **[GN](https://gn.googlesource.com/gn/)** - a meta-build system that
+generates build files for [Ninja](https://ninja-build.org/).
+* **[Ninja](https://ninja-build.org)** - Ninja is a small build system with a
+focus on speed.
+* **CAS** - a service that stores arbitrary binary blobs addressed by (hash of)
+their content. It is specialized for low latency, high volume query/read/write
+operations.
## USAGE EXAMPLES
-Engine builds will be translated one to one using the build definition language with one file per build. The build definition files will be stored in the [flutter/engine/ci/builders](https://cs.opensource.google/flutter/engine/+/main:ci/builders/) directory.
+Engine build definition files using the Build Definition Language can be found in the
+[flutter/engine/ci/builders](https://github.com/flutter/engine/tree/main/ci/builders) directory.
-The [engine orchestrator recipe](https://cs.opensource.google/flutter/recipes/+/main:recipes/engine_v2/) will read the file, shard builds, collect artifacts and upload them to the Google Cloud Storage bucket where they are downloaded by the Flutter Tool.
+The [engine orchestrator recipe](https://flutter.googlesource.com/recipes/+/refs/heads/main/recipes/engine_v2/)
+reads each file in that directory, shards their builds, collects artifacts and
+uploads them to the Google Cloud Storage bucket.
-Ci\_yaml file is the glue sticking all the components together. A new build will be added to the [.ci.yaml](https://cs.opensource.google/flutter/engine/+/main:.ci.yaml) file with a property pointing to the build definition file to be used by engine\_v2 recipes. The following is an example of a build configuration referencing [android\_aot\_engine.json](https://cs.opensource.google/flutter/engine/+/main:ci/builders/mac_android_aot_engine.json):
+The [.ci.yaml file](https://github.com/flutter/engine/blob/main/.ci.yaml) at the
+root of the `flutter/engine` repository puts all the components together.
+Builds are specified in that file using a property pointing to the build definition
+file to be used by engine\_v2 recipes. Full documentation of the `.ci.yaml` file format
+can be found [in the Cocoon repository here](https://github.com/flutter/cocoon/blob/main/CI_YAML.md).
+The following is a sample build configuration referencing
+[android\_aot\_engine.json](https://github.com/flutter/engine/blob/main/ci/builders/mac_android_aot_engine.json)
+in the `config_name` under `properties`:
-```
+```yaml
- name: Mac mac_android_aot_engine
recipe: engine_v2/engine_v2
timeout: 60
properties:
config_name: mac_android_aot_engine
$flutter/osx_sdk : >-
- { "sdk_version": "14a5294e" }
+ { "sdk_version": "14e300c" }
```
+## Build Definition Language Assumptions
+To keep the build definition language simple the following assumptions were
+made during its design:
-## DETAILED DESIGN/DISCUSSION
+* A build can be expressed as a set of independent sub-builds.
+* A sub-build can be defined as a sequence of a `gn` configuration step,
+ a `ninja` build step, followed by self-contained test scripts, and self-contained
+ generator scripts. All the elements are optional allowing to use gn+ninja without
+ generators or generators without gn+ninja.
+* All the sub-builds required by a global generator are defined within the same
+configuration file.
-Flutter's LUCI Infrastructure uses the engine build configuration language to build, test and archive the engine artifacts. The goal of the configurations using the build definition language is to move all the build, test and archive logic out of recipes and bring it to the engine repository.
+## Build configuration file
-The following is a non-exhaustive list of the benefits of moving to build configurations files:
+The build configuration is a json file containing a list of builds, tests,
+generators and archives. The following is an example of an empty configuration
+file:
-
-
-* No need to coordinate changes to recipes, engine and build configurations when adding new builds or artifacts.
-* Adding new artifacts can be tested on presubmit.
-* Having the archive logic in GN ensures the artifacts are created correctly, the expected dependencies are built, and the archives contain only what is generated by the build targets and their dependencies.
-* The builds are simplified to a GN command followed by a ninja command.
-* Artifacts are explicitly described in the configuration allowing post processing tasks like code signing.
-* Scripts used as generators either local or global follow a very simple interface to ensure they can be plugged out of the box in the build system.
-
-
-### Assumptions
-
-To keep the build definition language simple the following assumptions were made during its design:
-
-
-
-* A build can be expressed as a set of independent sub-builds.
-* A sub-build can be defined as a sequence of gn, ninja, self contained test scripts, self contained generator scripts.
-* All the sub-builds required by a global generator are defined within the same configuration file.
-
-
-### Build configuration language
-
-
-#### Build configuration file
-
-The build configuration is a json file containing a list of builds, tests, generators and archives. The following is an example of an empty configuration file:
-
-
-```
+```json
{
"builds": [],
"tests": [],
@@ -137,303 +91,529 @@
}
```
+Note: tests, generators and archives can be omited if empty.
-Build configuration files have to be checked into the engine[/ci/builder](https://github.com/flutter/engine/tree/main/ci/builders) directory where engine v2 recipes will be reading them from.
+Build configuration files have to be checked into the
+[engine_checkout/ci/builder](https://github.com/flutter/engine/tree/main/ci/builders)
+directory where engine v2 recipes will be reading them from.
-A configuration file defines a top level builder that will show up as a column in the [Flutter Dashboard](https://flutter-dashboard.appspot.com/#/build?repo=engine&branch=master).
+Configurations with a single build are supported. Single build configurations
+are located have to be checked into the
+[engine_checkout/ci/builder/standalone](https://github.com/flutter/engine/tree/main/ci/builders/standalone)
+A configuration file defines a top-level builder that will show up as a column
+in the
+[Flutter Dashboard](https://flutter-dashboard.appspot.com/#/build?repo=engine&branch=master).
-#### Build
+### Build
-A build is a dictionary with a gn command, a ninja command, zero or more generator commands, zero or more local tests, zero or more local generators and zero or more output artifacts.
+A build is a dictionary with a gn command, a ninja command, zero or more
+generator commands, zero or more local tests, zero or more local
+generators and zero or more output artifacts.
The following is the high level structure of the build component:
-
-```
+```json
{
"archives": [],
"drone_dimensions": [],
"gclient_variables": {},
"gn": [],
"name": "host_debug",
+ "generators": [],
"ninja": {},
"tests": []
}
```
+Each build element will be translated to an independent sub-build and its
+entire out directory will be uploaded to CAS.
-Each build element will be translated to an independent sub-build and its entire out directory will be uploaded to CAS.
+`gn`, `ninja`, `generators` and `tests` properties are optional. Gn and
+ninja properties can be used without generators or tests. Generators with
+no gn and ninja properties is also supported.
+#### Archives
-##### Archive
+An archive component is used to tell the recipes which artifacts are
+generated by the build and where to upload them.
-An archive component is used to tell the recipes which artifacts are generated by the build and where to upload them.
+By default the build output is archived to CAS in order to be used
+as a dependency for global tests. If no CAS archive
+is required `cas_archive": false,` needs to be added to the
+configuration.
-
-
-
-```
+```json
{
"name": "host_debug",
"base_path": "out/host_debug/zip_archives/",
"type": "gcs",
"include_paths": [
"out/host_debug/zip_archives/linux-x64/artifacts.zip"
- ]
+ ],
+ "realm": "production"
}
```
-
Description of the fields:
+* **name:** - by default the entire build output is uploaded to CAS.
+ `name` is used to associate the CAS hash to a value that can be referenced
+ later as a dependency of global tests. Name is also used to select the folder
+ from within src/out to upload to CAS. e.g if the build generates
+ src/out/host_debug name must be `host_debug`.
+* **base\_path:** - the portion of the path to remove from the full path before
+ uploading to its final destination. In the example the above the
+ base\_path **“out/host\_debug/zip\_archives”** will be removed from the
+ include path **"out/host\_debug/zip\_archives/linux-x64/artifacts.zip"**
+ before uploading to GCS, e.g.
+ <bucket>/flutter/<commit>/linux-x64/artifacts.zip.
+* **Type:** - the type of storage to use. Currently only **“gcs”** and
+**“cas”** are supported. "gcs" uploads artifacts to GCS
+and "cas" to archive to CAS service. Cas value is used during development where
+we need to inspect the generated artifacts without worrying about location or
+cleanups. Gcs is expected for any artifacts being consumed by the flutter tool.
+* **Include\_paths:** - a list of strings with the paths to be uploaded to a
+given destination.
+* **cas_archive** - a boolean value indicating whether the build output will
+be archived to CAS or not. The default value is true.
+* **realm** - a string value of either `production` or `experimental`
+where production means the artifact will be uploaded to the location expected
+by the flutter tool and experimental will add an `experimental` prefix to the
+path to avoid interfering with production artifacts.
+#### Drone\_dimensions
-* **Name:** Used to identify the archive inside CAS.
-* **Base\_path:** The portion of the path to remove before uploading to its destination. In the example the base\_path **“out/host\_debug/zip\_archives”** will be extracted from the include path **"out/host\_debug/zip\_archives/linux-x64/artifacts.zip"** before uploading to GCS, e.g. <bucket>/flutter/<commit>/linux-x64/artifacts.zip.
-* **Type:** The type of storage to use. Currently only **“GCS”** and **“CAS”** are supported.
-* **Include\_paths:** A list of strings representing paths to artifacts generated by the build that need to be uploaded to a given destination.
+A list of strings with key value pairs separated by an equal sign. These
+dimensions are used to select the bot where the sub-build will be running.
+To find the list of valid keys and values you need to select a [bot from the
+swarming UI](https://chromium-swarm.appspot.com/botlist?c=id&c=task&c=os&c=status&d=asc&f=pool%3Aluci.flex.try&k=pool&s=id).
+On the `dimensions` section the left column contains the keys and
+the right column contains the allowed values. If multiple values are allowed
+for a key they are separated using `|` (pipe symbol).
-##### Drone\_dimensions
-
-A list of strings with key value pairs separated by an equal sign. These dimensions are used to select the bot where the sub-build will be running.
-
-
-```
-"drone_dimensions": [ "device_type=none",
+```json
+"drone_dimensions": [
+ "device_type=none",
"os=Linux"
]
```
+In the previous example, the build containing this drone\_dimensions component
+will run on a bot with a Linux OS that does not have any devices attached to it.
-In the previous example, the build containing this drone\_dimensions component will run on a bot with a Linux OS that does not have any devices attached to it.
+Drone dimensions accept values separates by `|` to specify more than one value
+for the dimension. E.g. assuming the pool of bots have Ubuntu and Debian bots
+a dimension of `"os": "Debian|Ubuntu"` will resolve to use bots running either
+Debian or Ubuntu.
+#### Gclient\_variables
-##### Gclient\_variables
+A dictionary with variables passed to gclient during a gclient sync operation.
+They are usually used to add or remove gclient dependencies.
-A dictionary with the gclient variable as key and its content as value. This dictionary is passed to gclient during a gclient sync operation to add/remove gclient dependencies.
-
-
-```
+```json
"gclient_variables": {
"download_android_deps": false
}
```
+The example above is used to avoid downloading the
+[android sdk dependencies](https://cs.opensource.google/flutter/engine/+/main:DEPS;l=80)
+in builders that do not need it.
-The example above is used to avoid downloading the [android sdk dependencies](https://cs.opensource.google/flutter/engine/+/main:DEPS;l=80) in builders that do not need it.
+#### GN
+A list of strings representing flags passed to the
+[tools/gn](https://github.com/flutter/engine/blob/main/tools/gn) script. The strings can be in the form of “--flag=value” or
+“--flag” followed by “value”.
-##### Gn
-
-A list of strings representing flags passed to the [tools/gn](https://cs.opensource.google/flutter/engine/+/master:tools/gn?q=gn&ss=flutter%2Fengine) script. The strings can be in the form of “--flag=value” or “--flag” followed by “value”.
-
-
-```
+```json
"gn": [
- "--runtime-mode",
- "debug",
- "--prebuilt-dart-sdk",
- "--build-embedder-examples"
- ],
+ "--runtime-mode",
+ "debug",
+ "--prebuilt-dart-sdk",
+ "--build-embedder-examples"
+],
```
+The previous example will prepare the configurations to build a host debug
+version using a prebuilt dart sdk and also build the embedder examples.
-The previous example will prepare the configurations to build a host debug version using a prebuilt dart sdk and also build the embedder examples.
+#### Ninja
+A dictionary with two keys: “config” which references the configs created by gn
+and “target” which is a list of strings with the Ninja targets to build.
-##### Ninja
-
-A dictionary with two keys: “config” which references the configs created by gn and “target” which is a list of strings with the Ninja targets to build.
-
-
-```
+```json
"ninja": {
- "config": "host_debug",
- "targets": [
- "flutter/build/archives:artifacts",
- "flutter/build/archives:embedder",
- ]
- },
+ "config": "host_debug",
+ "targets": [
+ "flutter/build/archives:artifacts",
+ "flutter/build/archives:embedder",
+ ]
+},
```
+In the example above the ninja command will use the configuration for
+host\_debug and will build artifacts and embedder targets as described
+by the
+[flutter/build/archives/BUILD.gn](https://github.com/flutter/engine/blob/main/build/archives/BUILD.gn)
+file.
-In the example above the ninja command will use the configuration for host\_debug and will build artifacts and embedder targets as described by the [flutter/build/archives/BUILD.gn](https://cs.opensource.google/flutter/engine/+/master:build/archives/BUILD.gn) file.
+#### Tests
-
+This section of the build configuration is also known as local tests. It
+contains a list of dictionaries with configurations for scripts and
+parameters used to run tests inside the current build unit. These tests
+should not reference or use anything outside of the commit checkout or
+the outputs generated by running gn and ninja sections of the build
+configuration.
-
-##### Tests
-
-This section of the build configuration will be referred to as the local tests. This section contains a list of dictionaries with configurations for the scripts and parameters used to run tests inside the current build unit. These tests should not reference or use anything outside of the commit checkout or the outputs generated by running the gn and ninja sections of the build config.
-
-
+```json
+"tests": [
+ {
+ "language": "python3",
+ "name": "Host Tests for host_debug_impeller_vulkan",
+ "parameters": [
+ "--variant",
+ "host_debug_impeller_vulkan",
+ "--type",
+ "impeller-vulkan",
+ "--engine-capture-core-dump"
+ ],
+ "script": "flutter/testing/run_tests.py",
+ "contexts": ["android_virtual_device"]
+ }
+]
```
- "tests": [
- {
- "language": "python3",
- "name": "Host Tests for host_debug_impeller_vulkan",
- "parameters": [
- "--variant",
- "host_debug_impeller_vulkan",
- "--type",
- "impeller-vulkan",
- "--engine-capture-core-dump"
- ],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
- }
- ]
-```
-
Description of the fields:
+* **language** - the executable used to run the script, e.g. python3, bash.
+In general any executable found in the path can be used as language. The
+default is empty which means no interpreter will be used to run the script
+and it is assumed the script is already an executable with the right
+permissions to run in the target platform.
+* **name** - the name of the step running the script.
+* **parameters** - flags or parameters passed to the script. Parameters
+accept magic environment variables(placeholders replaced before executing
+the test). Magic environment variables have the following limitations:
+only `${FLUTTER_LOGS_DIR}` is currently supported and it needs to be used
+alone within the parameter string(e.g. `["${FLUTTER_LOGS_DIR}"]` is OK
+but `["path=${FLUTTER_LOGS_DIR}"]` is not).
+* **Script** - the path to the script to execute relative to the checkout
+directory.
+* **contexts** - a list of available contexts to add to the text execution step.
+The list of supported contexts can be found [here](https://flutter.googlesource.com/recipes/+/refs/heads/main/recipe_modules/flutter_deps/api.py#687). As of 06/20/23 two contexts are supported:
+"android_virtual_device" and "metric_center_token".
+The test scripts will run in a deferred context (failing the step only after
+logs have been uploaded). Tester and builder recipes provide an environment
+variable called FLUTTER\_LOGS\_DIR pointing a temporary directory where the
+test runner can place any logs|artifacts needed to debug issues. At the end
+of the test execution the content of FLUTTER\_LOGS\_DIR will be uploaded to
+Google Cloud Storage before signaling the pass | fail test state.
-* **Language,** the executable used to run the script, e.g. python3.
-* **Name,** the name of the step running the script.
-* **Parameters**, flags or parameters passed to the script.
-* **Script**, the path to the script to execute relative to the checkout directory.
-* **Type**, the test type. (Deprecate? Test on the build config will be always local)
+Contexts are free form python contexts that communicate with the test script
+through environment variables. E.g. metric_center_token saves an access token
+to an [environment variable "token_path"](https://flutter.googlesource.com/recipes/+/refs/heads/main/recipe_modules/token_util/api.py#14) for the test to access it.
-The test scripts will run in a deferred context (failing the step only after logs have been uploaded). The tester and builder recipes provide an environment variable called FLUTTER\_LOGS\_DIR pointing a temporary directory where the test runner can place any logs|artifacts needed to debug issues. At the end of the test execution the content of FLUTTER\_LOGS\_DIR will be uploaded to Google Cloud Storage before signaling the pass | fail test state.
-
-Note that to keep the recipes generic they don’t know anything about what the test script is doing and it is the responsibility of the test script to copy the relevant files to the FLUTTER\_LOGS\_DIR directory.
-
+Note that to keep the recipes generic they don’t know anything about what
+the test script is doing and it is the responsibility of the test script to
+copy the relevant files to the FLUTTER\_LOGS\_DIR directory.
#### Generators
-Generators are scripts used to generate artifacts combining the output of two or more sub-builds. The most common use case is to generate FAT binaries for Mac/iOS artifacts.
+Generators are scripts used to generate artifacts combining the output of two
+or more sub-builds. The most common use case is to generate universal binaries for
+Mac/iOS artifacts.
-Generators can be written in any language but they require to follow some guidance to make them compatible with the engine build system.
+Generators can be written in any language but they are required to follow some
+guidelines to make them compatible with the engine build system.
The guidelines are as follows:
+* Flags receiving paths to resources from multiple sub-builds need to use paths
+relative to the checkout (`src/`) directory. If there are global generators in a build
+configuration, the engine\_v2 recipes will download the full sub-build archives
+to the src/out/<sub-build name> directory.
+* Flags receiving paths to output directories must use paths relative to the
+src/out folder. This is to be able to reference the artifacts in the global
+archives section.
+* The script is in charge of generating the final artifact, e.g. if the script
+generates multiple files that will be zipped later, then it is the responsibility
+of the script to generate the final zip.
+* If the generator is producing a Mac/iOS artifact, then it is the responsibility
+of the script to embed the signing metadata.
+Generators contain a single property “tasks” which is a list of tasks to be
+performed.
-* Flags receiving paths to resources from multiple sub-builds need to use paths relative to the checkout directory. If there are global generators in a build configuration, the engine\_v2 recipes will download the full archives of the sub-builds to the checkout/out/<sub-build name> directory.
-* Flags receiving paths to output directories must use paths relative to the out folder. This is to be able to reference the artifacts in the global archives section.
-* The script is in charge of generating the final artifact, e.g. if the script generates multiple files that will be zipped later then it is the script responsibility to generate the final zip.
-* If the generator is producing a Mac/iOS artifact then it is the script responsibility to embed the signing metadata.
-
-Generators contain a single property “tasks” which is a list of tasks to be performed.
-
-
-```
+```json
"generators": {
- "tasks": []
+ "tasks": []
}
```
-
-The example above represents a generator configuration with an empty list of tasks.
-
+The example above represents a generator configuration with an empty list
+of tasks.
##### Task
-Task is a dictionary describing the scripts to be executed.
+A `task` is a dictionary describing the scripts to be executed.
-The properties description is as follows:
+The property's description is as follows:
+* **Name** - the name of the step running the script.
+* **Parameters** - flags passed to the script. Both input and output paths must
+be relative to the checkout directory.
+* **Script**, the script path relative to the checkout repository.
+* **Language**, the script language executable to run the script. If empty it is assumed to be bash.
+```json
+{
+ "name": "Debug-FlutterMacOS.framework",
+ "parameters": [
+ "--dst",
+ "out/debug",
+ "--arm64-out-dir",
+ "out/ios_debug",
+ "--simulator-x64-out-dir",
+ "out/ios_debug_sim",
+ "--simulator-arm64-out-dir",
+ "out/ios_debug_sim_arm64"
+ ],
+ "script": "flutter/sky/tools/create_full_ios_framework.py",
+ "language": "python3"
+}
+```
-* **Name**, the name of the step running the script.
-* **Parameters**, flags passed to the script. Both input and output paths must be relative to the checkout directory.
-* **Script**, the script path relative to the checkout repository.
-* **Language**, the script language executable to run the script. If empty it is assumed to be bash.
+### Global Tests
- ```
+Tests in this section run on a separate bot as independent sub-builds.
+As opposed to tests running within builds, global tests have access to the
+the outputs of all the builds running in the same orchestrator build. A
+use case for global tests is to run flutter/framework tests using the
+artifacts generated by an specific engine build.
+
+Global tests currently support two different scenarios:
+
+* flutter/flutter tests with [tester](https://flutter.googlesource.com/recipes/+/refs/heads/main/recipes/engine_v2/tester.py)
+ recipe. This workflow checks out flutter/flutter to run any of the existing
+ sharded tests using the engine artifacts archived to GCS.
+* complicated engine tests that require the outputs from multiple subbuilds
+ with [tester_engine](https://flutter.googlesource.com/recipes/+/refs/heads/main/recipes/engine_v2/tester_engine.py).
+ This workflow checks out [flutter/engine] and operates over the dependencies passed to it using cas.
+
+Note: the supported scenarios can be later extended to support running devicelab tests although a
+[smart scheduler](https://github.com/flutter/flutter/issues/128294) is a prerequisite for
+it to be scalable(build/test separation model).
+
+Framework test example:
+
+```json
+{
+ "tests": [
{
- "name": "Debug-FlutterMacOS.framework",
- "parameters": [
- "--dst",
- "out/debug",
- "--arm64-out-dir",
- "out/ios_debug",
- "--simulator-x64-out-dir",
- "out/ios_debug_sim",
- "--simulator-arm64-out-dir",
- "out/ios_debug_sim_arm64"
- ],
- "script": "flutter/sky/tools/create_full_ios_framework.py",
- "language": "python3"
- }
-```
-
-
-
-
-#### Archives
-
-The archives component provides instructions to upload the artifacts generated by the global generators. Is a list of dictionaries with two keys: source and destination. Source is a path relative to the checkout repository and destination is a relative path to <bucket>/flutter/<commit>.
-
-
-```
- "archives": [
- {
- "source": "out/debug/artifacts.zip",
- "destination": "ios/artifacts.zip"
- },
- {
- "source": "out/debug/ios-objcdoc.zip",
- "destination": "ios-objcdoc.zip"
- }
+ "name": "web-tests-1",
+ "shard": "web_tests",
+ "subshard": "1",
+ "test_dependencies": [
+ {
+ "dependency": "chrome_and_driver",
+ "version": "version:111.0a"
+ }
+ ]
+ }
]
+}
```
+The property's description is as follows:
-The example above will cause the file <checkout>/out/debug/artifacts.zip to be uploaded <bucket>/flutter/<commit>/ios/artifacts.zip.
+* **name** the name that will be assigned to the sub-build.
+* **shard** the flutter/flutter shard test to run. The supported shard names can be found
+on the flutter framework [test.dart](https://github.com/flutter/flutter/blob/master/dev/bots/test.dart#L244).
+* **subshard** one of the accepted subshard values for shard. Sub-shards are defined as part
+of the shard implementation, please look at the corresponding shard implementation to find the
+accepted values.
+* **test_dependencies** a list of [dependencies](https://flutter.googlesource.com/recipes/+/refs/heads/main/recipe_modules/flutter_deps/api.py#75)
+ required for the test to run.
+Engine test example:
-### ACCESSIBILITY
+```json
+{
+ "tests": [
+ {
+ "name": "test: lint android_debug_arm64",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "dependencies": [
+ "host_debug",
+ "android_debug_arm64"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint android_debug_arm64",
+ "parameters": [
+ "--variant",
+ "android_debug_arm64",
+ "--lint-all",
+ "--shard-id=0",
+ "--shard-variants=host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ }
+ ]
+}
+```
-N/A
+The property's description is as follows:
+* **name** the name to assign to the sub-build.
+* **recipe** the recipe name to use if different than tester.
+* **drone_dimensions** a list of strings with key values to select the
+ bot where the test will run.
+* **dependencies** a list of build outputs required
+ by the test. These build outputs are referenced by the name of build
+ generating the output. This type of dependency is shared using CAS and
+ the contents are mounted in checkout/src/out. E.g. a build configuration
+ building the `host_engine` configuration will upload the content of
+ checkout/src/out/host_engine to CAS and a global test with a `host_engine`
+ dependency will mount the content of host engine in the same location of
+ the bot running the test.
+* **tasks** a list of dictionaries representing scripts and parameters to run them.
-### INTERNATIONALIZATION
+Example task configuration:
-N/A.
+```json
+{
+ "name": "test: lint android_debug_arm64",
+ "parameters": [
+ "--variant",
+ "android_debug_arm64",
+ "--lint-all",
+ "--shard-id=0",
+ "--shard-variants=host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+}
+```
+The property's description is as follows:
-### INTEGRATION WITH EXISTING FEATURES
+* **name** the name assigned to the step running the script.
+* **parameters** a list of parameters passed to the script execution.
+* **max_attempts** an integer with the maximum number of runs in case of failure.
+* **script** the path relative to checkout/src/ to run.
-The build definition language will force all the artifacts to be generated with GN+Ninja. This will require a carefully designed strategy to replace the artifacts with minimal disruption.
+### Global Generators
-A migration to simpler and more scalable recipes will be required to achieve all the goals of the build definition language. A deprecation of the old recipes will be also necessary to remove all the technical debt.
+Global generators follow the same format as local generators but defined at
+the build top level. The main difference is that global generators can create
+new artifacts combining outputs of multiple sub-builds.
-From the developers point of view we can expect some disruption with multiple land -> revert -> re-land cycles. For Flutter users there will be no difference as they will receive the same files with the same content even though they are generated differently.
+### Global Archives
+The archives component provides instructions to upload the artifacts generated
+by the global generators. Is a list of dictionaries with three keys: `source` and
+`destination`, and `realm`. `source` is a path relative to the checkout repository,
+`destination` is a relative path to <bucket>/flutter/<commit>, and `realm` is
+a string with either `production` or `experimental` value.
-## OPEN QUESTIONS
+The realm value is used to build the destination path of the artifacts.
+`production` will upload the artifacts to the location expected by the flutter
+tool and `experimental` will add experimental as a prefix to the path to avoid
+interfering with the production artifacts.
+```json
+"archives": [
+ {
+ "source": "out/debug/artifacts.zip",
+ "destination": "ios/artifacts.zip",
+ "realm": "production"
+ },
+ {
+ "source": "out/debug/ios-objcdoc.zip",
+ "destination": "ios-objcdoc.zip",
+ "realm": "experimental"
+ }
+]
+```
+The example above will cause the file <checkout>/out/debug/artifacts.zip to
+be uploaded <bucket>/flutter/<commit>/ios/artifacts.zip.
-* Once the build definition language is feature complete should it use protos rather than json? Is the effort worthy?
+## Triaging global generators
+Global generators can run locally if all their sub-build dependencies are
+downloaded. This section explains how to triage a local generator.
-## TESTING PLAN
+The instructions on this section can be used to triage problems with artifacts
+created by glocal generators(E.g.`Debug|Release|Profile-ios-Flutter.xcframework`)
+using the build outputs of CI subbuilds. During the migration to engine v2 we had
+a regression in the size of the flutter libraries, using this process we were able
+to inspect the files as they were generated by the CI, make changes to the generators
+and run the generators locally to validate the fixes.
-Configuration files will be created and used with builders running in parallel to the production ones. The builders using the new build configuration files will run on the staging environment for several weeks before moving them to production.
+### Prerequisites (one time installation)
-The artifacts generated by GN+Ninja will be released with the old recipes to ensure their content is correct and complete.
+#### Install CAS utility
-Artifacts generated by builders using the configuration language will be using GN+Ninja artifacts exclusively. Once all those artifacts are validated with the old recipes the builds using the configuration language will be moved to production and the old recipes deprecated and removed.
+CAS client is required to download the sub-build artifacts. To install
+it in your machine run the following steps:
+* `mkdir $HOME/tools`
+* Download and unzip CAS binaries from
+ [https://chrome-infra-packages.appspot.com/p/infra/tools/luci/cas]
+* Add $HOME/tools to path and your ~/.bashrc
-## DOCUMENTATION PLAN
+#### Gclient engine checkout
-The main purpose of this document is to describe the build definition language. Once it has been reviewed most of the content of this document will be adapted to markup and will be merged along the build configuration files in the engine repository.
+Create a gclient checkout following instructions from
+[Setting up the engine environment](https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment).
-This document, the document describing [GN+Ninja artifacts](https://flutter.dev/go/gn-ninja-engine-artifacts), the document describing the engine v2 recipes and the document with the plan to speed up engine builds will be added to the flutter wiki page.
+### Download sub-builds to the gclient checkout out folder
+CAS sub-build artifacts can be downloaded using information from a LUCI build.
+Using [https://ci.chromium.org/p/flutter/builders/prod/Mac%20mac_ios_engine/2818]
+as an example the execution details from steps 13 - 17 show the commands to
+download the archives. `-dir` parameter needs to be updated to point to the
+relative or full path to the out folder in your gclient checkout.
-## MIGRATION PLAN
+These are the commands to execute for our example build:
-The migration to use the build definition language depends on the release | validation of the GN + Ninja artifacts. Once that part is complete two changes will need to be coordinated:
+```bash
+pushd <gclient checkout>/src/out
+cas download -cas-instance projects/chromium-swarm/instances/default_instance -digest 39f15436deaed30f861bdd507ba6297f2f26a2ff13d45acfd8819dbcda346faa/88 -dir ./
+cas download -cas-instance projects/chromium-swarm/instances/default_instance -digest bdec3208e70ba5e50ee7bbedaaff4588d3f58167ad3d8b1c46d29c6ac3a18c00/94 -dir ./
+cas download -cas-instance projects/chromium-swarm/instances/default_instance -digest d19edb65072aa9d872872b55d3c270db40c6a626c8a851ffcb457a28974f3621/84 -dir ./
+cas download -cas-instance projects/chromium-swarm/instances/default_instance -digest ac6f08662d18502cfcd844771bae736f4354cb3fe209552fcf2181771e139e0b/86 -dir ./
+cas download -cas-instance projects/chromium-swarm/instances/default_instance -digest 1d4d1a3b93847451fe69c1939d7582c0d728b198a40abd06f43d845117ef3214/86 -dir ./
+```
+The previous commands will create the ios_debug, ios_debug_sim, ios_debug_sim_arm64,
+ios_profile, and ios_release folders with the artifacts generated by its
+corresponding sub-builds.
+Once the checkout and dependencies are available locally we can cd|pushd to the
+root of the client checkout and run the global generator. The command can be
+copied verbatim from the executions details of the build.
-* A change in the engine repository to remove the old build configurations from .ci.yaml file and updating the artifact destination in the builds using the build definition language will be landed.
-* A change to remove old recipes will be landed in the recipes repository.
+The following example will run the generator to create the ios artifacts:
+
+```bash
+python3 flutter/sky/tools/create_full_ios_framework.py --dst out/release \
+--arm64-out-dir out/ios_release --simulator-x64-out-dir out/ios_debug_sim \
+--simulator-arm64-out-dir out/ios_debug_sim_arm64 --dsym --strip
+```
diff --git a/ci/builders/linux_android_aot_engine.json b/ci/builders/linux_android_aot_engine.json
index 6523c0b..5065d67 100644
--- a/ci/builders/linux_android_aot_engine.json
+++ b/ci/builders/linux_android_aot_engine.json
@@ -11,16 +11,14 @@
"out/android_profile/zip_archives/android-arm-profile/linux-x64.zip",
"out/android_profile/zip_archives/android-arm-profile/symbols.zip",
"out/android_profile/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--runtime-mode",
"profile",
@@ -37,8 +35,7 @@
"flutter/shell/platform/android:embedding_jars",
"flutter/shell/platform/android:abi_jars"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -51,16 +48,14 @@
"out/android_release/zip_archives/android-arm-release/linux-x64.zip",
"out/android_release/zip_archives/android-arm-release/symbols.zip",
"out/android_release/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--runtime-mode",
"release",
@@ -77,8 +72,7 @@
"flutter/shell/platform/android:embedding_jars",
"flutter/shell/platform/android:abi_jars"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -92,16 +86,14 @@
"out/android_release_arm64/zip_archives/android-arm64-release/symbols.zip",
"out/android_release_arm64/zip_archives/android-arm64-release/analyze-snapshot-linux-x64.zip",
"out/android_release_arm64/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--runtime-mode",
"release",
@@ -119,7 +111,21 @@
"flutter/shell/platform/android:analyze_snapshot"
]
},
- "tests": []
+ "tests": [
+ {
+ "name": "Generate treemap for android_release_arm64",
+ "language": "python3",
+ "script": "third_party/dart/runtime/third_party/binary_size/src/run_binary_size_analysis.py",
+ "parameters": [
+ "--library",
+ "../../src/out/android_release_arm64/libflutter.so",
+ "--destdir",
+ "${FLUTTER_LOGS_DIR}",
+ "--addr2line-binary",
+ "../../src/third_party/android_tools/ndk/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line"
+ ]
+ }
+ ]
},
{
"archives": [
@@ -130,18 +136,17 @@
"include_paths": [
"out/android_profile_arm64/zip_archives/android-arm64-profile/artifacts.zip",
"out/android_profile_arm64/zip_archives/android-arm64-profile/linux-x64.zip",
+ "out/android_profile_arm64/zip_archives/android-arm64-profile/symbols.zip",
"out/android_profile_arm64/zip_archives/android-arm64-profile/analyze-snapshot-linux-x64.zip",
"out/android_profile_arm64/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--android",
"--runtime-mode",
@@ -158,8 +163,7 @@
"flutter/shell/platform/android:abi_jars",
"flutter/shell/platform/android:analyze_snapshot"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -173,16 +177,14 @@
"out/android_profile_x64/zip_archives/android-x64-profile/symbols.zip",
"out/android_profile_x64/zip_archives/android-x64-profile/analyze-snapshot-linux-x64.zip",
"out/android_profile_x64/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--runtime-mode",
"profile",
@@ -199,8 +201,7 @@
"flutter/shell/platform/android:abi_jars",
"flutter/shell/platform/android:analyze_snapshot"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -214,16 +215,14 @@
"out/android_release_x64/zip_archives/android-x64-release/symbols.zip",
"out/android_release_x64/zip_archives/android-x64-release/analyze-snapshot-linux-x64.zip",
"out/android_release_x64/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--runtime-mode",
"release",
@@ -240,9 +239,19 @@
"flutter/shell/platform/android:abi_jars",
"flutter/shell/platform/android:analyze_snapshot"
]
- },
- "tests": []
+ }
}
],
- "tests": []
+ "generators": {
+ "tasks": [
+ {
+ "name": "Verify-export-symbols-release-binaries",
+ "parameters": [
+ "src/out"
+ ],
+ "script": "flutter/testing/symbols/verify_exported.dart",
+ "language": "dart"
+ }
+ ]
+ }
}
diff --git a/ci/builders/linux_android_debug_engine.json b/ci/builders/linux_android_debug_engine.json
index 0b75b1e..0b6f203 100644
--- a/ci/builders/linux_android_debug_engine.json
+++ b/ci/builders/linux_android_debug_engine.json
@@ -9,7 +9,8 @@
"include_paths": [
"out/android_jit_release_x86/zip_archives/android-x86-jit-release/artifacts.zip",
"out/android_jit_release_x86/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -44,8 +45,7 @@
"--android-variant",
"android_jit_release_x86"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -61,7 +61,8 @@
"out/android_debug/zip_archives/download.flutter.io",
"out/android_debug/zip_archives/sky_engine.zip",
"out/android_debug/zip_archives/android-javadoc.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -97,8 +98,7 @@
"--android-variant",
"android_debug"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -112,16 +112,14 @@
"out/android_debug_arm64/zip_archives/android-arm64/artifacts.zip",
"out/android_debug_arm64/zip_archives/android-arm64/symbols.zip",
"out/android_debug_arm64/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--android",
"--android-cpu=arm64",
@@ -134,8 +132,28 @@
"flutter",
"flutter/shell/platform/android:abi_jars"
]
- },
- "tests": []
+ }
+ },
+ {
+ "cas_archive": false,
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gn": [
+ "--android",
+ "--android-cpu=arm64",
+ "--no-lto",
+ "--enable-vulkan-validation-layers"
+ ],
+ "name": "android_debug_arm64_validation_layers",
+ "ninja": {
+ "config": "android_debug_arm64",
+ "targets": [
+ "flutter",
+ "flutter/shell/platform/android:abi_jars"
+ ]
+ }
},
{
"archives": [
@@ -147,16 +165,14 @@
"out/android_debug_x86/zip_archives/android-x86/artifacts.zip",
"out/android_debug_x86/zip_archives/android-x86/symbols.zip",
"out/android_debug_x86/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--android",
"--android-cpu=x86",
@@ -169,8 +185,7 @@
"flutter",
"flutter/shell/platform/android:abi_jars"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -182,16 +197,14 @@
"out/android_debug_x64/zip_archives/android-x64/artifacts.zip",
"out/android_debug_x64/zip_archives/android-x64/symbols.zip",
"out/android_debug_x64/zip_archives/download.flutter.io"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
- "download_android_deps": false
- },
"gn": [
"--android",
"--android-cpu=x64",
@@ -204,9 +217,19 @@
"flutter",
"flutter/shell/platform/android:abi_jars"
]
- },
- "tests": []
+ }
}
],
- "tests": []
+ "generators": {
+ "tasks": [
+ {
+ "name": "Verify-export-symbols-release-binaries",
+ "parameters": [
+ "src/out"
+ ],
+ "script": "flutter/testing/symbols/verify_exported.dart",
+ "language": "dart"
+ }
+ ]
+ }
}
diff --git a/ci/builders/linux_arm_host_engine.json b/ci/builders/linux_arm_host_engine.json
index 3b4d5cd..2c85d9b 100644
--- a/ci/builders/linux_arm_host_engine.json
+++ b/ci/builders/linux_arm_host_engine.json
@@ -8,14 +8,15 @@
"base_path": "out/linux_profile_arm64/zip_archives/",
"include_paths": [
"out/linux_profile_arm64/zip_archives/linux-arm64-profile/linux-arm64-flutter-gtk.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -32,8 +33,7 @@
"targets": [
"flutter/shell/platform/linux:flutter_gtk"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -46,14 +46,15 @@
"out/linux_debug_arm64/zip_archives/linux-arm64/font-subset.zip",
"out/linux_debug_arm64/zip_archives/linux-arm64-debug/linux-arm64-flutter-gtk.zip",
"out/linux_debug_arm64/zip_archives/dart-sdk-linux-arm64.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -72,8 +73,7 @@
"flutter/tools/font-subset",
"flutter/shell/platform/linux:flutter_gtk"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -83,14 +83,15 @@
"base_path": "out/linux_release_arm64/zip_archives/",
"include_paths": [
"out/linux_release_arm64/zip_archives/linux-arm64-release/linux-arm64-flutter-gtk.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Linux"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -106,9 +107,7 @@
"targets": [
"flutter/shell/platform/linux:flutter_gtk"
]
- },
- "tests": []
+ }
}
- ],
- "tests": []
+ ]
}
diff --git a/ci/builders/linux_clang_tidy.json b/ci/builders/linux_clang_tidy.json
new file mode 100644
index 0000000..95e39e9
--- /dev/null
+++ b/ci/builders/linux_clang_tidy.json
@@ -0,0 +1,185 @@
+{
+ "builds": [
+ {
+ "archives": [],
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gn": [
+ "--android",
+ "--android-cpu",
+ "arm64",
+ "--no-lto"
+ ],
+ "name": "android_debug_arm64",
+ "ninja": {
+ "config": "android_debug_arm64"
+ }
+ },
+ {
+ "archives": [],
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gn": [
+ "--runtime-mode",
+ "debug",
+ "--prebuilt-dart-sdk",
+ "--no-lto"
+ ],
+ "name": "host_debug",
+ "ninja": {
+ "config": "host_debug"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "name": "test: lint host_debug 0",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux",
+ "cores=32"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint host_debug",
+ "parameters": [
+ "--variant",
+ "host_debug",
+ "--lint-all",
+ "--shard-id=0",
+ "--shard-variants=host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ },
+ {
+ "name": "test: lint host_debug 1",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux",
+ "cores=32"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint host_debug",
+ "parameters": [
+ "--variant",
+ "host_debug",
+ "--lint-all",
+ "--shard-id=1",
+ "--shard-variants=host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ },
+ {
+ "name": "test: lint host_debug 2",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux",
+ "cores=32"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug",
+ "android_debug_arm64"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint host_debug",
+ "parameters": [
+ "--variant",
+ "host_debug",
+ "--lint-all",
+ "--shard-id=2",
+ "--shard-variants=host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ },
+ {
+ "name": "test: lint host_debug 3",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux",
+ "cores=32"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug",
+ "android_debug_arm64"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint host_debug",
+ "parameters": [
+ "--variant",
+ "host_debug",
+ "--lint-all",
+ "--shard-id=3",
+ "--shard-variants=host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ },
+ {
+ "name": "test: lint android_debug_arm64",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux",
+ "cores=32"
+ ],
+ "dependencies": [
+ "host_debug",
+ "android_debug_arm64"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint android_debug_arm64",
+ "parameters": [
+ "--variant",
+ "android_debug_arm64",
+ "--lint-all",
+ "--shard-id=0",
+ "--shard-variants=host_debug,host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ }
+ ]
+}
diff --git a/ci/builders/linux_fuchsia.json b/ci/builders/linux_fuchsia.json
new file mode 100644
index 0000000..8af5dc0
--- /dev/null
+++ b/ci/builders/linux_fuchsia.json
@@ -0,0 +1,205 @@
+{
+ "builds": [
+ {
+ "archives": [],
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--fuchsia",
+ "--fuchsia-cpu",
+ "arm64",
+ "--runtime-mode",
+ "profile"
+ ],
+ "name": "fuchsia_profile_arm64",
+ "ninja": {
+ "config": "fuchsia_profile_arm64",
+ "targets": [
+ "flutter/shell/platform/fuchsia:fuchsia"
+ ]
+ }
+ },
+ {
+ "archives": [],
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--fuchsia",
+ "--fuchsia-cpu",
+ "arm64",
+ "--runtime-mode",
+ "release"
+ ],
+ "name": "fuchsia_release_arm64",
+ "ninja": {
+ "config": "fuchsia_release_arm64",
+ "targets": [
+ "flutter/shell/platform/fuchsia:fuchsia"
+ ]
+ }
+ },
+ {
+ "archives": [],
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--fuchsia",
+ "--fuchsia-cpu",
+ "arm64",
+ "--runtime-mode",
+ "debug",
+ "--no-lto"
+ ],
+ "name": "fuchsia_debug_arm64",
+ "ninja": {
+ "config": "fuchsia_debug_arm64",
+ "targets": [
+ "flutter/shell/platform/fuchsia:fuchsia",
+ "fuchsia_tests"
+ ]
+ }
+ },
+ {
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--fuchsia",
+ "--fuchsia-cpu",
+ "x64",
+ "--runtime-mode",
+ "profile"
+ ],
+ "name": "fuchsia_profile_x64",
+ "ninja": {
+ "config": "fuchsia_profile_x64",
+ "targets": [
+ "flutter/shell/platform/fuchsia:fuchsia"
+ ]
+ }
+ },
+ {
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--fuchsia",
+ "--fuchsia-cpu",
+ "x64",
+ "--runtime-mode",
+ "release"
+ ],
+ "name": "fuchsia_release_x64",
+ "ninja": {
+ "config": "fuchsia_release_x64",
+ "targets": [
+ "flutter/shell/platform/fuchsia:fuchsia"
+ ]
+ }
+ },
+ {
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--fuchsia",
+ "--fuchsia-cpu",
+ "x64",
+ "--runtime-mode",
+ "debug",
+ "--no-lto"
+ ],
+ "name": "fuchsia_debug_x64",
+ "ninja": {
+ "config": "fuchsia_debug_x64",
+ "targets": [
+ "flutter/shell/platform/fuchsia:fuchsia",
+ "fuchsia_tests"
+ ]
+ }
+ }
+ ],
+ "generators": {
+ "tasks": [
+ {
+ "name": "Upload fuchsia artifacts",
+ "parameters": [
+ "--engine-version",
+ "HEAD",
+ "--skip-build"
+ ],
+ "script": "flutter/tools/fuchsia/build_fuchsia_artifacts.py",
+ "language": "python3"
+ },
+ {
+ "name": "Upload to CIPD for arch: arm64",
+ "parameters": [
+ "--engine-version",
+ "HEAD",
+ "--target-arch",
+ "arm64",
+ "--out-dir",
+ "/b/s/w/ir/x/w/recipe_cleanup/tmppqs4ecj7",
+ "--symbol-dirs",
+ "out/fuchsia_debug_arm64/.build-id",
+ "out/fuchsia_profile_arm64/.build-id",
+ "out/fuchsia_release_arm64/.build-id"
+ ],
+ "script": "flutter/tools/fuchsia/merge_and_upload_debug_symbols.py",
+ "language": "python3"
+ },
+ {
+ "name": "Upload to CIPD for arch: x64",
+ "parameters": [
+ "--engine-version",
+ "HEAD",
+ "--target-arch",
+ "x64",
+ "--out-dir",
+ "/b/s/w/ir/x/w/recipe_cleanup/tmppqs4ecj7",
+ "--symbol-dirs",
+ "out/fuchsia_debug_x64/.build-id",
+ "out/fuchsia_profile_x64/.build-id",
+ "out/fuchsia_release_x64/.build-id"
+ ],
+ "script": "flutter/tools/fuchsia/merge_and_upload_debug_symbols.py",
+ "language": "python3"
+ },
+ {
+ "name": "Verify-export-symbols-release-binaries",
+ "parameters": [
+ "src/out"
+ ],
+ "script": "flutter/testing/symbols/verify_exported.dart",
+ "language": "dart"
+ }
+ ]
+ }
+}
diff --git a/ci/builders/linux_host_desktop_engine.json b/ci/builders/linux_host_desktop_engine.json
index f9368b0..55a45cd 100644
--- a/ci/builders/linux_host_desktop_engine.json
+++ b/ci/builders/linux_host_desktop_engine.json
@@ -8,7 +8,8 @@
"type": "gcs",
"include_paths": [
"out/host_debug/zip_archives/linux-x64-debug/linux-x64-flutter-gtk.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -30,8 +31,7 @@
"targets": [
"flutter/shell/platform/linux:flutter_gtk"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -41,7 +41,8 @@
"type": "gcs",
"include_paths": [
"out/host_profile/zip_archives/linux-x64-profile/linux-x64-flutter-gtk.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -64,8 +65,7 @@
"targets": [
"flutter/shell/platform/linux:flutter_gtk"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -75,7 +75,8 @@
"type": "gcs",
"include_paths": [
"out/host_release/zip_archives/linux-x64-release/linux-x64-flutter-gtk.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -97,9 +98,7 @@
"targets": [
"flutter/shell/platform/linux:flutter_gtk"
]
- },
- "tests": []
+ }
}
- ],
- "tests": []
+ ]
}
diff --git a/ci/builders/linux_host_engine.json b/ci/builders/linux_host_engine.json
index 5c90e31..e80f11c 100644
--- a/ci/builders/linux_host_engine.json
+++ b/ci/builders/linux_host_engine.json
@@ -22,8 +22,7 @@
"flutter",
"flutter/sky/packages"
]
- },
- "tests": []
+ }
},
{
"archives": [],
@@ -61,8 +60,7 @@
"impeller-vulkan",
"--engine-capture-core-dump"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -78,7 +76,8 @@
"out/host_debug/zip_archives/linux-x64/font-subset.zip",
"out/host_debug/zip_archives/flutter_patched_sdk.zip",
"out/host_debug/zip_archives/dart-sdk-linux-x64.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -118,8 +117,7 @@
"dart",
"--engine-capture-core-dump"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -167,8 +165,7 @@
"dart,engine",
"--engine-capture-core-dump"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -180,7 +177,8 @@
"type": "gcs",
"include_paths": [
"out/host_release/zip_archives/flutter_patched_sdk_product.zip"
- ]
+ ],
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -225,11 +223,34 @@
"dart,engine,benchmarks",
"--engine-capture-core-dump"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
+ },
+ {
+ "language": "bash",
+ "name": "Generate metrics test",
+ "script": "flutter/testing/benchmark/generate_metrics.sh"
+ },
+ {
+ "language": "bash",
+ "name": "Upload metrics dry-run",
+ "parameters": [
+ "--no-upload"
+ ],
+ "script": "flutter/testing/benchmark/upload_metrics.sh"
}
]
}
],
- "tests": []
+ "generators": {
+ "tasks": [
+ {
+ "name": "Verify-export-symbols-release-binaries",
+ "parameters": [
+ "src/out"
+ ],
+ "script": "flutter/testing/symbols/verify_exported.dart",
+ "language": "dart"
+ }
+ ]
+ }
}
diff --git a/ci/builders/linux_unopt.json b/ci/builders/linux_unopt.json
index f718a45..6096792 100644
--- a/ci/builders/linux_unopt.json
+++ b/ci/builders/linux_unopt.json
@@ -3,11 +3,9 @@
{
"drone_dimensions": [
"device_type=none",
- "os=Linux"
+ "os=Linux",
+ "cores=32"
],
- "gclient_variables": {
- "download_android_deps": false
- },
"gn": [
"--runtime-mode",
"debug",
@@ -62,6 +60,11 @@
"out/host_debug_unopt/flutter_tester",
"flutter/shell/testing/observatory/empty_main.dart"
]
+ },
+ {
+ "language": "dart",
+ "name": "test: Lint android host",
+ "script": "flutter/tools/android_lint/bin/main.dart"
}
]
},
diff --git a/ci/builders/linux_web_engine.json b/ci/builders/linux_web_engine.json
index ddb871b..944ec6b 100644
--- a/ci/builders/linux_web_engine.json
+++ b/ci/builders/linux_web_engine.json
@@ -1,4 +1,6 @@
{
+ "_comment": "THIS IS A GENERATED FILE. Do not edit this file directly.",
+ "_comment2": "See `generated_builder_json.dart` for the generator code",
"builds": [
{
"name": "web_tests/artifacts",
@@ -70,8 +72,7 @@
"name": "web_tests/test_bundles/dart2js-html-engine",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -93,8 +94,7 @@
"name": "web_tests/test_bundles/dart2js-html-html",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -116,8 +116,7 @@
"name": "web_tests/test_bundles/dart2js-html-ui",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -139,8 +138,7 @@
"name": "web_tests/test_bundles/dart2js-canvaskit-canvaskit",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -162,8 +160,7 @@
"name": "web_tests/test_bundles/dart2js-canvaskit-ui",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -185,8 +182,7 @@
"name": "web_tests/test_bundles/dart2js-skwasm-skwasm_stub",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -208,8 +204,7 @@
"name": "web_tests/test_bundles/dart2wasm-html-engine",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -231,8 +226,7 @@
"name": "web_tests/test_bundles/dart2wasm-html-html",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -254,8 +248,7 @@
"name": "web_tests/test_bundles/dart2wasm-html-ui",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -277,8 +270,7 @@
"name": "web_tests/test_bundles/dart2wasm-canvaskit-canvaskit",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -300,8 +292,7 @@
"name": "web_tests/test_bundles/dart2wasm-canvaskit-ui",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -323,8 +314,7 @@
"name": "web_tests/test_bundles/dart2wasm-skwasm-ui",
"drone_dimensions": [
"device_type=none",
- "os=Linux",
- "cores=32"
+ "os=Linux"
],
"generators": {
"tasks": [
@@ -365,7 +355,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -401,7 +391,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -437,7 +427,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -473,7 +463,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -509,7 +499,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -545,7 +535,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -581,7 +571,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -617,7 +607,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -833,7 +823,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -869,7 +859,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -905,7 +895,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -941,7 +931,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -977,7 +967,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1013,7 +1003,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1049,7 +1039,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1085,7 +1075,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1281,7 +1271,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1317,7 +1307,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1353,7 +1343,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1389,7 +1379,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1425,7 +1415,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1461,7 +1451,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1497,7 +1487,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1533,7 +1523,7 @@
},
{
"dependency": "chrome_and_driver",
- "version": "version:111.0a"
+ "version": "version:114.0"
}
],
"tasks": [
@@ -1549,4 +1539,4 @@
]
}
]
-}
+}
\ No newline at end of file
diff --git a/ci/builders/mac_android_aot_engine.json b/ci/builders/mac_android_aot_engine.json
index 1db3b21..20dd187 100644
--- a/ci/builders/mac_android_aot_engine.json
+++ b/ci/builders/mac_android_aot_engine.json
@@ -8,7 +8,8 @@
"include_paths": [
"out/android_profile/zip_archives/android-arm-profile/darwin-x64.zip"
],
- "name": "android_profile"
+ "name": "android_profile",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -16,7 +17,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -34,7 +35,7 @@
},
"properties": {
"$flutter/osx_sdk": {
- "sdk_version": "14c18"
+ "sdk_version": "14e300c"
}
}
},
@@ -46,7 +47,8 @@
"include_paths": [
"out/android_profile_arm64/zip_archives/android-arm64-profile/darwin-x64.zip"
],
- "name": "android_profile_arm64"
+ "name": "android_profile_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -54,7 +56,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -73,7 +75,7 @@
},
"properties": {
"$flutter/osx_sdk": {
- "sdk_version": "14c18"
+ "sdk_version": "14e300c"
}
}
},
@@ -85,7 +87,8 @@
"include_paths": [
"out/android_profile_x64/zip_archives/android-x64-profile/darwin-x64.zip"
],
- "name": "android_profile_x64"
+ "name": "android_profile_x64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -93,7 +96,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -112,7 +115,7 @@
},
"properties": {
"$flutter/osx_sdk": {
- "sdk_version": "14c18"
+ "sdk_version": "14e300c"
}
}
},
@@ -124,7 +127,8 @@
"include_paths": [
"out/android_release/zip_archives/android-arm-release/darwin-x64.zip"
],
- "name": "android_release"
+ "name": "android_release",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -132,7 +136,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -150,7 +154,7 @@
},
"properties": {
"$flutter/osx_sdk": {
- "sdk_version": "14c18"
+ "sdk_version": "14e300c"
}
}
},
@@ -162,7 +166,8 @@
"include_paths": [
"out/android_release_arm64/zip_archives/android-arm64-release/darwin-x64.zip"
],
- "name": "android_release_arm64"
+ "name": "android_release_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -170,7 +175,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -189,7 +194,7 @@
},
"properties": {
"$flutter/osx_sdk": {
- "sdk_version": "14c18"
+ "sdk_version": "14e300c"
}
}
},
@@ -201,7 +206,8 @@
"include_paths": [
"out/android_release_x64/zip_archives/android-x64-release/darwin-x64.zip"
],
- "name": "android_release_x64"
+ "name": "android_release_x64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -209,7 +215,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -228,12 +234,11 @@
},
"properties": {
"$flutter/osx_sdk": {
- "sdk_version": "14c18"
+ "sdk_version": "14e300c"
}
}
}
],
- "tests": [],
"generators": [],
"archives": []
}
diff --git a/ci/builders/mac_clang_tidy.json b/ci/builders/mac_clang_tidy.json
new file mode 100644
index 0000000..b141cab
--- /dev/null
+++ b/ci/builders/mac_clang_tidy.json
@@ -0,0 +1,210 @@
+{
+ "builds": [
+ {
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac-12",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--runtime-mode",
+ "debug",
+ "--prebuilt-dart-sdk",
+ "--no-lto",
+ "--force-mac-arm64"
+ ],
+ "name": "host_debug",
+ "ninja": {
+ "config": "host_debug"
+ }
+ },
+ {
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac-12",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--ios",
+ "--runtime-mode",
+ "debug",
+ "--simulator",
+ "--no-lto",
+ "--force-mac-arm64"
+ ],
+ "name": "ios_debug_sim",
+ "ninja": {
+ "config": "ios_debug_sim"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "name": "test: lint host_debug 0",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug"
+ ],
+ "contexts": [
+ "osx_sdk"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint host_debug",
+ "parameters": [
+ "--variant",
+ "host_debug",
+ "--lint-all",
+ "--shard-id=0",
+ "--shard-variants=host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ },
+ {
+ "name": "test: lint host_debug 1",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug"
+ ],
+ "contexts": [
+ "osx_sdk"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint host_debug",
+ "parameters": [
+ "--variant",
+ "host_debug",
+ "--lint-all",
+ "--shard-id=1",
+ "--shard-variants=host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ },
+ {
+ "name": "test: lint host_debug 2",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug"
+ ],
+ "contexts": [
+ "osx_sdk"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint host_debug",
+ "parameters": [
+ "--variant",
+ "host_debug",
+ "--lint-all",
+ "--shard-id=2",
+ "--shard-variants=host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ },
+ {
+ "name": "test: lint host_debug 3",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug"
+ ],
+ "contexts": [
+ "osx_sdk"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint host_debug",
+ "parameters": [
+ "--variant",
+ "host_debug",
+ "--lint-all",
+ "--shard-id=3",
+ "--shard-variants=host_debug,host_debug,host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ },
+ {
+ "name": "test: lint ios_debug_sim",
+ "recipe": "engine_v2/tester_engine",
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "dependencies": [
+ "host_debug",
+ "ios_debug_sim"
+ ],
+ "contexts": [
+ "osx_sdk"
+ ],
+ "tasks": [
+ {
+ "name": "test: lint ios_debug_sim",
+ "parameters": [
+ "--variant",
+ "ios_debug_sim",
+ "--lint-all",
+ "--shard-id=0",
+ "--shard-variants=host_debug"
+ ],
+ "max_attempts": 1,
+ "script": "flutter/ci/lint.sh"
+ }
+ ]
+ }
+ ]
+}
diff --git a/ci/builders/mac_host_engine.json b/ci/builders/mac_host_engine.json
index 775c9d6..cc3a336 100644
--- a/ci/builders/mac_host_engine.json
+++ b/ci/builders/mac_host_engine.json
@@ -7,18 +7,19 @@
"type": "gcs",
"include_paths": [
"out/host_debug/zip_archives/darwin-x64/artifacts.zip",
- "out/host_debug/zip_archives/darwin-x64/FlutterEmbedder.framework.zip",
"out/host_debug/zip_archives/dart-sdk-darwin-x64.zip"
],
- "name": "host_debug"
+ "name": "host_debug",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Mac-12",
- "cpu=x86"
+ "cpu=x86",
+ "mac_model=Macmini8,1"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -26,7 +27,9 @@
"debug",
"--no-lto",
"--prebuilt-dart-sdk",
- "--build-embedder-examples"
+ "--build-embedder-examples",
+ "--enable-impeller-vulkan",
+ "--use-glfw-swiftshader"
],
"name": "host_debug",
"ninja": {
@@ -36,12 +39,17 @@
"flutter/build/archives:artifacts",
"flutter/build/archives:dart_sdk_archive",
"flutter/build/archives:flutter_embedder_framework",
- "flutter/build/dart:copy_dart_sdk",
+ "flutter/build/dart:copy_dart_sdk",
"flutter/shell/platform/darwin/macos:zip_macos_flutter_framework",
"flutter/tools/font-subset",
"flutter:unittests"
]
},
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ },
"tests": [
{
"language": "python3",
@@ -50,13 +58,12 @@
"--variant",
"host_debug",
"--type",
- "dart",
+ "dart,engine",
"--engine-capture-core-dump"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
- ]
+ ]
},
{
"archives": [
@@ -66,15 +73,17 @@
"include_paths": [
"out/host_profile/zip_archives/darwin-x64-profile/artifacts.zip"
],
- "name": "host_profile"
+ "name": "host_profile",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Mac-12",
- "cpu=x86"
+ "cpu=x86",
+ "mac_model=Macmini8,1"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -88,13 +97,18 @@
"ninja": {
"config": "host_profile",
"targets": [
- "flutter/build/dart:copy_dart_sdk",
+ "flutter/build/dart:copy_dart_sdk",
"flutter/build/archives:archive_gen_snapshot",
"flutter/build/archives:artifacts",
"flutter/shell/platform/darwin/macos:zip_macos_flutter_framework",
"flutter:unittests"
]
},
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ },
"tests": [
{
"language": "python3",
@@ -106,8 +120,7 @@
"dart,engine",
"--engine-capture-core-dump"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -120,18 +133,23 @@
"out/host_release/zip_archives/darwin-x64-release/artifacts.zip",
"out/host_release/zip_archives/darwin-x64/font-subset.zip"
],
- "name": "host_release"
+ "name": "host_release",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Mac-12",
- "cpu=x86"
+ "cpu=x86",
+ "mac_model=Macmini8,1"
],
"dependencies": [
- {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}
+ {
+ "dependency": "goldctl",
+ "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"
+ }
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -139,7 +157,9 @@
"release",
"--no-lto",
"--prebuilt-dart-sdk",
- "--build-embedder-examples"
+ "--build-embedder-examples",
+ "--enable-impeller-vulkan",
+ "--use-glfw-swiftshader"
],
"name": "host_release",
"ninja": {
@@ -147,13 +167,18 @@
"targets": [
"flutter/build/archives:archive_gen_snapshot",
"flutter/build/archives:artifacts",
- "flutter/build/dart:copy_dart_sdk",
+ "flutter/build/dart:copy_dart_sdk",
"flutter/impeller/golden_tests:impeller_golden_tests",
"flutter/shell/platform/darwin/macos:zip_macos_flutter_framework",
"flutter/tools/font-subset",
"flutter:unittests"
]
},
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ },
"tests": [
{
"language": "python3",
@@ -164,8 +189,7 @@
"--type",
"dart,engine,impeller-golden"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -178,7 +202,8 @@
"out/mac_debug_arm64/zip_archives/darwin-arm64/artifacts.zip",
"out/mac_debug_arm64/zip_archives/dart-sdk-darwin-arm64.zip"
],
- "name": "mac_debug_arm64"
+ "name": "mac_debug_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -186,7 +211,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -202,14 +227,19 @@
"ninja": {
"config": "mac_debug_arm64",
"targets": [
- "flutter/tools/font-subset",
+ "flutter/tools/font-subset",
"flutter/build/archives:archive_gen_snapshot",
"flutter/build/archives:artifacts",
"flutter/build/archives:dart_sdk_archive",
+ "flutter/build/archives:flutter_embedder_framework",
"flutter/shell/platform/darwin/macos:zip_macos_flutter_framework"
]
},
- "tests": []
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
},
{
"archives": [
@@ -218,8 +248,9 @@
"type": "gcs",
"include_paths": [
"out/mac_profile_arm64/zip_archives/darwin-arm64-profile/artifacts.zip"
- ],
- "name": "mac_profile_arm64"
+ ],
+ "name": "mac_profile_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -227,7 +258,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -247,7 +278,11 @@
"flutter/shell/platform/darwin/macos:zip_macos_flutter_framework"
]
},
- "tests": []
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
},
{
"archives": [
@@ -258,7 +293,8 @@
"out/mac_release_arm64/zip_archives/darwin-arm64/font-subset.zip",
"out/mac_release_arm64/zip_archives/darwin-arm64-release/artifacts.zip"
],
- "name": "mac_release_arm64"
+ "name": "mac_release_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -266,7 +302,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -287,13 +323,29 @@
"flutter/shell/platform/darwin/macos:zip_macos_flutter_framework"
]
},
- "tests": []
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
}
],
- "tests": [],
"generators": {
"tasks": [
{
+ "name": "Debug-FlutterEmbedder.framework",
+ "parameters": [
+ "--dst",
+ "out/debug/framework",
+ "--arm64-out-dir",
+ "out/mac_debug_arm64",
+ "--x64-out-dir",
+ "out/host_debug",
+ "--zip"
+ ],
+ "script": "flutter/sky/tools/create_embedder_framework.py"
+ },
+ {
"name": "Release-FlutterMacOS.framework",
"parameters": [
"--dst",
@@ -385,32 +437,44 @@
},
"archives": [
{
+ "source": "out/debug/framework/FlutterEmbedder.framework.zip",
+ "destination": "darwin-x64/FlutterEmbedder.framework.zip",
+ "realm": "production"
+ },
+ {
"source": "out/release/framework/FlutterMacOS.dSYM.zip",
- "destination": "darwin-x64-release/FlutterMacOS.dSYM.zip"
+ "destination": "darwin-x64-release/FlutterMacOS.dSYM.zip",
+ "realm": "production"
},
{
"source": "out/debug/framework/FlutterMacOS.framework.zip",
- "destination": "darwin-x64/FlutterMacOS.framework.zip"
+ "destination": "darwin-x64/FlutterMacOS.framework.zip",
+ "realm": "production"
},
{
"source": "out/profile/framework/FlutterMacOS.framework.zip",
- "destination": "darwin-x64-profile/FlutterMacOS.framework.zip"
+ "destination": "darwin-x64-profile/FlutterMacOS.framework.zip",
+ "realm": "production"
},
{
"source": "out/release/framework/FlutterMacOS.framework.zip",
- "destination": "darwin-x64-release/FlutterMacOS.framework.zip"
+ "destination": "darwin-x64-release/FlutterMacOS.framework.zip",
+ "realm": "production"
},
{
"source": "out/debug/snapshot/gen_snapshot.zip",
- "destination": "darwin-x64/gen_snapshot.zip"
+ "destination": "darwin-x64/gen_snapshot.zip",
+ "realm": "production"
},
{
"source": "out/profile/snapshot/gen_snapshot.zip",
- "destination": "darwin-x64-profile/gen_snapshot.zip"
+ "destination": "darwin-x64-profile/gen_snapshot.zip",
+ "realm": "production"
},
{
"source": "out/release/snapshot/gen_snapshot.zip",
- "destination": "darwin-x64-release/gen_snapshot.zip"
+ "destination": "darwin-x64-release/gen_snapshot.zip",
+ "realm": "production"
}
]
}
diff --git a/ci/builders/mac_impeller_cmake_example.json b/ci/builders/mac_impeller_cmake_example.json
new file mode 100644
index 0000000..5a9596d
--- /dev/null
+++ b/ci/builders/mac_impeller_cmake_example.json
@@ -0,0 +1,26 @@
+{
+ "builds": [
+ {
+ "name": "impeller-cmake-example",
+ "archives": [],
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac-12",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false,
+ "download_impeller_cmake_example": true
+ },
+ "gn": [
+ "--impeller-cmake-example",
+ "--xcode-symlinks"
+ ],
+ "ninja": {
+ "config": "impeller-cmake-example",
+ "targets": [
+ ]
+ }
+ }
+ ]
+}
diff --git a/ci/builders/mac_ios_engine.json b/ci/builders/mac_ios_engine.json
index fdce540..ec58321 100644
--- a/ci/builders/mac_ios_engine.json
+++ b/ci/builders/mac_ios_engine.json
@@ -1,7 +1,6 @@
{
"builds": [
{
- "archives": [],
"drone_dimensions": [
"device_type=none",
"mac_model=Macmini8,1",
@@ -16,13 +15,15 @@
],
"name": "ios_debug_sim",
"ninja": {
- "config": "ios_debug_sim",
- "targets": []
+ "config": "ios_debug_sim"
},
- "tests": []
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
},
{
- "archives": [],
"drone_dimensions": [
"device_type=none",
"mac_model=Macmini8,1",
@@ -38,19 +39,15 @@
],
"name": "ios_debug_sim_arm64",
"ninja": {
- "config": "ios_debug_sim_arm64",
- "targets": []
+ "config": "ios_debug_sim_arm64"
},
- "tests": []
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
},
{
- "archives": [
- {
- "base_path": "out/ios_debug/zip_archives/",
- "include_paths": [],
- "name": "ios_debug"
- }
- ],
"drone_dimensions": [
"device_type=none",
"mac_model=Macmini8,1",
@@ -68,10 +65,13 @@
"flutter/shell/platform/darwin/ios:flutter_framework"
]
},
- "tests": []
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
},
- {
- "archives": [],
+ {
"drone_dimensions": [
"device_type=none",
"mac_model=Macmini8,1",
@@ -90,10 +90,13 @@
"flutter/lib/snapshot:generate_snapshot_bin"
]
},
- "tests": []
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
},
- {
- "archives": [],
+ {
"drone_dimensions": [
"device_type=none",
"mac_model=Macmini8,1",
@@ -112,10 +115,13 @@
"flutter/lib/snapshot:generate_snapshot_bin"
]
},
- "tests": []
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
}
],
- "tests": [],
"generators": {
"tasks": [
{
@@ -133,7 +139,7 @@
"script": "flutter/sky/tools/create_full_ios_framework.py",
"language": "python3"
},
- {
+ {
"name": "Profile-ios-Flutter.xcframework",
"parameters": [
"--dst",
@@ -155,7 +161,7 @@
],
"script": "flutter/tools/gen_objcdoc.sh"
},
- {
+ {
"name": "Release-ios-Flutter.xcframework",
"parameters": [
"--dst",
@@ -182,29 +188,42 @@
],
"script": "flutter/sky/tools/create_macos_gen_snapshots.py",
"language": "python3"
+ },
+ {
+ "name": "Verify-export-symbols-release-binaries",
+ "parameters": [
+ "src/out"
+ ],
+ "script": "flutter/testing/symbols/verify_exported.dart",
+ "language": "dart"
}
]
},
"archives": [
{
"source": "out/debug/artifacts.zip",
- "destination": "ios/artifacts.zip"
+ "destination": "ios/artifacts.zip",
+ "realm": "production"
},
- {
+ {
"source": "out/profile/artifacts.zip",
- "destination": "ios-profile/artifacts.zip"
+ "destination": "ios-profile/artifacts.zip",
+ "realm": "production"
},
{
"source": "out/debug/ios-objcdoc.zip",
- "destination": "ios-objcdoc.zip"
+ "destination": "ios-objcdoc.zip",
+ "realm": "production"
},
- {
+ {
"source": "out/release/artifacts.zip",
- "destination": "ios-release/artifacts.zip"
+ "destination": "ios-release/artifacts.zip",
+ "realm": "production"
},
{
"source": "out/release/Flutter.dSYM.zip",
- "destination": "ios-release/Flutter.dSYM.zip"
+ "destination": "ios-release/Flutter.dSYM.zip",
+ "realm": "production"
}
]
}
diff --git a/ci/builders/mac_unopt.json b/ci/builders/mac_unopt.json
index ebbb27c..72778ab 100644
--- a/ci/builders/mac_unopt.json
+++ b/ci/builders/mac_unopt.json
@@ -5,31 +5,35 @@
{
"base_path": "out/host_debug_unopt/zip_archives/",
"type": "gcs",
- "include_paths": [
- ],
+ "include_paths": [],
"name": "host_debug_unopt"
}
],
"drone_dimensions": [
"device_type=none",
"os=Mac-12",
- "cpu=x86"
+ "cpu=x86",
+ "mac_model=Macmini8,1"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
- "--runtime-mode",
- "debug",
- "--unoptimized",
- "--no-lto",
- "--prebuilt-dart-sdk"
+ "--runtime-mode",
+ "debug",
+ "--unoptimized",
+ "--no-lto",
+ "--prebuilt-dart-sdk"
],
"name": "host_debug_unopt",
"ninja": {
"config": "host_debug_unopt",
- "targets": [
- ]
+ "targets": []
+ },
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
},
"tests": [
{
@@ -42,8 +46,7 @@
"dart,engine",
"--engine-capture-core-dump"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -52,15 +55,17 @@
{
"base_path": "out/ios_debug_sim/zip_archives/",
"type": "gcs",
- "include_paths": [
- ],
+ "include_paths": [],
"name": "ios_debug_sim"
}
],
"properties": {
"$flutter/osx_sdk": {
- "runtime_versions": [ "ios-16-0_14a5294e" ],
- "sdk_version": "14a5294e"
+ "runtime_versions": [
+ "ios-16-4_14e300c",
+ "ios-16-2_14c18"
+ ],
+ "sdk_version": "14e300c"
}
},
"drone_dimensions": [
@@ -68,7 +73,7 @@
"os=Mac-12",
"cpu=x86"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -99,20 +104,126 @@
"--ios-variant",
"ios_debug_sim"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
},
{
"name": "Scenario App Integration Tests",
"parameters": [
"ios_debug_sim"
],
- "script": "flutter/testing/scenario_app/run_ios_tests.sh",
- "type": "local"
+ "script": "flutter/testing/scenario_app/run_ios_tests.sh"
+ }
+ ]
+ },
+ {
+ "archives": [
+ {
+ "base_path": "out/host_debug_unopt_arm64/zip_archives/",
+ "type": "gcs",
+ "include_paths": [
+ ],
+ "name": "host_debug_unopt_arm64"
+ }
+ ],
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac-12",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--runtime-mode",
+ "debug",
+ "--unoptimized",
+ "--no-lto",
+ "--prebuilt-dart-sdk",
+ "--force-mac-arm64",
+ "--mac-cpu",
+ "arm64"
+ ],
+ "name": "host_debug_unopt_arm64",
+ "ninja": {
+ "config": "host_debug_unopt_arm64",
+ "targets": [
+ ]
+ },
+ "properties": {
+ "$flutter/osx_sdk": {
+ "sdk_version": "14e300c"
+ }
+ }
+ },
+ {
+ "archives": [
+ {
+ "base_path": "out/ios_debug_sim_arm64/zip_archives/",
+ "type": "gcs",
+ "include_paths": [
+ ],
+ "name": "ios_debug_sim_arm64"
+ }
+ ],
+ "properties": {
+ "$flutter/osx_sdk": {
+ "runtime_versions": [
+ "ios-16-4_14e300c",
+ "ios-16-2_14c18"
+ ],
+ "sdk_version": "14e300c"
+ }
+ },
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Mac-12",
+ "cpu=arm64"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--ios",
+ "--runtime-mode",
+ "debug",
+ "--simulator",
+ "--no-lto",
+ "--force-mac-arm64",
+ "--simulator-cpu",
+ "arm64"
+ ],
+ "name": "ios_debug_sim_arm64",
+ "ninja": {
+ "config": "ios_debug_sim_arm64",
+ "targets": [
+ "flutter/testing/scenario_app",
+ "flutter/shell/platform/darwin/ios:ios_test_flutter"
+ ]
+ },
+ "tests": [
+ {
+ "language": "python3",
+ "name": "Tests for ios_debug_sim_arm64",
+ "parameters": [
+ "--variant",
+ "ios_debug_sim_arm64",
+ "--type",
+ "objc",
+ "--engine-capture-core-dump",
+ "--ios-variant",
+ "ios_debug_sim_arm64"
+ ],
+ "script": "flutter/testing/run_tests.py"
+ },
+ {
+ "name": "Scenario App Integration Tests",
+ "parameters": [
+ "ios_debug_sim_arm64"
+ ],
+ "script": "flutter/testing/scenario_app/run_ios_tests.sh"
}
]
}
- ],
- "tests": []
+ ]
}
diff --git a/ci/builders/standalone/linux_android_emulator.json b/ci/builders/standalone/linux_android_emulator.json
new file mode 100644
index 0000000..e8c392e
--- /dev/null
+++ b/ci/builders/standalone/linux_android_emulator.json
@@ -0,0 +1,46 @@
+{
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gn": [
+ "--android",
+ "--android-cpu=x64",
+ "--no-lto"
+ ],
+ "name": "android_debug_x64",
+ "ninja": {
+ "config": "android_debug_x64",
+ "targets": [
+ "flutter/shell/platform/android:flutter_shell_native_unittests",
+ "flutter/testing/scenario_app"
+ ]
+ },
+ "tests": [
+ {
+ "language": "python3",
+ "name": "Android Unit Tests",
+ "contexts": [
+ "android_virtual_device"
+ ],
+ "parameters": [
+ "--android-variant",
+ "android_debug_x64",
+ "--type",
+ "android"
+ ],
+ "script": "flutter/testing/run_tests.py"
+ },
+ {
+ "language": "bash",
+ "name": "Scenario App Integration Tests",
+ "contexts": [
+ "android_virtual_device"
+ ],
+ "parameters": [
+ "android_debug_x64"
+ ],
+ "script": "flutter/testing/scenario_app/run_android_tests.sh"
+ }
+ ]
+}
diff --git a/ci/builders/standalone/linux_benchmarks.json b/ci/builders/standalone/linux_benchmarks.json
new file mode 100644
index 0000000..fdec72e
--- /dev/null
+++ b/ci/builders/standalone/linux_benchmarks.json
@@ -0,0 +1,48 @@
+{
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "gn": [
+ "--runtime-mode",
+ "release",
+ "--prebuilt-dart-sdk",
+ "--build-embedder-examples"
+ ],
+ "name": "host_release",
+ "ninja": {
+ "config": "host_release",
+ "targets": [
+ "flutter/build/dart:copy_dart_sdk",
+ "flutter/display_list:display_list_benchmarks",
+ "flutter/display_list:display_list_builder_benchmarks",
+ "flutter/fml:fml_benchmarks",
+ "flutter/impeller/geometry:geometry_benchmarks",
+ "flutter/lib/ui:ui_benchmarks",
+ "flutter/shell/common:shell_benchmarks",
+ "flutter/shell/testing",
+ "flutter/third_party/txt:txt_benchmarks",
+ "flutter/tools/path_ops",
+ "flutter/build/archives:flutter_patched_sdk",
+ "flutter:unittests"
+ ]
+ },
+ "tests": [
+ {
+ "language": "bash",
+ "name": "Generate metrics test",
+ "script": "flutter/testing/benchmark/generate_metrics.sh"
+ },
+ {
+ "contexts": [
+ "metric_center_token"
+ ],
+ "language": "bash",
+ "name": "Upload metrics",
+ "script": "flutter/testing/benchmark/upload_metrics.sh"
+ }
+ ]
+}
diff --git a/ci/builders/standalone/linux_license.json b/ci/builders/standalone/linux_license.json
new file mode 100644
index 0000000..15a792c
--- /dev/null
+++ b/ci/builders/standalone/linux_license.json
@@ -0,0 +1,18 @@
+{
+ "drone_dimensions": [
+ "device_type=none",
+ "os=Linux"
+ ],
+ "cas_archive": false,
+ "gclient_variables": {
+ "download_android_deps": false
+ },
+ "name": "licenses",
+ "tests": [
+ {
+ "name": "licenses check",
+ "max_attempts": 1,
+ "script": "flutter/ci/licenses.sh"
+ }
+ ]
+}
diff --git a/ci/builders/windows_android_aot_engine.json b/ci/builders/windows_android_aot_engine.json
index bb8c310..933478b 100644
--- a/ci/builders/windows_android_aot_engine.json
+++ b/ci/builders/windows_android_aot_engine.json
@@ -8,7 +8,8 @@
"include_paths": [
"out/android_profile/zip_archives/android-arm-profile/windows-x64.zip"
],
- "name": "android_profile"
+ "name": "android_profile",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -36,7 +37,8 @@
"include_paths": [
"out/android_profile_arm64/zip_archives/android-arm64-profile/windows-x64.zip"
],
- "name": "android_profile_arm64"
+ "name": "android_profile_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -65,7 +67,8 @@
"include_paths": [
"out/android_profile_x64/zip_archives/android-x64-profile/windows-x64.zip"
],
- "name": "android_profile_x64"
+ "name": "android_profile_x64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -94,7 +97,8 @@
"include_paths": [
"out/android_release/zip_archives/android-arm-release/windows-x64.zip"
],
- "name": "android_release"
+ "name": "android_release",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -122,7 +126,8 @@
"include_paths": [
"out/android_release_arm64/zip_archives/android-arm64-release/windows-x64.zip"
],
- "name": "android_release_arm64"
+ "name": "android_release_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
@@ -151,7 +156,8 @@
"include_paths": [
"out/android_release_x64/zip_archives/android-x64-release/windows-x64.zip"
],
- "name": "android_release_x64"
+ "name": "android_release_x64",
+ "realm": "production"
}
],
"drone_dimensions": [
diff --git a/ci/builders/windows_arm_host_engine.json b/ci/builders/windows_arm_host_engine.json
index dfa170b..8fad758 100644
--- a/ci/builders/windows_arm_host_engine.json
+++ b/ci/builders/windows_arm_host_engine.json
@@ -13,14 +13,15 @@
"out/host_debug_arm64/zip_archives/windows-arm64-debug/windows-arm64-flutter.zip",
"out/host_debug_arm64/zip_archives/windows-arm64/flutter-cpp-client-wrapper.zip"
],
- "name": "host_debug_arm64"
+ "name": "host_debug_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Windows-10"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -41,8 +42,7 @@
"flutter/shell/platform/windows/client_wrapper:client_wrapper_archive",
"flutter/build/archives:windows_flutter"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -52,14 +52,15 @@
"include_paths": [
"out/host_profile_arm64/zip_archives/windows-arm64-profile/windows-arm64-flutter.zip"
],
- "name": "host_profile_arm64"
+ "name": "host_profile_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Windows-10"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -77,8 +78,7 @@
"gen_snapshot",
"flutter/build/archives:windows_flutter"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -88,14 +88,15 @@
"include_paths": [
"out/host_release_arm64/zip_archives/windows-arm64-release/windows-arm64-flutter.zip"
],
- "name": "host_profile_arm64"
+ "name": "host_profile_arm64",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Windows-10"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"generators": {},
@@ -114,8 +115,7 @@
"gen_snapshot",
"flutter/build/archives:windows_flutter"
]
- },
- "tests": []
+ }
}
]
}
diff --git a/ci/builders/windows_host_engine.json b/ci/builders/windows_host_engine.json
index ad48a3e..729d62b 100644
--- a/ci/builders/windows_host_engine.json
+++ b/ci/builders/windows_host_engine.json
@@ -13,14 +13,15 @@
"out/host_debug/zip_archives/windows-x64-debug/windows-x64-flutter.zip",
"out/host_debug/zip_archives/windows-x64/flutter-cpp-client-wrapper.zip"
],
- "name": "host_debug"
+ "name": "host_debug",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Windows-10"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -51,8 +52,7 @@
"--type",
"engine"
],
- "script": "flutter/testing/run_tests.py",
- "type": "local"
+ "script": "flutter/testing/run_tests.py"
}
]
},
@@ -64,14 +64,15 @@
"include_paths": [
"out/host_profile/zip_archives/windows-x64-profile/windows-x64-flutter.zip"
],
- "name": "host_profile"
+ "name": "host_profile",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Windows-10"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"gn": [
@@ -87,8 +88,7 @@
"gen_snapshot",
"flutter/build/archives:windows_flutter"
]
- },
- "tests": []
+ }
},
{
"archives": [
@@ -98,14 +98,15 @@
"include_paths": [
"out/host_release/zip_archives/windows-x64-release/windows-x64-flutter.zip"
],
- "name": "host_profile"
+ "name": "host_release",
+ "realm": "production"
}
],
"drone_dimensions": [
"device_type=none",
"os=Windows-10"
],
- "gclient_custom_vars": {
+ "gclient_variables": {
"download_android_deps": false
},
"generators": {},
@@ -122,8 +123,7 @@
"gen_snapshot",
"flutter/build/archives:windows_flutter"
]
- },
- "tests": []
+ }
}
]
}