616 lines
No EOL
13 KiB
Markdown
616 lines
No EOL
13 KiB
Markdown
# Flutter Infrastructure Foundation
|
|
|
|
The Flutter Infrastructure Foundation Team is responsible for setting up, maintaining and improving the low level infrastructure used to build, test and release Flutter.
|
|
|
|
|
|
## DeviceLab Hardware
|
|
|
|
Flutter keeps a lab of test beds that include hosts and phones for all the supported platforms. These test beds are used to collect performance benchmarks and detect regressions.
|
|
|
|
As of May 2023 the Flutter DeviceLab contains 99 test beds with the following hardware and software:
|
|
|
|
|
|
<table>
|
|
<tr>
|
|
<td><strong>Host</strong>
|
|
</td>
|
|
<td><strong>Architecture</strong>
|
|
</td>
|
|
<td><strong>Phone</strong>
|
|
</td>
|
|
<td><strong>Count</strong>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Linux
|
|
</td>
|
|
<td>X64
|
|
</td>
|
|
<td>Android
|
|
</td>
|
|
<td>36
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Windows
|
|
</td>
|
|
<td>X64
|
|
</td>
|
|
<td>Android
|
|
</td>
|
|
<td>6
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Windows
|
|
</td>
|
|
<td>Arm64
|
|
</td>
|
|
<td>Android
|
|
</td>
|
|
<td>1
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Windows
|
|
</td>
|
|
<td>Arm64
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>9
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Mac
|
|
</td>
|
|
<td>X64
|
|
</td>
|
|
<td>iOS
|
|
</td>
|
|
<td>18
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Mac
|
|
</td>
|
|
<td>X64
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>2
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Mac
|
|
</td>
|
|
<td>Arm64
|
|
</td>
|
|
<td>iOS
|
|
</td>
|
|
<td>12
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Mac
|
|
</td>
|
|
<td>Arm64
|
|
</td>
|
|
<td>
|
|
</td>
|
|
<td>1
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Mac
|
|
</td>
|
|
<td>X64
|
|
</td>
|
|
<td>Android
|
|
</td>
|
|
<td>9
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Mac
|
|
</td>
|
|
<td>Arm64
|
|
</td>
|
|
<td>Android
|
|
</td>
|
|
<td>5
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
|
|
|
|
## VMs
|
|
|
|
Flutter uses Linux and Windows virtual machines to build and test Flutter. These VMs are auto-provisioned and distributed to 4 different pools. The following is the configuration distribution:
|
|
|
|
|
|
<table>
|
|
<tr>
|
|
<td style="background-color: null"><strong>LUCI pool</strong>
|
|
</td>
|
|
<td style="background-color: null"><strong>config</strong>
|
|
</td>
|
|
<td style="background-color: null"><strong>os</strong>
|
|
</td>
|
|
<td style="background-color: null"><strong>cpus</strong>
|
|
</td>
|
|
<td style="background-color: null"><strong>count</strong>
|
|
</td>
|
|
<td style="background-color: null"><strong>total cpus</strong>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.prod
|
|
</td>
|
|
<td style="background-color: null">e2-standard-32
|
|
</td>
|
|
<td style="background-color: null">Linux
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
32</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
15</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
480</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.prod
|
|
</td>
|
|
<td style="background-color: null">n1-standard-8
|
|
</td>
|
|
<td style="background-color: null">Linux
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
8</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
135</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
1080</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.try
|
|
</td>
|
|
<td style="background-color: null">e2-standard-32
|
|
</td>
|
|
<td style="background-color: null">Linux
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
32</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
30</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
960</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.try
|
|
</td>
|
|
<td style="background-color: null">n1-standard-8
|
|
</td>
|
|
<td style="background-color: null">Linux
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
8</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
137</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
1096</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.staging
|
|
</td>
|
|
<td style="background-color: null">e2-standard-32
|
|
</td>
|
|
<td style="background-color: null">Linux
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
32</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
4</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
128</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.staging
|
|
</td>
|
|
<td style="background-color: null">n1-standard-8
|
|
</td>
|
|
<td style="background-color: null">Linux
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
8</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
30</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
240</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.dart-internal.flutter
|
|
</td>
|
|
<td style="background-color: null">e2-standard-32
|
|
</td>
|
|
<td style="background-color: null">Linux
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
32</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
20</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
640</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.prod
|
|
</td>
|
|
<td style="background-color: null">e2-highmem-8
|
|
</td>
|
|
<td style="background-color: null">Windows
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
8</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
59</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
472</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.try
|
|
</td>
|
|
<td style="background-color: null">e2-highmem-8
|
|
</td>
|
|
<td style="background-color: null">Windows
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
8</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
130</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
1040</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.staging
|
|
</td>
|
|
<td style="background-color: null">e2-highmem-8
|
|
</td>
|
|
<td style="background-color: null">Windows
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
8</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
12</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
96</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.dart-internal.flutter
|
|
</td>
|
|
<td style="background-color: null">e2-highmem-8
|
|
</td>
|
|
<td style="background-color: null">Windows
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
8</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
20</p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
160</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null"><strong>Totals</strong>
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
<strong>592</strong></p>
|
|
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
<strong>6392</strong></p>
|
|
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
|
|
|
|
## Mac hostonly machines
|
|
|
|
Mac machines are organized in a different category because they are provisioned in chrome labs and have no phones attached. The machine configurations are the following:
|
|
|
|
|
|
<table>
|
|
<tr>
|
|
<td style="background-color: null"><strong>LUCI pool</strong>
|
|
</td>
|
|
<td style="background-color: null"><strong>model</strong>
|
|
</td>
|
|
<td style="background-color: null"><strong>os</strong>
|
|
</td>
|
|
<td style="background-color: null"><strong>count</strong>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.prod
|
|
</td>
|
|
<td style="background-color: null">Macmini8,1
|
|
</td>
|
|
<td style="background-color: null">Mac-12.6-21G115
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
28</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.prod
|
|
</td>
|
|
<td style="background-color: null">Macmini9,1
|
|
</td>
|
|
<td style="background-color: null">Mac-12.6-21G115
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
31</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.try
|
|
</td>
|
|
<td style="background-color: null">Macmini8,1
|
|
</td>
|
|
<td style="background-color: null">Mac-12.6-21G115
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
74</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.try
|
|
</td>
|
|
<td style="background-color: null">Macmini9,1
|
|
</td>
|
|
<td style="background-color: null">Mac-12.6-21G115
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
71</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.staging
|
|
</td>
|
|
<td style="background-color: null">Macmini8,1
|
|
</td>
|
|
<td style="background-color: null">Mac-12.6-21G115
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
5</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.flutter.staging
|
|
</td>
|
|
<td style="background-color: null">Macmini9,1
|
|
</td>
|
|
<td style="background-color: null">Mac-12.6-21G115
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
7</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.dart-internal.flutter
|
|
</td>
|
|
<td style="background-color: null">Macmini8,1
|
|
</td>
|
|
<td style="background-color: null">Mac-12.6-21G116
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
15</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">luci.dart-internal.flutter
|
|
</td>
|
|
<td style="background-color: null">Macmini9,1
|
|
</td>
|
|
<td style="background-color: null">Mac-12.6-21G117
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
2</p>
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color: null"><strong>Totals</strong>
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null">
|
|
</td>
|
|
<td style="background-color: null"><p style="text-align: right">
|
|
<strong>233</strong></p>
|
|
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
|
|
|
|
## Services
|
|
|
|
Flutter Infrastructure Foundation owns the DeviceLab provisioning services, maintains Flutter LUCI service configurations, and provides lab maintenance services.
|
|
|
|
This is the list of services with their descriptions:
|
|
|
|
|
|
<table>
|
|
<tr>
|
|
<td><strong>Service</strong>
|
|
</td>
|
|
<td><strong>Type</strong>
|
|
</td>
|
|
<td><strong>Description</strong>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>SALT
|
|
</td>
|
|
<td>Owned
|
|
</td>
|
|
<td>Configuration provisioning service used to push configurations as code for host and devices for all the supported platforms.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Machine Provider
|
|
</td>
|
|
<td>Configuration management
|
|
</td>
|
|
<td>Configuration service to provision, spin up and tear down virtual machines.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>LUCI swarming bot
|
|
</td>
|
|
<td>Owned
|
|
</td>
|
|
<td>Scripts used to set up and tear down LUCI services on the supported platforms.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Capacity planning and delivery
|
|
</td>
|
|
<td>Owned
|
|
</td>
|
|
<td>Budgeting for lab expansions, delivery of new capacity, and decommissioning of end of life hardware.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Lab maintenance
|
|
</td>
|
|
<td>Owned
|
|
</td>
|
|
<td>Faulty hardware replacement, hardware recovery and reprovisioning.
|
|
<p>
|
|
Lab migrations planning and execution.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Onboarding of new platforms
|
|
</td>
|
|
<td>Owned
|
|
</td>
|
|
<td>Creating provisioning SALT scripts and onboarding on LUCI services.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Device doctor
|
|
</td>
|
|
<td>Owned
|
|
</td>
|
|
<td>Phone configuration validation and device recovery.
|
|
</td>
|
|
</tr>
|
|
</table> |