Configure Cirrus CI (#16224)

* Configure Cirrus CI

* Read file directly instead of shelling a command

* Wait for all streams to finish

* Add LTR `textDirection`

Since `RenderFlex#_debugHasNecessaryDirections` requires it when `direction` is horizontal and there are multiple children.
diff --git a/.cirrus.yml b/.cirrus.yml
new file mode 100644
index 0000000..bd21b3c
--- /dev/null
+++ b/.cirrus.yml
@@ -0,0 +1,42 @@
+container:
+  image: cirrusci/flutter:base
+
+task:
+  env:
+    CIRRUS_WORKING_DIR: "/tmp/flutter sdk"
+    PATH: "$CIRRUS_WORKING_DIR/bin:$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin:$PATH"
+    SHARD: "$CIRRUS_TASK_NAME"
+
+  git_fetch_script: git fetch origin
+  setup_script: |
+    echo "SDK directory is: $PWD"
+    ./bin/flutter --version
+
+    # disable analytics on the bots and download Flutter dependencies
+    ./bin/flutter config --no-analytics
+
+    # run pub get in all the repo packages
+    ./bin/flutter update-packages
+
+  matrix:
+    - name: docs
+      docs_script: ./dev/bots/docs.sh
+    - name: analyze
+      test_script: dart ./dev/bots/test.dart
+    - name: tests
+      test_script: dart ./dev/bots/test.dart
+      container:
+        cpu: 4
+        memory: 8G
+
+windows_task:
+  windows_container:
+    dockerfile: dev/bots/docker/Dockerfile.windows
+  env:
+    CIRRUS_WORKING_DIR: "C:\\Windows\\Temp\\flutter sdk"
+  git_fetch_script: git fetch origin
+  setup_script:
+    - bin\flutter.bat config --no-analytics
+    - bin\flutter.bat update-packages
+  test_all_script:
+    - bin\cache\dart-sdk\bin\dart.exe -c dev\bots\test.dart
diff --git a/README.md b/README.md
index 85a44f9..acc09c1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# <img src="https://flutter.io/images/flutter-mark-square-100.png" alt="Flutter" width="40" height="40" /> Flutter [![Join Gitter Chat Channel -](https://badges.gitter.im/flutter/flutter.svg)](https://gitter.im/flutter/flutter?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status - Travis](https://travis-ci.org/flutter/flutter.svg?branch=master)](https://travis-ci.org/flutter/flutter) [![Build Status - AppVeyor](https://ci.appveyor.com/api/projects/status/meyi9evcny64a2mg/branch/master?svg=true)](https://ci.appveyor.com/project/flutter/flutter/branch/master) [![Coverage Status -](https://coveralls.io/repos/github/flutter/flutter/badge.svg?branch=master)](https://coveralls.io/github/flutter/flutter?branch=master)
+# <img src="https://flutter.io/images/flutter-mark-square-100.png" alt="Flutter" width="40" height="40" /> Flutter [![Join Gitter Chat Channel -](https://badges.gitter.im/flutter/flutter.svg)](https://gitter.im/flutter/flutter?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status - Travis](https://travis-ci.org/flutter/flutter.svg?branch=master)](https://travis-ci.org/flutter/flutter) [![Build Status - AppVeyor](https://ci.appveyor.com/api/projects/status/meyi9evcny64a2mg/branch/master?svg=true)](https://ci.appveyor.com/project/flutter/flutter/branch/master) [![Build Status - Cirrus](https://api.cirrus-ci.com/github/flutter/flutter.svg)](https://cirrus-ci.com/github/flutter/flutter) [![Coverage Status -](https://coveralls.io/repos/github/flutter/flutter/badge.svg?branch=master)](https://coveralls.io/github/flutter/flutter?branch=master)
 
 A new mobile app SDK to help developers and designers build modern mobile apps for iOS and Android. Flutter is an open-source project currently in beta.
 
diff --git a/dev/bots/docker/Dockerfile.windows b/dev/bots/docker/Dockerfile.windows
new file mode 100644
index 0000000..0087827
--- /dev/null
+++ b/dev/bots/docker/Dockerfile.windows
@@ -0,0 +1,13 @@
+FROM microsoft/windowsservercore:1709
+
+SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
+
+RUN netsh interface ipv4 set subinterface 'vEthernet (Ethernet)' mtu=1460 store=persistent
+
+RUN Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
+
+RUN choco install -y git
+
+SHELL ["cmd", "/S", "/C"]
+
+RUN setx /m PATH "%PATH%;C:\nodejs"
\ No newline at end of file
diff --git a/dev/bots/test.dart b/dev/bots/test.dart
index dc47d11e..6fb1b190 100644
--- a/dev/bots/test.dart
+++ b/dev/bots/test.dart
@@ -78,18 +78,12 @@
   );
 
   final String localizationsFile = path.join('packages', 'flutter_localizations', 'lib', 'src', 'l10n', 'localizations.dart');
+  final String expectedResult = await new File(localizationsFile).readAsString();
 
-  final String executable = Platform.isWindows ? 'powershell' : 'cat';
-  final List<String> args = Platform.isWindows ?
-      <String>['\$PSDefaultParameterValues["*:Encoding"]="utf8";(gc $localizationsFile) -join "`n"']:
-      <String>[localizationsFile];
-
-  final EvalResult sourceContents = await _evalCommand(executable, args, workingDirectory: flutterRoot);
-
-  if (genResult.stdout.trim() != sourceContents.stdout.trim()) {
+  if (genResult.stdout.trim() != expectedResult.trim()) {
     stderr
       ..writeln('<<<<<<< $localizationsFile')
-      ..writeln(sourceContents.stdout.trim())
+      ..writeln(expectedResult.trim())
       ..writeln('=======')
       ..writeln(genResult.stdout.trim())
       ..writeln('>>>>>>> gen_localizations')
@@ -343,8 +337,10 @@
 
   Future<List<List<int>>> savedStdout, savedStderr;
   if (printOutput) {
-    stdout.addStream(process.stdout);
-    stderr.addStream(process.stderr);
+    await Future.wait(<Future<Null>>[
+      stdout.addStream(process.stdout),
+      stderr.addStream(process.stderr)
+    ]);
   } else {
     savedStdout = process.stdout.toList();
     savedStderr = process.stderr.toList();
diff --git a/examples/layers/rendering/flex_layout.dart b/examples/layers/rendering/flex_layout.dart
index 0084eba..004e74f 100644
--- a/examples/layers/rendering/flex_layout.dart
+++ b/examples/layers/rendering/flex_layout.dart
@@ -10,7 +10,7 @@
 import 'src/solid_color_box.dart';
 
 void main() {
-  final RenderFlex table = new RenderFlex(direction: Axis.vertical);
+  final RenderFlex table = new RenderFlex(direction: Axis.vertical, textDirection: TextDirection.ltr);
 
   void addAlignmentRow(CrossAxisAlignment crossAxisAlignment) {
     TextStyle style = const TextStyle(color: const Color(0xFF000000));