diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 54bff388033be..0000000000000 --- a/.travis.yml +++ /dev/null @@ -1,49 +0,0 @@ -# ENVIRONMENTS -os: - - linux - - osx -osx_image: xcode9.2 -env: - - SHARD=analyze - - SHARD=tests - - SHARD=tool_tests - - SHARD=docs - - SHARD=build_and_deploy_gallery -matrix: - exclude: - - os: osx - env: SHARD=analyze - - os: osx - env: SHARD=docs -sudo: false -filter_secrets: false - -# INSTALLATION -addons: - apt: - # sky_shell binary depends on /usr/lib/x86_64-linux-gnu/libstdc++.so.6 version GLIBCXX_3.4.18 - sources: - - ubuntu-toolchain-r-test # if we don't specify this, the libstdc++6 we get is the wrong version - packages: - - lib32stdc++6 - - libstdc++6 - - fonts-droid -language: node_js -node_js: - - "8.1" -git: - # We rely on git tags for determining the version. - depth: false -cache: - bundler: true - directories: - - $HOME/.pub-cache -install: - - ./dev/bots/travis_install.sh - -# TESTING -before_script: - - ./dev/bots/travis_setup.sh -script: - - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - - ./dev/bots/travis_script.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 43fca9b7e8086..9404ad74e5acd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ Contributing to Flutter ======================= -[![Build Status](https://travis-ci.org/flutter/flutter.svg)](https://travis-ci.org/flutter/flutter) +[![Build Status](https://api.cirrus-ci.com/github/flutter/flutter.svg)](https://cirrus-ci.org/flutter/flutter) _See also: [Flutter's code of conduct](https://flutter.io/design-principles/#code-of-conduct)_ @@ -129,7 +129,7 @@ which provides flutter-specific extensions on top of [package:test](https://pub. option to start the test in a paused state and wait for connection from a debugger. This option lets you set breakpoints before the test runs. -To run all the tests for the entire Flutter repository, the same way that Travis runs them, run `dart dev/bots/test.dart`. +To run all the tests for the entire Flutter repository, the same way that Cirrus runs them, run `dart dev/bots/test.dart`. If you've built [your own flutter engine](#working-on-the-engine-and-the-framework-at-the-same-time), you can pass `--local-engine` to change what flutter shell `flutter test` uses. For example, @@ -190,7 +190,7 @@ To send us a pull request: Please make sure all your checkins have detailed commit messages explaining the patch. Once you've gotten an LGTM from a project maintainer and once your PR has received -the green light from all our automated testing (Travis, Appveyor, etc), and once +the green light from all our automated testing (running on Cirrus, etc), and once the tree is green (see the [design principles](https://flutter.io/design-principles/) document for more details), submit your changes to the `master` branch using one of the following methods: @@ -285,7 +285,6 @@ Build infrastructure We build and test Flutter on: -- Travis ([details](.travis.yml)) -- AppVeyor ([details](appveyor.yml)) +- [Cirrus](https://cirrus-ci.com/) ([details](.cirrus.yml)) - Chromebots (a.k.a. "recipes", [details](dev/bots/README.md)) - Devicelab (a.k.a. "cocoon", [details](dev/devicelab/README.md)) diff --git a/README.md b/README.md index 67b7fd9048dfa..d20e09618d101 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Flutter 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) +# Flutter 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 - 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/bin/flutter b/bin/flutter index 7aecf5c14d2d6..f5c4da13924e4 100755 --- a/bin/flutter +++ b/bin/flutter @@ -85,16 +85,16 @@ function upgrade_flutter () { fi local revision="$(cd "$FLUTTER_ROOT"; git rev-parse HEAD)" - if [[ ! -f "$SNAPSHOT_PATH" ]] || [[ ! -s "$STAMP_PATH" ]] || [[ "$(cat "$STAMP_PATH")" != "$revision" ]] || [[ "$FLUTTER_TOOLS_DIR/pubspec.yaml" -nt "$FLUTTER_TOOLS_DIR/pubspec.lock" ]]; then + if [[ ! -f "$SNAPSHOT_PATH" || ! -s "$STAMP_PATH" || "$(cat "$STAMP_PATH")" != "$revision" || "$FLUTTER_TOOLS_DIR/pubspec.yaml" -nt "$FLUTTER_TOOLS_DIR/pubspec.lock" ]]; then rm -f "$FLUTTER_ROOT/version" touch "$FLUTTER_ROOT/bin/cache/.dartignore" "$FLUTTER_ROOT/bin/internal/update_dart_sdk.sh" - VERBOSITY=--verbosity=error + VERBOSITY="--verbosity=error" echo Building flutter tool... - if [[ "$TRAVIS" == "true" ]] || [[ "$BOT" == "true" ]] || [[ "$CONTINUOUS_INTEGRATION" == "true" ]] || [[ "$CHROME_HEADLESS" == "1" ]] || [[ "$APPVEYOR" == "true" ]] || [[ "$CI" == "true" ]]; then + if [[ "$CI" == "true" || "$BOT" == "true" || "$CONTINUOUS_INTEGRATION" == "true" || "$CHROME_HEADLESS" == "1" ]]; then PUB_ENVIRONMENT="$PUB_ENVIRONMENT:flutter_bot" - VERBOSITY=--verbosity=all + VERBOSITY="--verbosity=all" fi export PUB_ENVIRONMENT="$PUB_ENVIRONMENT:flutter_install" @@ -104,8 +104,8 @@ function upgrade_flutter () { while : ; do cd "$FLUTTER_TOOLS_DIR" - "$PUB" upgrade $VERBOSITY --no-packages-dir && break - echo Error: Unable to 'pub upgrade' flutter tool. Retrying in five seconds... + "$PUB" upgrade "$VERBOSITY" --no-packages-dir && break + echo "Error: Unable to 'pub upgrade' flutter tool. Retrying in five seconds..." sleep 5 done "$DART" --snapshot="$SNAPSHOT_PATH" --packages="$FLUTTER_TOOLS_DIR/.packages" "$SCRIPT_PATH" @@ -132,7 +132,7 @@ DART="$DART_SDK_PATH/bin/dart" PUB="$DART_SDK_PATH/bin/pub" # Test if running as superuser – but don't warn if running within Docker -if [[ "$EUID" == "0" ]] && ! [[ -f /.dockerenv ]]; then +if [[ "$EUID" == "0" && ! -f /.dockerenv ]]; then echo " Woah! You appear to be trying to run flutter as root." echo " We strongly recommend running the flutter tool without superuser privileges." echo " /" @@ -160,12 +160,14 @@ fi (upgrade_flutter) 3< "$PROG_NAME" set +e +# FLUTTER_TOOL_ARGS isn't quoted below, because it is meant to be considered as +# separate space-separated args. "$DART" $FLUTTER_TOOL_ARGS "$SNAPSHOT_PATH" "$@" # The VM exits with code 253 if the snapshot version is out-of-date. # If it is, we need to snapshot it again. EXIT_CODE=$? -if [[ $EXIT_CODE -ne 253 ]]; then +if [[ $EXIT_CODE != 253 ]]; then exit $EXIT_CODE fi diff --git a/bin/flutter.bat b/bin/flutter.bat index 4764703b9e4a8..fd458cfba7059 100644 --- a/bin/flutter.bat +++ b/bin/flutter.bat @@ -119,12 +119,10 @@ GOTO :after_subroutine REM Makes changes to PUB_ENVIRONMENT only visible to commands within SETLOCAL/ENDLOCAL SETLOCAL SET VERBOSITY=--verbosity=error - IF "%TRAVIS%" == "true" GOTO on_bot + IF "%CI%" == "true" GOTO on_bot IF "%BOT%" == "true" GOTO on_bot IF "%CONTINUOUS_INTEGRATION%" == "true" GOTO on_bot IF "%CHROME_HEADLESS%" == "1" GOTO on_bot - IF "%APPVEYOR%" == "true" GOTO on_bot - IF "%CI%" == "true" GOTO on_bot GOTO not_on_bot :on_bot SET PUB_ENVIRONMENT=%PUB_ENVIRONMENT%:flutter_bot @@ -135,7 +133,7 @@ GOTO :after_subroutine IF EXIST "%pub_cache_path%" SET PUB_CACHE=%pub_cache_path% ) :retry_pub_upgrade - CALL "%pub%" upgrade %VERBOSITY% --no-packages-dir + CALL "%pub%" upgrade "%VERBOSITY%" --no-packages-dir IF "%ERRORLEVEL%" NEQ "0" ( ECHO Error: Unable to 'pub upgrade' flutter tool. Retrying in five seconds... timeout /t 5 /nobreak diff --git a/dev/bots/README.md b/dev/bots/README.md index 9ecef48ab9757..a340fd1a34726 100644 --- a/dev/bots/README.md +++ b/dev/bots/README.md @@ -3,16 +3,22 @@ This directory exists to support building Flutter on our build infrastructure. The results of such builds are viewable at: +* https://cirrus-ci.com/github/flutter/flutter/master + - Testing done on PRs and submitted changes on GitHub. * https://build.chromium.org/p/client.flutter/console -* https://travis-ci.org/flutter/flutter/builds (limited checking used just for PRs on github) + - Additional testing and processing done after changes are submitted. -The external master pages for the chromium infra bots do not allow +The external master pages for the Chromium infra bots do not allow forcing new builds. Contact @eseidelGoogle or another member of Google's Flutter team if you need to do that. -The Travis-based bots are trivial, and just run a couple of shell -scripts. The rest of this document discusses only the chromium infra -bots. +The [Cirrus](https://cirrus-ci.org)-based bots run the [`test.dart`](test.dart) +script for each PR and submission. It does testing for the tools, for the +framework, and (for submitted changes only) rebuilds and updates the master +branch API docs staging site. For tagged dev and beta builds, it also builds and +deploys the gallery app to the app stores. + +The rest of this document discusses only the Chromium infra bots. This infrastructure is broken into two parts. A buildbot master specified by our [builders.pyl](https://chromium.googlesource.com/chromium/tools/build.git/+/master/masters/master.client.flutter/builders.pyl) diff --git a/dev/bots/docs.sh b/dev/bots/docs.sh index 8bae3cacab6da..6b68da8c42e10 100755 --- a/dev/bots/docs.sh +++ b/dev/bots/docs.sh @@ -75,7 +75,7 @@ fi # Ensure google webmaster tools can verify our site. cp "$FLUTTER_ROOT/dev/docs/google2ed1af765c529f57.html" "$FLUTTER_ROOT/dev/docs/doc" -# Upload new API docs when on Travis +# Upload new API docs when running on Cirrus if [[ -n "$CIRRUS_CI" && -z "$CIRRUS_PR" ]]; then echo "This is not a pull request; considering whether to upload docs... (branch=$CIRRUS_BRANCH)" if [[ "$CIRRUS_BRANCH" == "master" || "$CIRRUS_BRANCH" == "beta" ]]; then diff --git a/dev/bots/test.dart b/dev/bots/test.dart index b9c4d506d9005..b29bebaf1c45e 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -33,8 +33,8 @@ const Map _kShards = { 'tests': _runTests, 'tool_tests': _runToolTests, 'coverage': _runCoverage, - // 'docs': handled by travis_script.sh and docs.sh - // 'build_and_deploy_gallery': handled by travis_script.sh + // 'docs': handled by docs.sh + // 'build_and_deploy_gallery': handled by deploy_gallery.sh }; const Duration _kLongTimeout = Duration(minutes: 45); diff --git a/dev/bots/travis_install.sh b/dev/bots/travis_install.sh deleted file mode 100755 index bbe52f851433e..0000000000000 --- a/dev/bots/travis_install.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -set -ex - -function retry { - local total_tries=$1 - local remaining_tries=$total_tries - shift - while [ $remaining_tries -gt 0 ]; do - "$@" && break - remaining_tries=$(($remaining_tries - 1)) - sleep 5 - done - - [ $remaining_tries -eq 0 ] && { - echo "Command still failed after $total_tries tries: $@" - return 1 - } - return 0 -} - -if [ -n "$TRAVIS" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then - gem install coveralls-lcov - gem install bundler - retry 5 npm install -g firebase-tools@">=3.6.1 <3.7.0" -fi diff --git a/dev/bots/travis_script.sh b/dev/bots/travis_script.sh deleted file mode 100755 index f85bc3eefc302..0000000000000 --- a/dev/bots/travis_script.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -set -ex - -export PATH="$PWD/bin:$PWD/bin/cache/dart-sdk/bin:$PATH" - -if [ "$SHARD" = "build_and_deploy_gallery" ]; then - version=$( ../gcloud_key_file.json - -set -x - -if [ -n "$TRAVIS" ]; then - # Only used to upload docs. Don't install gcloud SDK otherwise. - if [ "$TRAVIS_OS_NAME" = "linux" ] && [ "$SHARD" = "docs" ]; then - export CLOUDSDK_CORE_DISABLE_PROMPTS=1 - echo "Installing Google Cloud SDK..." - curl https://sdk.cloud.google.com | bash > /dev/null - echo "Google Cloud SDK installation completed." - fi - - # Android SDK only needed to build the gallery on build_and_deploy_gallery Linux shard. - if [ "$TRAVIS_OS_NAME" = "linux" ] && [ "$SHARD" = "build_and_deploy_gallery" ]; then - # Background for not using Travis's built-in Android tags - # https://github.com/flutter/plugins/pull/145 - # Copied from https://github.com/flutter/plugins/blame/master/.travis.yml - wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip - mkdir android-sdk - unzip -qq sdk-tools-linux-3859397.zip -d android-sdk - export ANDROID_HOME=`pwd`/android-sdk - export PATH=`pwd`/android-sdk/tools/bin:$PATH - mkdir -p /home/travis/.android # silence sdkmanager warning - set +x # Travis's env variable hiding is a bit wonky. Don't echo back this line. - if [ -n "$ANDROID_GALLERY_UPLOAD_KEY" ]; then - echo "$ANDROID_GALLERY_UPLOAD_KEY" | base64 --decode > /home/travis/.android/debug.keystore - fi - set -x - echo 'count=0' > /home/travis/.android/repositories.cfg # silence sdkmanager warning - # suppressing output of sdkmanager to keep log under 4MB (travis limit) - echo y | sdkmanager "tools" >/dev/null - echo y | sdkmanager "platform-tools" >/dev/null - echo y | sdkmanager "build-tools;27.0.3" >/dev/null - echo y | sdkmanager "platforms;android-27" >/dev/null - echo y | sdkmanager "extras;android;m2repository" >/dev/null - echo y | sdkmanager "extras;google;m2repository" >/dev/null - echo y | sdkmanager "patcher;v4" >/dev/null - sdkmanager --list - wget http://services.gradle.org/distributions/gradle-4.4-bin.zip - unzip -qq gradle-4.4-bin.zip - export GRADLE_HOME=$PWD/gradle-4.4 - export PATH=$GRADLE_HOME/bin:$PATH - gradle -v - ./bin/flutter doctor - fi -fi - -# rename the SDK directory to include a space -echo "Renaming Flutter checkout directory to 'flutter sdk'" -cd .. -mv flutter flutter\ sdk -cd flutter\ sdk -echo "SDK directory is: $PWD" - -# 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 diff --git a/dev/devicelab/README.md b/dev/devicelab/README.md index 4450ee06a8209..2a0eba6281be9 100644 --- a/dev/devicelab/README.md +++ b/dev/devicelab/README.md @@ -64,7 +64,7 @@ Legend: ![Task status legend](images/legend.png) The example below shows that commit `e122d5d` caused a wide-spread breakage, -which was fixed by `bdc6f10`. It also shows that Travis, AppVeyor and Chrome +which was fixed by `bdc6f10`. It also shows that Cirrus and Chrome Infra (left-most tasks) decided to skip building these commits. Hovering over a cell will pop up a tooltip containing the name of the broken task. Clicking on the cell will open the log file in a new browser tab (only visible to core @@ -75,9 +75,9 @@ contributors as of today). ## Why is a task stuck on "new task" status? The dashboard aggregates build results from multiple build environments, -including Travis, AppVeyor, Chrome Infra, and devicelab. While devicelab +including Cirrus, Chrome Infra, and devicelab. While devicelab tests every commit that goes into the `master` branch, other environments -may skip some commits. For example, Travis and AppVeyor will only test the +may skip some commits. For example, Cirrus will only test the _last_ commit of a PR that's merged into the `master` branch. Chrome Infra may skip commits when they come in too fast. diff --git a/dev/devicelab/manifest.yaml b/dev/devicelab/manifest.yaml index 5621cdbf1fda8..78388f970dd2d 100644 --- a/dev/devicelab/manifest.yaml +++ b/dev/devicelab/manifest.yaml @@ -17,7 +17,7 @@ # * stage: one of "devicelab", "devicelab_ios", "devicelab_win" # tasks are grouped by stage so they appear next to each on the dashboard and have a distinct # icon attached to them. Stages can be used to create dependencies, e.g. we may decide to not -# run device tests on red Travis. +# run device tests on red Cirrus builds. # * required_agent_capabilities: a list of strings # list of capabilities a devicelab agent must have to be able to run this task. # diff --git a/examples/flutter_gallery/android/fastlane/README.md b/examples/flutter_gallery/android/fastlane/README.md index 2c91f153f23b7..6030165b36cc0 100644 --- a/examples/flutter_gallery/android/fastlane/README.md +++ b/examples/flutter_gallery/android/fastlane/README.md @@ -1,10 +1,10 @@ -fastlane documentation +FastLane documentation ================ This folder contains hermetic scripts to deploy a built APK to the play store. -This is done using the [fastlane](https://fastlane.tools) tool suite. +This is done using the [FastLane](https://fastlane.tools) tool suite. Deployment can be done manually by Googlers by following go/flutter-gallery-publish (internal doc). -Deployment is automatically done by Travis on branch cuts. +Deployment is automatically done by Cirrus on tagged branch commits. diff --git a/examples/flutter_gallery/ios/fastlane/Fastfile b/examples/flutter_gallery/ios/fastlane/Fastfile index 957711cca41ef..5ab932fd95bc0 100644 --- a/examples/flutter_gallery/ios/fastlane/Fastfile +++ b/examples/flutter_gallery/ios/fastlane/Fastfile @@ -22,7 +22,10 @@ end platform :ios do desc 'Push a new release to TestFlight' lane :build_and_deploy_testflight do |options| - # Doesn't do anything when not on Travis. + # Doesn't do anything when not on a CI bot. Even though it's called + # "setup_travis", this also runs on Cirrus, since the CI environment + # variable is set. When on a CI bot, it creates a temporary keychain and + # switches "match" to readonly mode to not create new profiles/certs on CI. setup_travis # Relative to this file. diff --git a/examples/flutter_gallery/ios/fastlane/README.md b/examples/flutter_gallery/ios/fastlane/README.md index b923a9b9d6125..410b0b4fbfd4e 100644 --- a/examples/flutter_gallery/ios/fastlane/README.md +++ b/examples/flutter_gallery/ios/fastlane/README.md @@ -1,11 +1,11 @@ -fastlane documentation +FastLane documentation ================ This folder contains hermetic scripts to re-build the app using a distribution profile and then deploy to TestFlight. -This is done using the [fastlane](https://fastlane.tools) tool suite. +This is done using the [FastLane](https://fastlane.tools) tool suite. Deployment can be done manually by Googlers by following go/flutter-gallery-publish (internal doc). -Deployment is automatically done by Travis on branch cuts. \ No newline at end of file +Deployment is automatically done by Cirrus on tagged branch commits. \ No newline at end of file diff --git a/packages/flutter_test/lib/flutter_test.dart b/packages/flutter_test/lib/flutter_test.dart index c46e733bb9a82..8f8cc8e5b2426 100644 --- a/packages/flutter_test/lib/flutter_test.dart +++ b/packages/flutter_test/lib/flutter_test.dart @@ -53,7 +53,6 @@ export 'src/finders.dart'; export 'src/goldens.dart'; export 'src/matchers.dart'; export 'src/nonconst.dart'; -export 'src/platform.dart'; export 'src/stack_manipulation.dart'; export 'src/test_async_utils.dart'; export 'src/test_exception_reporter.dart'; diff --git a/packages/flutter_test/lib/src/platform.dart b/packages/flutter_test/lib/src/platform.dart deleted file mode 100644 index e6b52ec2c7db4..0000000000000 --- a/packages/flutter_test/lib/src/platform.dart +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:io'; - -/// Whether the test is running in a Travis CI environment. -bool get runningOnTravis => Platform.environment['TRAVIS'] == 'true'; diff --git a/packages/flutter_tools/lib/src/base/utils.dart b/packages/flutter_tools/lib/src/base/utils.dart index 44e9c620e8a9b..e8a609aa9ab2d 100644 --- a/packages/flutter_tools/lib/src/base/utils.dart +++ b/packages/flutter_tools/lib/src/base/utils.dart @@ -24,21 +24,24 @@ class BotDetector { return platform.environment['BOT'] != 'false' && (platform.environment['BOT'] == 'true' - // https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables + // https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables || platform.environment['TRAVIS'] == 'true' || platform.environment['CONTINUOUS_INTEGRATION'] == 'true' || platform.environment.containsKey('CI') // Travis and AppVeyor - // https://www.appveyor.com/docs/environment-variables/ + // https://www.appveyor.com/docs/environment-variables/ || platform.environment.containsKey('APPVEYOR') - // https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html + // https://cirrus-ci.org/guide/writing-tasks/#environment-variables + || platform.environment.containsKey('CIRRUS_CI') + + // https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html || (platform.environment.containsKey('AWS_REGION') && platform.environment.containsKey('CODEBUILD_INITIATOR')) - // https://wiki.jenkins.io/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-belowJenkinsSetEnvironmentVariables + // https://wiki.jenkins.io/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-belowJenkinsSetEnvironmentVariables || platform.environment.containsKey('JENKINS_URL') - // Properties on Flutter's Chrome Infra bots. + // Properties on Flutter's Chrome Infra bots. || platform.environment['CHROME_HEADLESS'] == '1' || platform.environment.containsKey('BUILDBOT_BUILDERNAME')); }