# CIRRUS CONFIGURATION FILE

use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true'

environment:
  # For details about environment variables used in Cirrus, including how encrypted variables work,
  # see https://cirrus-ci.org/guide/writing-tasks/#environment-variables
  GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
  # We change Flutter's directory to include a space in its name (see $CIRRUS_WORKING_DIR) so that
  # we constantly test path names with spaces in them. The FLUTTER_SDK_PATH_WITH_SPACE variable must
  # therefore have a space in it.
  FLUTTER_SDK_PATH_WITH_SPACE: "flutter sdk"
  # We force BOT to true so that all our tools know we're in a CI environment. This avoids any
  # dependency on precisely how Cirrus is detected by our tools.
  BOT: "true"
  # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they might include non-ASCII
  # characters which makes Gradle crash. See: https://github.com/flutter/flutter/issues/24935
  # TODO(amirha): remove once we've migrated to newer Gradle
  CIRRUS_CHANGE_MESSAGE: ""
  CIRRUS_COMMIT_MESSAGE: ""

# LINUX SHARDS
task:
  container:
    dockerfile: "dev/ci/docker_linux/Dockerfile"
    cpu: $CPU
    memory: $MEMORY
  environment:
    # We shrink our default resource requirement as much as possible because that way we are more
    # likely to get scheduled. We require 4G of RAM because most of the shards (all but one as of
    # October 2019) just get OOM-killed with less. Some shards may need more. When increasing the
    # requirements for select shards, please leave a comment on those shards saying when you
    # increased the requirements, what numbers you tried, and what the results were.
    CPU: 1 # 0.1-8 without compute credits, 0.1-30 with (yes, you can go fractional)
    MEMORY: 4G # 256M-24G without compute credits, 256M-90G with
    CIRRUS_WORKING_DIR: "/tmp/$FLUTTER_SDK_PATH_WITH_SPACE"
    CIRRUS_DOCKER_CONTEXT: "dev/ci/docker_linux"
    PATH: "$CIRRUS_WORKING_DIR/bin:$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin:$PATH"
    ANDROID_SDK_ROOT: "/opt/android_sdk"
  pub_cache:
    folder: $HOME/.pub-cache
    fingerprint_script: echo $OS; grep -r --include=pubspec.yaml 'PUBSPEC CHECKSUM' "$CIRRUS_WORKING_DIR"
  flutter_pkg_cache:
    folder: bin/cache/pkg
    fingerprint_script: echo $OS; cat bin/internal/*.version
  artifacts_cache:
    folder: bin/cache/artifacts
    fingerprint_script: echo $OS; cat bin/internal/*.version
  setup_script:
    - date
    - git clean -xffd
    - git fetch origin
    - git fetch origin master # To set FETCH_HEAD, so that "git merge-base" works.
    - flutter config --no-analytics
    - flutter doctor -v
    - flutter update-packages
    - ./dev/bots/accept_android_sdk_licenses.sh
    - date
  on_failure:
    failure_script:
      - date
      - which flutter
  matrix:
    - name: analyze-linux # linux-only
      # environment:
        # Empirically, the analyze-linux shard runs surprisingly fast (under 15 minutes) with just 1
        # CPU and 4G RAM as of October 2019. It fails with less than 4G though.
      script:
        - dart --enable-asserts ./dev/bots/analyze.dart

    - name: framework_tests-widgets-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # We use 3 CPUs because that's the minimum required to get framework_tests-widgets-linux
        # running fast enough that it is not the long pole, as of OCtober 2019.
        CPU: 3
        GOLDCTL: "$CIRRUS_WORKING_DIR/depot_tools/goldctl"
        GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
      script:
        - ./dev/bots/download_goldctl.sh
        - dart --enable-asserts ./dev/bots/test.dart

    - name: framework_tests-libraries-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # We use 3 CPUs because that's the minimum required to get the
        # framework_tests-libraries-linux shard running fast enough that it is not the long pole, as
        # of October 2019.
        CPU: 3
        GOLDCTL: "$CIRRUS_WORKING_DIR/depot_tools/goldctl"
        GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
      script:
        - ./dev/bots/download_goldctl.sh
        - dart --enable-asserts ./dev/bots/test.dart

    - name: framework_tests-misc-linux
      # this includes the tests for directories in dev/
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # We use 3 CPUs because that's the minimum required to get framework_tests-misc-linux
        # running fast enough that it is not the long pole, as of October 2019.
        CPU: 3
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: tool_tests-general-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the tool_tests-general-linux shard got faster with more CPUs up to 4
        # CPUs, and needed at least 8G of RAM to not run out of memory.
        CPU: 4
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: tool_tests-commands-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the tool_tests-commands-linux shard got faster with more CPUs up to 6
        # CPUs, and needed at least 8G of RAM to not run out of memory.
        CPU: 6
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: tool_tests-integration-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the tool_tests-integration-linux shard got faster with more CPUs up to
        # 6 CPUs, and needed at least 8G of RAM to not run out of memory.
        CPU: 6
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: tool_coverage-linux # linux-only
      only_if: "$CIRRUS_PR == ''"
      environment:
        # As of October 2019, the tool_coverage-linux shard needed at least 12G of RAM to run without
        # getting OOM-killed, and even 8 CPUs took 25 minutes.
        CPU: 8
        MEMORY: 12G
        CODECOV_TOKEN: ENCRYPTED[7c76a7f8c9264f3b7f3fd63fcf186f93c62c4dfe43ec288861c2f506d456681032b89efe7b7a139c82156350ca2c752c]
      script:
        - dart --enable-asserts ./dev/bots/test.dart
        - bash <(curl -s https://codecov.io/bash) -c -f packages/flutter_tools/coverage/lcov.info -F flutter_tool

    - name: web_tests-0-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the Web shards needed more than 6G of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: web_tests-1-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the Web shards needed more than 6G of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: web_tests-2-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the Web shards needed more than 6G of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: web_tests-3-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the Web shards needed more than 6G of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: web_tests-4-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the Web shards needed more than 6G of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: web_tests-5-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the Web shards needed more than 6G of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: web_tests-6-linux
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the Web shards needed more than 6G of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: web_tests-7_last-linux # last Web shard must end with _last
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # As of October 2019, the Web shards needed more than 6G of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: build_tests-linux
      environment:
        # With 1 CPU and 4G of RAM, as of October 2019, build_tests-linux would get OOM-killed.
        # Increasing the RAM to 12G allowed it to finish in about 30 minutes, any extra CPU (tried 2
        # and 4) reduced that to just over 20 minutes. 6G was enough not to get OOM-killed.
        CPU: 2
        MEMORY: 6G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-0-linux
      environment:
        # Some of the host-only devicelab tests are pretty involved and need a lot of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-1-linux
      environment:
        # Some of the host-only devicelab tests are pretty involved and need a lot of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-2-linux
      environment:
        # Some of the host-only devicelab tests are pretty involved and need a lot of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-3_last-linux
      environment:
        # Some of the host-only devicelab tests are pretty involved and need a lot of RAM.
        CPU: 2
        MEMORY: 8G
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    # TODO(ianh): name: add_to_app_tests-linux

    - name: docs-linux # linux-only
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_drive/**', 'packages/flutter_localizations/**', 'packages/flutter_goldens/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        # Empirically, as of October 2019, the docs-linux shard took about 30 minutes when run with
        # 1 CPU and 4G of RAM. 2 CPUs reduced that to 20 minutes, more CPUs did not improve matters.
        CPU: 2
        # For uploading master docs to Firebase master branch staging site
        FIREBASE_MASTER_TOKEN: ENCRYPTED[eb768d18798fdc5abfe09b224e1724c4d82831d715ccf90df2c79d618c317216cbd99493278361f6fe7948b409b603f0]
        # For uploading beta docs to Firebase public live site
        FIREBASE_PUBLIC_TOKEN: ENCRYPTED[37e8b82f167864cae9a3f4d2cf3f37dea331d9375c295327c45de524f6c588fa6f6d63e5784f10f6d43ce29689f36c92]
      script:
        - ./dev/bots/docs.sh

    - name: customer_testing-linux
      # environment:
        # Empirically, this shard runs fine at 1 CPU and 4G RAM as of October 2019. We will probably
        # want to grow this container when we invite people to add their tests in large numbers.
      script:
        - rm -rf bin/cache/pkg/tests
        - git clone https://github.com/flutter/tests.git bin/cache/pkg/tests
        - dart --enable-asserts dev/customer_testing/run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test

    - name: firebase_test_lab_tests-linux # linux-only
      environment:
        # Empirically, this shard runs in 20-25 minutes with just one CPU and 4G of RAM, as of
        # October 2019. It does not seem to be sensitive to the number of CPUs or amount of RAM;
        # doubling CPUs had no effect (mere seconds under 20 minutes), increasing RAM to 24G left it
        # on the high end of the 20-25 minute range. (This makes sense, as it's just driving the
        # Firebase test lab remotely.) Less than 4G of RAM made it go OOM.
        CLOUDSDK_CORE_DISABLE_PROMPTS: 1
        GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec]
      script:
        - ./dev/bots/firebase_testlab.sh

    - name: deploy_gallery-linux # linux- and macos- only
      depends_on:
        - analyze-linux
        - framework_tests-widgets-linux
        - framework_tests-libraries-linux
        - framework_tests-misc-linux
        - tool_tests-general-linux
        - tool_tests-commands-linux
        - tool_tests-integration-linux
        - build_tests-linux
        - hostonly_devicelab_tests-0-linux
        - hostonly_devicelab_tests-1-linux
        - hostonly_devicelab_tests-2-linux
        - hostonly_devicelab_tests-3_last-linux
        - firebase_test_lab_tests-linux
      environment:
        # As of October 2019, 1 CPU and 4G of RAM let deploy_gallery-linux finish in about 15
        # minutes, once it got started.
        GOOGLE_DEVELOPER_SERVICE_ACCOUNT_ACTOR_FASTLANE: ENCRYPTED[d9ac1462c3c556fc2f8165c9d5566a16497d8ebc38a50357f7f3abf136b7f83e1d1d76dde36fee356cb0f9ebf7a89346]
        ANDROID_GALLERY_UPLOAD_KEY: ENCRYPTED[0f2aca35f05b26add5d9edea2a7449341269a2b7e22d5c667f876996e2e8bc44ff1369431ebf73b7c5581fd95d0e5902]
      script:
        - ./dev/bots/deploy_gallery.sh

# WINDOWS SHARDS
task:
  windows_container:
    image: cirrusci/android-sdk:28-windowsservercore-2019
    os_version: 2019
    cpu: $CPU
    memory: $MEMORY
  environment:
    # It's not clear that changing the cpu/memory fields here has any impact, so we use
    # small numbers...
    CPU: 2 # 1-8 without compute credits, 1-30 with
    MEMORY: 2G # 256M-24G without compute credits, 256M-90G with
    CIRRUS_WORKING_DIR: "C:\\Windows\\Temp\\$FLUTTER_SDK_PATH_WITH_SPACE"
    PATH: "$CIRRUS_WORKING_DIR/bin;$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin;$PATH"
  pub_cache:
    folder: $APPDATA\Pub\Cache
    fingerprint_script:
      - ps: $Environment:OS; Get-ChildItem -Path "$Environment:CIRRUS_WORKING_DIR" pubspec.yaml -Recurse | Select-String -Pattern "PUBSPEC CHECKSUM" -SimpleMatch
  flutter_pkg_cache:
    folder: bin\cache\pkg
    fingerprint_script: echo %OS% & type bin\internal\*.version
  artifacts_cache:
    folder: bin\cache\artifacts
    fingerprint_script: echo %OS% & type bin\internal\*.version
  setup_script:
    - git clean -xffd
    - git fetch origin
    - git fetch origin master # To set FETCH_HEAD, so that "git merge-base" works.
    - flutter config --no-analytics
    - flutter doctor -v
    - flutter update-packages
    - git fetch origin master
  matrix:
    - name: framework_tests-widgets-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        GOLDCTL: "C:\\Windows\\Temp\\depot_tools\\goldctl.exe"
        GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
      script:
        - powershell dev\bots\download_goldctl.ps1
        - dart --enable-asserts dev\bots\test.dart

    - name: framework_tests-libraries-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        GOLDCTL: "C:\\Windows\\Temp\\depot_tools\\goldctl.exe"
        GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
      script:
        - powershell dev\bots\download_goldctl.ps1
        - dart --enable-asserts dev\bots\test.dart

    - name: framework_tests-misc-windows
      # this includes the tests for directories in dev/
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      script:
        - dart --enable-asserts dev\bots\test.dart

    - name: tool_tests-general-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: tool_tests-commands-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: tool_tests-integration-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    # TODO(ianh): Enable Web tests on Windows

    - name: build_tests-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941
      script:
        - dart --enable-asserts dev\bots\test.dart

    - name: hostonly_devicelab_tests-0-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-1-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-2-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-3_last-windows
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41941
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    # TODO(ianh): name: add_to_app_tests-windows

    - name: customer_testing-windows
      script:
        - CMD /S /C "IF EXIST "bin\cache\pkg\tests\" RMDIR /S /Q bin\cache\pkg\tests"
        - git clone https://github.com/flutter/tests.git bin\cache\pkg\tests
        - dart --enable-asserts dev\customer_testing\run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test

# MACOS SHARDS
# Mac doesn't use caches because they apparently take longer to populate and save
# than just fetching the data in the first place.
task:
  osx_instance:
    image: mojave-xcode-10.2-flutter # see https://cirrus-ci.org/guide/macOS/ for list of images (we should update regularly)
    # cpu is always 2
    # memory is always 8G
  environment:
    CIRRUS_WORKING_DIR: "/tmp/$FLUTTER_SDK_PATH_WITH_SPACE"
    FLUTTER_FRAMEWORK_DIR: "$CIRRUS_WORKING_DIR/bin/cache/artifacts/engine/ios/"
    PATH: "$CIRRUS_WORKING_DIR/bin:$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin:$PATH"
    COCOAPODS_DISABLE_STATS: true
    CPU: 2
    MEMORY: 8G
  setup_script:
    - date
    - which flutter
    - sudo gem install bundler -v 2.0.2 -N
    - bundle install --system --gemfile=dev/ci/mac/Gemfile
    - git clean -xffd
    - git fetch origin
    - git fetch origin master # To set FETCH_HEAD, so that "git merge-base" works.
    - flutter config --no-analytics
    - flutter doctor -v
    - flutter update-packages
    - date
    - which flutter
  on_failure:
    failure_script:
      - date
      - which flutter
  matrix:
    - name: framework_tests-widgets-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        GOLDCTL: "$CIRRUS_WORKING_DIR/depot_tools/goldctl"
        GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - ./dev/bots/download_goldctl.sh
        - dart --enable-asserts dev/bots/test.dart

    - name: framework_tests-libraries-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      environment:
        GOLDCTL: "$CIRRUS_WORKING_DIR/depot_tools/goldctl"
        GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - ./dev/bots/download_goldctl.sh
        - dart --enable-asserts dev/bots/test.dart

    - name: framework_tests-misc-macos
      # this includes the tests for directories in dev/
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/lib/src/test/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts dev/bots/test.dart

    - name: tool_tests-general-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts ./dev/bots/test.dart

    - name: tool_tests-commands-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts ./dev/bots/test.dart

    - name: tool_tests-integration-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter_tools/**', 'bin/internal/**') || $CIRRUS_PR == ''"
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts ./dev/bots/test.dart

    # TODO(ianh): Enable Web tests on macOS.

    - name: build_tests-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41940
      script:
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-0-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41940
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-1-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41940
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-2-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41940
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts ./dev/bots/test.dart

    - name: hostonly_devicelab_tests-3_last-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41940
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts ./dev/bots/test.dart

    - name: add_to_app_tests-macos
      only_if: "changesInclude('.cirrus.yml', 'dev/**', 'bin/internal/**') || $CIRRUS_PR == ''" # https://github.com/flutter/flutter/issues/41940
      skip: true # https://github.com/flutter/flutter/pull/42444
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - dart --enable-asserts dev/bots/test.dart

    - name: customer_testing-macos
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - rm -rf bin/cache/pkg/tests
        - git clone https://github.com/flutter/tests.git bin/cache/pkg/tests
        - dart --enable-asserts dev/customer_testing/run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test

    - name: deploy_gallery-macos # linux- and macos- only
      depends_on:
        - analyze-linux
        - framework_tests-widgets-macos
        - framework_tests-libraries-macos
        - framework_tests-misc-macos
        - tool_tests-general-macos
        - tool_tests-commands-macos
        - tool_tests-integration-macos
        - build_tests-macos
        - hostonly_devicelab_tests-0-macos
        - hostonly_devicelab_tests-1-macos
        - hostonly_devicelab_tests-2-macos
        - hostonly_devicelab_tests-3_last-macos
        - firebase_test_lab_tests-linux
      environment:
        # Apple Fastlane password.
        FASTLANE_PASSWORD: ENCRYPTED[4b1f0b8d52874e9de965acd46c79743f3b81f3a513614179b9be7cf53dc8258753e257bdadb11a298ee455259df21865]
        # Private repo for publishing certificates.
        PUBLISHING_MATCH_CERTIFICATE_REPO: ENCRYPTED[3c0e78877d933fc80107aa6f3790fd1cf927250b852d6cb53202be696b4903ed8ca839b809626aaf18050bf7e436fab7]
        PUBLISHING_MATCH_REPO_TOKEN: ENCRYPTED[3d1230b744c6ed6c788a91bec741b769401dbcd426b18f9af8080bfeefdfc21913ca4047980c5b5b7ce823f12e7b6b19]
        # Apple Certificates Match Passphrase
        MATCH_PASSWORD: ENCRYPTED[db07f252234397090e3ec59152d9ec1831f5ecd0ef97d247b1dca757bbb9ef9b7c832a39bce2caf1949ccdf097e59a73]
      script:
        - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
        - ./dev/bots/deploy_gallery.sh

docker_builder:
  # Only build a new docker image when we tag a release (for dev, beta, or
  # release.) Note: tagging a commit and pushing to a release branch are
  # different cirrus triggers. See a tag CI run at e.g.
  # https://cirrus-ci.com/github/flutter/flutter/v1.2.3
  only_if: $CIRRUS_TAG != ''
  environment:
    GCLOUD_CREDENTIALS: ENCRYPTED[f7c098d4dd7f5ee1bfee0bb7e944cce72efbe10e97ad6440ae72de4de6a1c24d23f421a2619c668e94377fb64b0bb3e6]
  depends_on:
    - docs-linux
    - analyze-linux
    - framework_tests-widgets-linux
    - framework_tests-libraries-linux
    - framework_tests-misc-linux
    - tool_tests-general-linux
    - tool_tests-commands-linux
    - tool_tests-integration-linux
    - build_tests-linux
    - hostonly_devicelab_tests-0-linux
    - hostonly_devicelab_tests-1-linux
    - hostonly_devicelab_tests-2-linux
    - hostonly_devicelab_tests-3_last-linux
    - firebase_test_lab_tests-linux
  build_script:
    - cd "$CIRRUS_WORKING_DIR/dev/ci/docker_linux"
    - ./docker_build.sh
    - ./docker_login.sh
    - ./docker_push.sh