Add support to migrate docs production tests.

Change-Id: I88ae0fbd9034df96bb4b8da3c47cd96f1e23efc8
Bug: https://github.com/flutter/flutter/issues/60646
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/6880
Reviewed-by: Christopher Fujino <fujino@google.com>
Commit-Queue: Godofredo Contreras <godofredoc@google.com>
diff --git a/recipe_modules/adhoc_validation/api.py b/recipe_modules/adhoc_validation/api.py
index 6be4c9d..7b0070d 100644
--- a/recipe_modules/adhoc_validation/api.py
+++ b/recipe_modules/adhoc_validation/api.py
@@ -43,7 +43,7 @@
         self.m.step('Set execute permission', ['chmod', '755', resource_name])
       elif self.m.platform.is_win:
         resource_name = self.resource('%s.bat' % validation)
-      with self.m.context(env=env):
+      with self.m.context(env=env, env_prefixes=env_prefixes):
         dep_list = [d['dependency'] for d in deps]
         if 'xcode' in dep_list:
           with self.m.osx_sdk('ios'):
diff --git a/recipe_modules/adhoc_validation/resources/docs.sh b/recipe_modules/adhoc_validation/resources/docs.sh
index 908354b..9ac6937 100644
--- a/recipe_modules/adhoc_validation/resources/docs.sh
+++ b/recipe_modules/adhoc_validation/resources/docs.sh
@@ -5,4 +5,7 @@
 # found in the LICENSE file.
 
 set -e
+
+export FIREBASE_MASTER_TOKEN=`cat $FIREBASE_MASTER_TOKEN`
+export FIREBASE_PUBLIC_TOKEN=`cat $FIREBASE_PUBLIC_TOKEN`
 ./dev/bots/docs.sh
diff --git a/recipe_modules/android_sdk/api.py b/recipe_modules/android_sdk/api.py
index 9884158..9453f28 100644
--- a/recipe_modules/android_sdk/api.py
+++ b/recipe_modules/android_sdk/api.py
@@ -66,6 +66,7 @@
     # Setup environment variables
     env['ANDROID_SDK_ROOT'] = sdk_root
     env['ANDROID_HOME'] = sdk_root
+    env['GRADLE_USER_HOME'] = self.m.path['cache'].join('gradle')
     env['GRADLE_OPTS'] = '-Dorg.gradle.daemon=false'
     paths = env_prefixes.get('PATH', [])
     paths.append(sdk_root.join('platform-tools'))
diff --git a/recipe_modules/android_sdk/examples/full.expected/demo.json b/recipe_modules/android_sdk/examples/full.expected/demo.json
index be26b20..a8539a7 100644
--- a/recipe_modules/android_sdk/examples/full.expected/demo.json
+++ b/recipe_modules/android_sdk/examples/full.expected/demo.json
@@ -186,7 +186,8 @@
     "env": {
       "ANDROID_HOME": "[CACHE]/android29",
       "ANDROID_SDK_ROOT": "[CACHE]/android29",
-      "GRADLE_OPTS": "-Dorg.gradle.daemon=false"
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle"
     },
     "env_prefixes": {
       "PATH": [
diff --git a/recipe_modules/bucket_util/examples/full.py b/recipe_modules/bucket_util/examples/full.py
index 0e3d6f5..504cee1 100644
--- a/recipe_modules/bucket_util/examples/full.py
+++ b/recipe_modules/bucket_util/examples/full.py
@@ -72,7 +72,7 @@
   )
   yield api.test(
       'upload_packages_experimental_runtime',
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           upload_packages=True,
       ),
diff --git a/recipe_modules/flutter_deps/api.py b/recipe_modules/flutter_deps/api.py
index b4e5afe..913f36e 100644
--- a/recipe_modules/flutter_deps/api.py
+++ b/recipe_modules/flutter_deps/api.py
@@ -47,10 +47,14 @@
         means the default.
     """
     available_deps = {
-        'open_jdk': self.open_jdk, 'goldctl': self.goldctl,
-        'chrome_and_driver': self.chrome_and_driver, 'go_sdk': self.go_sdk,
-        'dashing': self.dashing, 'vpython': self.vpython,
-        'android_sdk': self.android_sdk
+        'open_jdk': self.open_jdk,
+        'goldctl': self.goldctl,
+        'chrome_and_driver': self.chrome_and_driver,
+        'go_sdk': self.go_sdk,
+        'dashing': self.dashing,
+        'vpython': self.vpython,
+        'android_sdk': self.android_sdk,
+        'firebase': self.firebase,
     }
     for dep in deps:
       if dep.get('dependency') in ['xcode', 'gems']:
@@ -150,7 +154,7 @@
     bin_path = self.m.path['cleanup'].join('go_path')
     self.m.file.ensure_directory('Ensure go path', bin_path)
     env['GOPATH'] = bin_path
-    paths.append(bin_path)
+    paths.append(bin_path.join('bin'))
     env_prefixes['PATH'] = paths
 
   def dashing(self, env, env_prefixes, version):
@@ -245,3 +249,30 @@
       env['GEM_HOME'] = gem_dir.join('ruby', '2.6.0')
       paths.append(gem_dir.join('ruby', '2.6.0', 'bin'))
       env_prefixes['PATH'] = paths
+
+  def firebase(self, env, env_prefixes, version='latest'):
+    """Installs firebase binary.
+
+    This dependency is only supported in linux.
+
+    Args:
+      env(dict): Current environment variables.
+      env_prefixes(dict):  Current environment prefixes variables.
+    """
+    firebase_dir = self.m.path['start_dir'].join('firebase')
+    self.m.file.ensure_directory('ensure directory', firebase_dir)
+    with self.m.step.nest('Install firebase'):
+      self.m.step(
+          'Install firebase bin', [
+              'curl', '-Lo',
+              firebase_dir.join('firebase'),
+              'https://firebase.tools/bin/linux/latest'
+          ]
+      )
+      self.m.step(
+          'Set execute permission',
+          ['chmod', '755', firebase_dir.join('firebase')]
+      )
+    paths = env_prefixes.get('PATH', [])
+    paths.append(firebase_dir)
+    env_prefixes['PATH'] = paths
diff --git a/recipe_modules/flutter_deps/examples/full.expected/basic.json b/recipe_modules/flutter_deps/examples/full.expected/basic.json
index 70b9286..bd2bafd 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/basic.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/basic.json
@@ -230,9 +230,9 @@
         "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path"
+        "[CLEANUP]/go_path/bin"
       ]
     },
     "name": "Install dashing"
@@ -528,6 +528,48 @@
     ]
   },
   {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/firebase"
+    ],
+    "infra_step": true,
+    "name": "ensure directory"
+  },
+  {
+    "cmd": [],
+    "name": "Install firebase"
+  },
+  {
+    "cmd": [
+      "curl",
+      "-Lo",
+      "[START_DIR]/firebase/firebase",
+      "https://firebase.tools/bin/linux/latest"
+    ],
+    "name": "Install firebase.Install firebase bin",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "chmod",
+      "755",
+      "[START_DIR]/firebase/firebase"
+    ],
+    "name": "Install firebase.Set execute permission",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/flutter_deps/examples/full.expected/flutter_engine.json b/recipe_modules/flutter_deps/examples/full.expected/flutter_engine.json
index e42ef75..4a1e9bd 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/flutter_engine.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/flutter_engine.json
@@ -230,9 +230,9 @@
         "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path"
+        "[CLEANUP]/go_path/bin"
       ]
     },
     "name": "Install dashing"
@@ -595,6 +595,48 @@
     ]
   },
   {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/firebase"
+    ],
+    "infra_step": true,
+    "name": "ensure directory"
+  },
+  {
+    "cmd": [],
+    "name": "Install firebase"
+  },
+  {
+    "cmd": [
+      "curl",
+      "-Lo",
+      "[START_DIR]/firebase/firebase",
+      "https://firebase.tools/bin/linux/latest"
+    ],
+    "name": "Install firebase.Install firebase bin",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "chmod",
+      "755",
+      "[START_DIR]/firebase/firebase"
+    ],
+    "name": "Install firebase.Set execute permission",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/flutter_deps/examples/full.expected/goldTryjob.json b/recipe_modules/flutter_deps/examples/full.expected/goldTryjob.json
index 70b9286..bd2bafd 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/goldTryjob.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/goldTryjob.json
@@ -230,9 +230,9 @@
         "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path"
+        "[CLEANUP]/go_path/bin"
       ]
     },
     "name": "Install dashing"
@@ -528,6 +528,48 @@
     ]
   },
   {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/firebase"
+    ],
+    "infra_step": true,
+    "name": "ensure directory"
+  },
+  {
+    "cmd": [],
+    "name": "Install firebase"
+  },
+  {
+    "cmd": [
+      "curl",
+      "-Lo",
+      "[START_DIR]/firebase/firebase",
+      "https://firebase.tools/bin/linux/latest"
+    ],
+    "name": "Install firebase.Install firebase bin",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "chmod",
+      "755",
+      "[START_DIR]/firebase/firebase"
+    ],
+    "name": "Install firebase.Set execute permission",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/flutter_deps/examples/full.expected/mac.json b/recipe_modules/flutter_deps/examples/full.expected/mac.json
index 1f2f874..b4f9b75 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/mac.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/mac.json
@@ -230,9 +230,9 @@
         "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path"
+        "[CLEANUP]/go_path/bin"
       ]
     },
     "name": "Install dashing"
@@ -622,6 +622,48 @@
     ]
   },
   {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/firebase"
+    ],
+    "infra_step": true,
+    "name": "ensure directory"
+  },
+  {
+    "cmd": [],
+    "name": "Install firebase"
+  },
+  {
+    "cmd": [
+      "curl",
+      "-Lo",
+      "[START_DIR]/firebase/firebase",
+      "https://firebase.tools/bin/linux/latest"
+    ],
+    "name": "Install firebase.Install firebase bin",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "chmod",
+      "755",
+      "[START_DIR]/firebase/firebase"
+    ],
+    "name": "Install firebase.Set execute permission",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/flutter_deps/examples/full.expected/with-gems.json b/recipe_modules/flutter_deps/examples/full.expected/with-gems.json
index b4a992a..9de0706 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/with-gems.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/with-gems.json
@@ -230,9 +230,9 @@
         "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path"
+        "[CLEANUP]/go_path/bin"
       ]
     },
     "name": "Install dashing"
@@ -579,16 +579,17 @@
       "CHROME_NO_SANDBOX": "true",
       "GEM_HOME": "[START_DIR]/gems",
       "GOPATH": "[CLEANUP]/go_path",
-      "GRADLE_OPTS": "-Dorg.gradle.daemon=false"
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle"
     },
     "env_prefixes": {
       "PATH": [
         "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/vpython",
         "[CACHE]/android/platform-tools",
         "[CACHE]/android/tools",
@@ -613,16 +614,17 @@
       "CHROME_NO_SANDBOX": "true",
       "GEM_HOME": "[START_DIR]/gems",
       "GOPATH": "[CLEANUP]/go_path",
-      "GRADLE_OPTS": "-Dorg.gradle.daemon=false"
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle"
     },
     "env_prefixes": {
       "PATH": [
         "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/go/bin",
-        "[CLEANUP]/go_path",
+        "[CLEANUP]/go_path/bin",
         "[CACHE]/vpython",
         "[CACHE]/android/platform-tools",
         "[CACHE]/android/tools",
@@ -653,6 +655,48 @@
     ]
   },
   {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "ensure-directory",
+      "--mode",
+      "0777",
+      "[START_DIR]/firebase"
+    ],
+    "infra_step": true,
+    "name": "ensure directory"
+  },
+  {
+    "cmd": [],
+    "name": "Install firebase"
+  },
+  {
+    "cmd": [
+      "curl",
+      "-Lo",
+      "[START_DIR]/firebase/firebase",
+      "https://firebase.tools/bin/linux/latest"
+    ],
+    "name": "Install firebase.Install firebase bin",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "chmod",
+      "755",
+      "[START_DIR]/firebase/firebase"
+    ],
+    "name": "Install firebase.Set execute permission",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/flutter_deps/examples/full.py b/recipe_modules/flutter_deps/examples/full.py
index f2c15a2..f29329a 100644
--- a/recipe_modules/flutter_deps/examples/full.py
+++ b/recipe_modules/flutter_deps/examples/full.py
@@ -45,6 +45,7 @@
   api.flutter_deps.swift()
   gems_dir = api.path['start_dir'].join('dev', 'ci', 'mac')
   api.flutter_deps.gems(env, env_prefixes, gems_dir)
+  api.flutter_deps.firebase(env, env_prefixes)
 
 
 def GenTests(api):
diff --git a/recipe_modules/repo_util/api.py b/recipe_modules/repo_util/api.py
index f4bfa85..b72fa0c 100644
--- a/recipe_modules/repo_util/api.py
+++ b/recipe_modules/repo_util/api.py
@@ -14,6 +14,7 @@
             'https://github.com/flutter/plugins'
 }
 
+import re
 from recipe_engine import recipe_api
 
 
@@ -115,13 +116,21 @@
           'did you forget to checkout flutter repo?'
       )
       self.m.python.failing_step('Flutter Environment', msg)
-
+    git_ref = self.m.properties.get('git_ref', '')
     env = {
         # Setup our own pub_cache to not affect other slaves on this machine,
         # and so that the pre-populated pub cache is contained in the package.
-        'PUB_CACHE': self.m.path['cache'].join('.pub-cache'),
+        'PUB_CACHE':
+            self.m.path['cache'].join('.pub-cache'),
         # Windows Packaging script assumes this is set.
-        'DEPOT_TOOLS': str(self.m.depot_tools.root),
+        'DEPOT_TOOLS':
+            str(self.m.depot_tools.root),
+        'LUCI_CI':
+            True,
+        'LUCI_PR':
+            re.sub('refs\/pull\/|\/head', '', git_ref),
+        'LUCI_BRANCH':
+            self.m.properties.get('release_ref', '').replace('refs/heads/', ''),
     }
     env_prefixes = {'PATH': [flutter_bin, dart_bin]}
     return env, env_prefixes
diff --git a/recipe_modules/repo_util/examples/unsupported.expected/unsupported.json b/recipe_modules/repo_util/examples/unsupported.expected/unsupported.json
index 5c85dd8..1acde3e 100644
--- a/recipe_modules/repo_util/examples/unsupported.expected/unsupported.json
+++ b/recipe_modules/repo_util/examples/unsupported.expected/unsupported.json
@@ -9,7 +9,7 @@
       "Traceback (most recent call last):",
       "  File \"RECIPE_REPO[flutter]/recipe_modules/repo_util/examples/unsupported.py\", line 15, in RunSteps",
       "    api.path['start_dir'].join('unsupported_repo'))",
-      "  File \"RECIPE_REPO[flutter]/recipe_modules/repo_util/api.py\", line 92, in checkout",
+      "  File \"RECIPE_REPO[flutter]/recipe_modules/repo_util/api.py\", line 93, in checkout",
       "    raise ValueError('Unsupported repo: %s' % name)",
       "ValueError: Unsupported repo: unsupported_repo"
     ]
diff --git a/recipes/cocoon.expected/pull_request.json b/recipes/cocoon.expected/pull_request.json
index 9946d73..393174d 100644
--- a/recipes/cocoon.expected/pull_request.json
+++ b/recipes/cocoon.expected/pull_request.json
@@ -282,6 +282,9 @@
     ],
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -299,6 +302,9 @@
     ],
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -317,6 +323,9 @@
     ],
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/cocoon.py b/recipes/cocoon.py
index fdd8e43..36616af 100644
--- a/recipes/cocoon.py
+++ b/recipes/cocoon.py
@@ -56,7 +56,7 @@
 def GenTests(api):
   tasks_dict = {'tasks': [{'task': 'one', 'script': 'myscript'}]}
   yield api.test(
-      'pull_request', api.runtime(is_luci=True, is_experimental=True),
+      'pull_request', api.runtime(is_experimental=True),
       api.properties(
           git_url='https://github.com/flutter/cocoon',
           git_ref='refs/pull/1/head'),
diff --git a/recipes/devicelab.expected/android_defines_test.json b/recipes/devicelab.expected/android_defines_test.json
index 91746da..c56391d 100644
--- a/recipes/devicelab.expected/android_defines_test.json
+++ b/recipes/devicelab.expected/android_defines_test.json
@@ -125,6 +125,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -143,6 +146,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -173,6 +179,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -213,6 +222,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -253,6 +265,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -293,6 +308,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -333,6 +351,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -373,6 +394,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -410,6 +434,10 @@
       "ANDROID_SDK_ROOT": "[CACHE]/android",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/devicelab.expected/flavors_test.json b/recipes/devicelab.expected/flavors_test.json
index c154cd0..9c2e03c 100644
--- a/recipes/devicelab.expected/flavors_test.json
+++ b/recipes/devicelab.expected/flavors_test.json
@@ -125,6 +125,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -143,6 +146,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -173,6 +179,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -213,6 +222,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -253,6 +265,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -293,6 +308,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -333,6 +351,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -373,6 +394,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -410,6 +434,10 @@
       "ANDROID_SDK_ROOT": "[CACHE]/android",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/devicelab.expected/flutter_gallery_ios__compile.json b/recipes/devicelab.expected/flutter_gallery_ios__compile.json
index 5cb8e3b..7ac82e0 100644
--- a/recipes/devicelab.expected/flutter_gallery_ios__compile.json
+++ b/recipes/devicelab.expected/flutter_gallery_ios__compile.json
@@ -125,6 +125,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -143,6 +146,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -160,6 +166,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -183,6 +192,9 @@
       "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
       "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
       "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/devicelab.expected/schedule.json b/recipes/devicelab.expected/schedule.json
index e31de7f..2c3d884 100644
--- a/recipes/devicelab.expected/schedule.json
+++ b/recipes/devicelab.expected/schedule.json
@@ -139,6 +139,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -167,6 +170,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/devicelab/devicelab_drone.expected/basic.json b/recipes/devicelab/devicelab_drone.expected/basic.json
index 1369a0a..7f982a5 100644
--- a/recipes/devicelab/devicelab_drone.expected/basic.json
+++ b/recipes/devicelab/devicelab_drone.expected/basic.json
@@ -118,6 +118,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -136,6 +139,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -156,6 +162,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/devicelab/devicelab_drone.expected/xcode.json b/recipes/devicelab/devicelab_drone.expected/xcode.json
index b9854b3..b970a14 100644
--- a/recipes/devicelab/devicelab_drone.expected/xcode.json
+++ b/recipes/devicelab/devicelab_drone.expected/xcode.json
@@ -118,6 +118,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -136,6 +139,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -166,6 +172,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -204,6 +213,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -232,6 +244,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -259,6 +274,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -284,6 +302,9 @@
     "cwd": "[START_DIR]/flutter/dev/devicelab",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/engine.py b/recipes/engine.py
index 8234b88..3e0c587 100644
--- a/recipes/engine.py
+++ b/recipes/engine.py
@@ -1623,7 +1623,7 @@
                     project='flutter',
                     revision='%s' % git_revision,
                 ),
-                api.runtime(is_luci=True, is_experimental=False),
+                api.runtime(is_experimental=False),
                 api.properties(
                     InputProperties(
                         clobber=False,
@@ -1674,7 +1674,7 @@
 
   yield api.test(
       'safeupload_raise_on_duplicate',
-      api.runtime(is_luci=True, is_experimental=False),
+      api.runtime(is_experimental=False),
       api.step_data(
           'Ensure %s does not already exist on cloud storage' %
           ('flutter//linux-x64/artifacts.zip'),
@@ -1695,7 +1695,7 @@
             project='flutter',
         ),
         collect_build_output,
-        api.runtime(is_luci=True, is_experimental=True),
+        api.runtime(is_experimental=True),
         api.properties(
             InputProperties(
                 goma_jobs='1024',
@@ -1714,7 +1714,7 @@
           project='flutter'
       ),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.step_data(
           'Copy files.Retrieve list of test FARs',
           api.file.read_text('#this is a comment\ntest.far\n'),
@@ -1745,7 +1745,7 @@
           project='flutter'
       ),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           InputProperties(
               clobber=False,
@@ -1891,7 +1891,7 @@
       # first execution.
       api.step_data("Checkout source code.bot_update", retcode=1),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           InputProperties(
               clobber=False,
diff --git a/recipes/engine/web_engine_framework.expected/linux-pre-submit.json b/recipes/engine/web_engine_framework.expected/linux-pre-submit.json
index 0a2ab26..03543c9 100644
--- a/recipes/engine/web_engine_framework.expected/linux-pre-submit.json
+++ b/recipes/engine/web_engine_framework.expected/linux-pre-submit.json
@@ -1037,6 +1037,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -1062,6 +1065,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/engine_1_20_0.py b/recipes/engine_1_20_0.py
index 9d98cfa..dd3d1ab 100644
--- a/recipes/engine_1_20_0.py
+++ b/recipes/engine_1_20_0.py
@@ -1729,7 +1729,7 @@
                   project='flutter',
                   revision='%s' % git_revision,
               ),
-              api.runtime(is_luci=True, is_experimental=False),
+              api.runtime(is_experimental=False),
               api.properties(
                   InputProperties(
                       clobber=False,
@@ -1779,7 +1779,7 @@
 
   yield api.test(
       'safeupload_raise_on_duplicate',
-      api.runtime(is_luci=True, is_experimental=False),
+      api.runtime(is_experimental=False),
       api.step_data(
           'Ensure %s does not already exist on cloud storage' %
           ('flutter//linux-x64/artifacts.zip'),
@@ -1800,7 +1800,7 @@
             project='flutter',
         ),
         collect_build_output,
-        api.runtime(is_luci=True, is_experimental=True),
+        api.runtime(is_experimental=True),
         api.properties(
             InputProperties(
                 goma_jobs='1024',
@@ -1819,7 +1819,7 @@
           project='flutter'
       ),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.step_data(
           'Copy files.Retrieve list of test FARs',
           api.file.read_text('#this is a comment\ntest.far\n'),
@@ -1850,7 +1850,7 @@
           project='flutter'
       ),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           InputProperties(
               clobber=False,
@@ -1996,7 +1996,7 @@
       # first execution.
       api.step_data("Checkout source code.bot_update", retcode=1),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           InputProperties(
               clobber=False,
diff --git a/recipes/engine_1_21_0.py b/recipes/engine_1_21_0.py
index 96d120f..2994235 100644
--- a/recipes/engine_1_21_0.py
+++ b/recipes/engine_1_21_0.py
@@ -1746,7 +1746,7 @@
                   project='flutter',
                   revision='%s' % git_revision,
               ),
-              api.runtime(is_luci=True, is_experimental=False),
+              api.runtime(is_experimental=False),
               api.properties(
                   InputProperties(
                       clobber=False,
@@ -1796,7 +1796,7 @@
 
   yield api.test(
       'safeupload_raise_on_duplicate',
-      api.runtime(is_luci=True, is_experimental=False),
+      api.runtime(is_experimental=False),
       api.step_data(
           'Ensure %s does not already exist on cloud storage' %
           ('flutter//linux-x64/artifacts.zip'),
@@ -1817,7 +1817,7 @@
             project='flutter',
         ),
         collect_build_output,
-        api.runtime(is_luci=True, is_experimental=True),
+        api.runtime(is_experimental=True),
         api.properties(
             InputProperties(
                 goma_jobs='1024',
@@ -1836,7 +1836,7 @@
           project='flutter'
       ),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.step_data(
           'Copy files.Retrieve list of test FARs',
           api.file.read_text('#this is a comment\ntest.far\n'),
@@ -1867,7 +1867,7 @@
           project='flutter'
       ),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           InputProperties(
               clobber=False,
@@ -2013,7 +2013,7 @@
       # first execution.
       api.step_data("Checkout source code.bot_update", retcode=1),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           InputProperties(
               clobber=False,
diff --git a/recipes/engine_1_22_0.py b/recipes/engine_1_22_0.py
index 20f2ef4..70e5217 100644
--- a/recipes/engine_1_22_0.py
+++ b/recipes/engine_1_22_0.py
@@ -1578,7 +1578,7 @@
                     project='flutter',
                     revision='%s' % git_revision,
                 ),
-                api.runtime(is_luci=True, is_experimental=False),
+                api.runtime(is_experimental=False),
                 api.properties(
                     InputProperties(
                         clobber=False,
@@ -1621,7 +1621,7 @@
 
   yield api.test(
       'safeupload_raise_on_duplicate',
-      api.runtime(is_luci=True, is_experimental=False),
+      api.runtime(is_experimental=False),
       api.step_data(
           'Ensure %s does not already exist on cloud storage' %
           ('flutter//linux-x64/artifacts.zip'),
@@ -1641,7 +1641,7 @@
             project='flutter',
         ),
         collect_build_output,
-        api.runtime(is_luci=True, is_experimental=True),
+        api.runtime(is_experimental=True),
         api.properties(
             InputProperties(
                 goma_jobs='1024',
@@ -1658,7 +1658,7 @@
           git_repo='https://github.com/flutter/engine',
           project='flutter'),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.step_data(
           'Copy files.Retrieve list of test FARs',
           api.file.read_text('#this is a comment\ntest.far\n'),
@@ -1686,7 +1686,7 @@
           git_repo='https://github.com/flutter/engine',
           project='flutter'),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           InputProperties(
               clobber=False,
@@ -1821,7 +1821,7 @@
       # first execution.
       api.step_data("Checkout source code.bot_update", retcode=1),
       collect_build_output,
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           InputProperties(
               clobber=False,
diff --git a/recipes/firebaselab/firebaselab.expected/basic.json b/recipes/firebaselab/firebaselab.expected/basic.json
index 57d0dc8..8a723dc 100644
--- a/recipes/firebaselab/firebaselab.expected/basic.json
+++ b/recipes/firebaselab/firebaselab.expected/basic.json
@@ -119,6 +119,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -137,6 +140,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -167,6 +173,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -203,6 +212,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -241,6 +253,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -269,6 +284,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -295,6 +313,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -333,6 +354,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -368,6 +392,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -398,6 +425,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -439,6 +469,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -467,6 +500,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -491,6 +527,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/firebaselab/firebaselab_1_20_0.expected/basic.json b/recipes/firebaselab/firebaselab_1_20_0.expected/basic.json
index 57d0dc8..8a723dc 100644
--- a/recipes/firebaselab/firebaselab_1_20_0.expected/basic.json
+++ b/recipes/firebaselab/firebaselab_1_20_0.expected/basic.json
@@ -119,6 +119,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -137,6 +140,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -167,6 +173,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -203,6 +212,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -241,6 +253,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -269,6 +284,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -295,6 +313,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -333,6 +354,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -368,6 +392,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -398,6 +425,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -439,6 +469,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -467,6 +500,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -491,6 +527,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/firebaselab/firebaselab_1_22_0.expected/basic.json b/recipes/firebaselab/firebaselab_1_22_0.expected/basic.json
index 57d0dc8..8a723dc 100644
--- a/recipes/firebaselab/firebaselab_1_22_0.expected/basic.json
+++ b/recipes/firebaselab/firebaselab_1_22_0.expected/basic.json
@@ -119,6 +119,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -137,6 +140,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -167,6 +173,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -203,6 +212,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -241,6 +253,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -269,6 +284,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -295,6 +313,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -333,6 +354,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -368,6 +392,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -398,6 +425,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -439,6 +469,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -467,6 +500,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -491,6 +527,9 @@
     "cwd": "[START_DIR]/flutter/dev/integration_tests/the_task",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/flutter.py b/recipes/flutter.py
index 0ebfbb8..1139767 100644
--- a/recipes/flutter.py
+++ b/recipes/flutter.py
@@ -282,7 +282,7 @@
                   '_experimental' if experimental else '',
                   '_upload' if should_upload else ''
               ),
-              api.runtime(is_luci=True, is_experimental=experimental),
+              api.runtime(is_experimental=experimental),
               api.properties(
                   shard='framework_coverage',
                   coveralls_lcov_version='5.1.0',
@@ -308,7 +308,7 @@
                   upload_packages=should_upload,
                   gold_tryjob=not should_upload
               ),
-              api.runtime(is_luci=True, is_experimental=experimental),
+              api.runtime(is_experimental=experimental),
           )
           yield test + api.post_check(
               lambda check, steps: check('Download goldctl' in steps)
@@ -317,7 +317,7 @@
   yield (
       api.test(
           'pull_request',
-          api.runtime(is_luci=True, is_experimental=True),
+          api.runtime(is_experimental=True),
           api.properties(
               git_url='https://github.com/flutter/flutter',
               git_ref='refs/pull/1/head',
diff --git a/recipes/flutter/flutter.expected/validators.json b/recipes/flutter/flutter.expected/validators.json
index 18d28c6..ee0bc69 100644
--- a/recipes/flutter/flutter.expected/validators.json
+++ b/recipes/flutter/flutter.expected/validators.json
@@ -133,6 +133,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -154,6 +157,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -183,6 +189,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -203,11 +212,16 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
       "PATH": [
         "[START_DIR]/flutter/bin",
+        "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
+        "[START_DIR]/flutter/bin",
         "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
       ]
     },
diff --git a/recipes/flutter/flutter_1_20_0.expected/validators.json b/recipes/flutter/flutter_1_20_0.expected/validators.json
index 024d740..4ce6b6d 100644
--- a/recipes/flutter/flutter_1_20_0.expected/validators.json
+++ b/recipes/flutter/flutter_1_20_0.expected/validators.json
@@ -197,6 +197,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -222,6 +225,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -255,6 +261,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -279,6 +288,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -286,6 +298,10 @@
         "[START_DIR]/flutter/bin",
         "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
         "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[START_DIR]/flutter/bin",
+        "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
+        "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers"
       ]
     },
diff --git a/recipes/flutter/flutter_1_21_0.expected/validators.json b/recipes/flutter/flutter_1_21_0.expected/validators.json
index 024d740..4ce6b6d 100644
--- a/recipes/flutter/flutter_1_21_0.expected/validators.json
+++ b/recipes/flutter/flutter_1_21_0.expected/validators.json
@@ -197,6 +197,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -222,6 +225,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -255,6 +261,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -279,6 +288,9 @@
       "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
       "CHROME_NO_SANDBOX": "true",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -286,6 +298,10 @@
         "[START_DIR]/flutter/bin",
         "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
         "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[START_DIR]/flutter/bin",
+        "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
+        "[CACHE]/chrome/chrome",
         "[CACHE]/chrome/drivers"
       ]
     },
diff --git a/recipes/flutter/flutter_1_22_0.expected/validators.json b/recipes/flutter/flutter_1_22_0.expected/validators.json
index 18d28c6..ee0bc69 100644
--- a/recipes/flutter/flutter_1_22_0.expected/validators.json
+++ b/recipes/flutter/flutter_1_22_0.expected/validators.json
@@ -133,6 +133,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -154,6 +157,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -183,6 +189,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -203,11 +212,16 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
       "PATH": [
         "[START_DIR]/flutter/bin",
+        "[START_DIR]/flutter/bin/cache/dart-sdk/bin",
+        "[START_DIR]/flutter/bin",
         "[START_DIR]/flutter/bin/cache/dart-sdk/bin"
       ]
     },
diff --git a/recipes/flutter/flutter_drone.expected/android_sdk.json b/recipes/flutter/flutter_drone.expected/android_sdk.json
index 5d9400a..44cfe9a 100644
--- a/recipes/flutter/flutter_drone.expected/android_sdk.json
+++ b/recipes/flutter/flutter_drone.expected/android_sdk.json
@@ -300,6 +300,10 @@
       "ANDROID_SDK_ROOT": "[CACHE]/android",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -325,6 +329,10 @@
       "ANDROID_SDK_ROOT": "[CACHE]/android",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -351,6 +359,10 @@
       "ANDROID_SDK_ROOT": "[CACHE]/android",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone.expected/no_requirements.json b/recipes/flutter/flutter_drone.expected/no_requirements.json
index a6b087b..8ba6980 100644
--- a/recipes/flutter/flutter_drone.expected/no_requirements.json
+++ b/recipes/flutter/flutter_drone.expected/no_requirements.json
@@ -119,6 +119,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -139,6 +142,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -160,6 +166,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone.expected/web_engine.json b/recipes/flutter/flutter_drone.expected/web_engine.json
index 0e1c84d..b5e2a5a 100644
--- a/recipes/flutter/flutter_drone.expected/web_engine.json
+++ b/recipes/flutter/flutter_drone.expected/web_engine.json
@@ -187,6 +187,9 @@
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "LOCAL_ENGINE": "[CACHE]/builder/src/out/host_debug_unopt",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -209,6 +212,9 @@
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "LOCAL_ENGINE": "[CACHE]/builder/src/out/host_debug_unopt",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -234,6 +240,9 @@
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "LOCAL_ENGINE": "[CACHE]/builder/src/out/host_debug_unopt",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone.expected/xcode.json b/recipes/flutter/flutter_drone.expected/xcode.json
index f7f25b0..0286db2 100644
--- a/recipes/flutter/flutter_drone.expected/xcode.json
+++ b/recipes/flutter/flutter_drone.expected/xcode.json
@@ -119,6 +119,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -139,6 +142,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -171,6 +177,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -211,6 +220,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -241,6 +253,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -270,6 +285,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -296,6 +314,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone_1_21_0.expected/android_sdk.json b/recipes/flutter/flutter_drone_1_21_0.expected/android_sdk.json
index a15d9d6..edde233 100644
--- a/recipes/flutter/flutter_drone_1_21_0.expected/android_sdk.json
+++ b/recipes/flutter/flutter_drone_1_21_0.expected/android_sdk.json
@@ -434,7 +434,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -466,7 +470,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -498,7 +506,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone_1_21_0.expected/no_requirements.json b/recipes/flutter/flutter_drone_1_21_0.expected/no_requirements.json
index a15d9d6..edde233 100644
--- a/recipes/flutter/flutter_drone_1_21_0.expected/no_requirements.json
+++ b/recipes/flutter/flutter_drone_1_21_0.expected/no_requirements.json
@@ -434,7 +434,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -466,7 +470,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -498,7 +506,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone_1_21_0.expected/xcode.json b/recipes/flutter/flutter_drone_1_21_0.expected/xcode.json
index a15d9d6..edde233 100644
--- a/recipes/flutter/flutter_drone_1_21_0.expected/xcode.json
+++ b/recipes/flutter/flutter_drone_1_21_0.expected/xcode.json
@@ -434,7 +434,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -466,7 +470,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -498,7 +506,11 @@
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GOLDCTL": "[CACHE]/gold/goldctl",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
       "JAVA_HOME": "[CACHE]/java",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone_1_22_0.expected/android_sdk.json b/recipes/flutter/flutter_drone_1_22_0.expected/android_sdk.json
index a719a53..9d936be 100644
--- a/recipes/flutter/flutter_drone_1_22_0.expected/android_sdk.json
+++ b/recipes/flutter/flutter_drone_1_22_0.expected/android_sdk.json
@@ -304,6 +304,10 @@
       "ANDROID_SDK_ROOT": "[CACHE]/android",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -329,6 +333,10 @@
       "ANDROID_SDK_ROOT": "[CACHE]/android",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -355,6 +363,10 @@
       "ANDROID_SDK_ROOT": "[CACHE]/android",
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone_1_22_0.expected/no_requirements.json b/recipes/flutter/flutter_drone_1_22_0.expected/no_requirements.json
index a7c23e2..3b186e9 100644
--- a/recipes/flutter/flutter_drone_1_22_0.expected/no_requirements.json
+++ b/recipes/flutter/flutter_drone_1_22_0.expected/no_requirements.json
@@ -123,6 +123,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -143,6 +146,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -164,6 +170,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter/flutter_drone_1_22_0.expected/xcode.json b/recipes/flutter/flutter_drone_1_22_0.expected/xcode.json
index a7c23e2..3b186e9 100644
--- a/recipes/flutter/flutter_drone_1_22_0.expected/xcode.json
+++ b/recipes/flutter/flutter_drone_1_22_0.expected/xcode.json
@@ -123,6 +123,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -143,6 +146,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
@@ -164,6 +170,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache",
       "SHARD": null,
       "SUBSHARD": null
diff --git a/recipes/flutter_1_20_0.py b/recipes/flutter_1_20_0.py
index aaa6fbe..c3182ca 100644
--- a/recipes/flutter_1_20_0.py
+++ b/recipes/flutter_1_20_0.py
@@ -272,7 +272,7 @@
           'linux_master_coverage_%s%s' %
           ('_experimental' if experimental else '',
            '_upload' if should_upload else ''),
-          api.runtime(is_luci=True, is_experimental=experimental),
+          api.runtime(is_experimental=experimental),
           api.properties(
               shard='framework_coverage',
               coveralls_lcov_version='5.1.0',
@@ -294,14 +294,14 @@
                   fuchsia_ctl_version='version:0.0.2',
                   upload_packages=should_upload,
                   gold_tryjob=not should_upload),
-              api.runtime(is_luci=True, is_experimental=experimental),
+              api.runtime(is_experimental=experimental),
           )
           yield test + api.post_check(lambda check, steps: check(
               'Download goldctl' in steps))
 
   yield (api.test(
       'pull_request',
-      api.runtime(is_luci=True, is_experimental=True),
+      api.runtime(is_experimental=True),
       api.properties(
           git_url='https://github.com/flutter/flutter',
           git_ref='refs/pull/1/head',
diff --git a/recipes/flutter_1_21_0.py b/recipes/flutter_1_21_0.py
index 4b04673..20029de 100644
--- a/recipes/flutter_1_21_0.py
+++ b/recipes/flutter_1_21_0.py
@@ -1,6 +1,7 @@
 # Copyright 2016 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.
+
 '''
 This recipe was forked from flutter.py for Flutter release version
 1.21-candidate.9.
@@ -69,7 +70,9 @@
     api.cipd.ensure(
         sevenzip_cache_dir,
         api.cipd.EnsureFile().add_package(
-            'flutter_internal/tools/7za/${platform}', 'version:19.00'))
+            'flutter_internal/tools/7za/${platform}', 'version:19.00'
+        )
+    )
     with api.context(env_prefixes={'PATH': [sevenzip_cache_dir]}):
       yield
   else:
@@ -81,8 +84,11 @@
     goldctl_cache_dir = api.path['cache'].join('gold')
     api.cipd.ensure(
         goldctl_cache_dir,
-        api.cipd.EnsureFile().add_package('skia/tools/goldctl/${platform}',
-                                          'git_revision:b57f561ad4ad624bd399b8b7b500aa1955276d41'))
+        api.cipd.EnsureFile().add_package(
+            'skia/tools/goldctl/${platform}',
+            'git_revision:b57f561ad4ad624bd399b8b7b500aa1955276d41'
+        )
+    )
     return goldctl_cache_dir.join('goldctl')
 
 
@@ -96,10 +102,13 @@
   api.cipd.ensure(
       java_cache_dir,
       api.cipd.EnsureFile().add_package(
-          'flutter_internal/java/openjdk/${platform}', 'version:1.8.0u202-b08'))
+          'flutter_internal/java/openjdk/${platform}', 'version:1.8.0u202-b08'
+      )
+  )
   return api.context(
       env={'JAVA_HOME': java_cache_dir},
-      env_prefixes={'PATH': [java_cache_dir.join('bin')]})
+      env_prefixes={'PATH': [java_cache_dir.join('bin')]}
+  )
 
 
 def GetCloudPath(api, git_hash, path):
@@ -123,20 +132,25 @@
       BUCKET_NAME,
       GetCloudPath(api, 'coverage', 'lcov.info'),
       link_name='lcov.info',
-      name='upload coverage data')
+      name='upload coverage data'
+  )
 
   # Download encrpted file to local and then decrypt.
   token_path = flutter_package_dir.join('.coveralls.yml')
   api.kms.get_secret('codecov.encrypted', token_path)
 
   pub_executable = 'pub' if not api.platform.is_win else 'pub.exe'
-  api.step('pub global activate coveralls', [
-      pub_executable, 'global', 'activate', 'coveralls', '5.1.0',
-      '--no-executables'
-  ])
+  api.step(
+      'pub global activate coveralls', [
+          pub_executable, 'global', 'activate', 'coveralls', '5.1.0',
+          '--no-executables'
+      ]
+  )
   with api.context(cwd=flutter_package_dir):
-    api.step('upload to coveralls',
-             [pub_executable, 'global', 'run', 'coveralls:main', coverage_path])
+    api.step(
+        'upload to coveralls',
+        [pub_executable, 'global', 'run', 'coveralls:main', coverage_path]
+    )
 
 
 def CreateAndUploadFlutterPackage(api, git_hash, branch):
@@ -150,13 +164,15 @@
       'https://chromium.googlesource.com/external/github.com/flutter/flutter',
       ref='master',
       recursive=True,
-      set_got_revision=True)
+      set_got_revision=True
+  )
 
   flutter_executable = 'flutter' if not api.platform.is_win else 'flutter.bat'
   dart_executable = 'dart' if not api.platform.is_win else 'dart.exe'
   work_dir = api.path['start_dir'].join('archive')
-  prepare_script = api.path['checkout'].join('dev', 'bots',
-                                             'prepare_package.dart')
+  prepare_script = api.path['checkout'].join(
+      'dev', 'bots', 'prepare_package.dart'
+  )
   api.step('flutter doctor', [flutter_executable, 'doctor'])
   api.step('download dependencies', [flutter_executable, 'update-packages'])
   api.file.rmtree('clean archive work directory', work_dir)
@@ -181,7 +197,8 @@
   git_ref = api.properties.get('git_ref') or api.buildbucket.gitiles_commit.ref
 
   git_hash = api.git.checkout(
-      git_url, ref=git_ref, recursive=True, set_got_revision=True, tags=True)
+      git_url, ref=git_ref, recursive=True, set_got_revision=True, tags=True
+  )
   checkout = api.path['checkout']
 
   if api.platform.is_linux:
@@ -242,9 +259,11 @@
       shard_env = env
       shard_env['SHARD'] = shard
       with api.context(env=shard_env):
-        api.step('run test.dart for %s shard' % shard,
-                 [dart_executable,
-                  checkout.join('dev', 'bots', 'test.dart')])
+        api.step(
+            'run test.dart for %s shard' % shard,
+            [dart_executable,
+             checkout.join('dev', 'bots', 'test.dart')]
+        )
       if shard == 'framework_coverage':
         UploadFlutterCoverage(api)
       # Windows uses exclusive file locking.  On LUCI, if these processes remain
@@ -257,7 +276,8 @@
 
         def KillAll(name, exe_name):
           api.step(
-              name, ['taskkill', '/f', '/im', exe_name, '/t'], ok_ret='any')
+              name, ['taskkill', '/f', '/im', exe_name, '/t'], ok_ret='any'
+          )
 
         KillAll('stop gradle daemon', 'java.exe')
         KillAll('stop dart', 'dart.exe')
@@ -267,44 +287,55 @@
 def GenTests(api):
   for experimental in (True, False):
     for should_upload in (True, False):
-      yield (api.test(
-          'linux_master_coverage_%s%s' %
-          ('_experimental' if experimental else '',
-           '_upload' if should_upload else ''),
-          api.runtime(is_luci=True, is_experimental=experimental),
-          api.properties(
-              shard='framework_coverage',
-              coveralls_lcov_version='5.1.0',
-              upload_packages=should_upload,
-              gold_tryjob=not should_upload),
-      ) + api.post_check(lambda check, steps: check('Download goldctl' in steps)
-                        ))
+      yield (
+          api.test(
+              'linux_master_coverage_%s%s' % (
+                  '_experimental' if experimental else '',
+                  '_upload' if should_upload else ''
+              ),
+              api.runtime(is_experimental=experimental),
+              api.properties(
+                  shard='framework_coverage',
+                  coveralls_lcov_version='5.1.0',
+                  upload_packages=should_upload,
+                  gold_tryjob=not should_upload
+              ),
+          ) + api
+          .post_check(lambda check, steps: check('Download goldctl' in steps))
+      )
       for platform in ('mac', 'linux', 'win'):
         for branch in ('master', 'dev', 'beta', 'stable'):
           git_ref = 'refs/heads/' + branch
           test = api.test(
-              '%s_%s%s%s' %
-              (platform, branch, '_experimental' if experimental else '',
-               '_upload' if should_upload else ''),
+              '%s_%s%s%s' % (
+                  platform, branch, '_experimental' if experimental else '',
+                  '_upload' if should_upload else ''
+              ),
               api.platform(platform, 64),
               api.buildbucket.ci_build(git_ref=git_ref, revision=None),
               api.properties(
                   shard='tests',
                   fuchsia_ctl_version='version:0.0.2',
                   upload_packages=should_upload,
-                  gold_tryjob=not should_upload),
-              api.runtime(is_luci=True, is_experimental=experimental),
+                  gold_tryjob=not should_upload
+              ),
+              api.runtime(is_experimental=experimental),
           )
-          yield test + api.post_check(lambda check, steps: check(
-              'Download goldctl' in steps))
+          yield test + api.post_check(
+              lambda check, steps: check('Download goldctl' in steps)
+          )
 
-  yield (api.test(
-      'pull_request',
-      api.runtime(is_luci=True, is_experimental=True),
-      api.properties(
-          git_url='https://github.com/flutter/flutter',
-          git_ref='refs/pull/1/head',
-          shard='tests',
-          fuchsia_ctl_version='version:0.0.2',
-          should_upload=False),
-  ) + api.post_check(lambda check, steps: check('Download goldctl' in steps)))
+  yield (
+      api.test(
+          'pull_request',
+          api.runtime(is_experimental=True),
+          api.properties(
+              git_url='https://github.com/flutter/flutter',
+              git_ref='refs/pull/1/head',
+              shard='tests',
+              fuchsia_ctl_version='version:0.0.2',
+              should_upload=False
+          ),
+      ) +
+      api.post_check(lambda check, steps: check('Download goldctl' in steps))
+  )
diff --git a/recipes/flutter_1_22_0.py b/recipes/flutter_1_22_0.py
index 8efcec2..7a769ff 100644
--- a/recipes/flutter_1_22_0.py
+++ b/recipes/flutter_1_22_0.py
@@ -290,7 +290,7 @@
                   '_experimental' if experimental else '',
                   '_upload' if should_upload else ''
               ),
-              api.runtime(is_luci=True, is_experimental=experimental),
+              api.runtime(is_experimental=experimental),
               api.properties(
                   shard='framework_coverage',
                   coveralls_lcov_version='5.1.0',
@@ -316,7 +316,7 @@
                   upload_packages=should_upload,
                   gold_tryjob=not should_upload
               ),
-              api.runtime(is_luci=True, is_experimental=experimental),
+              api.runtime(is_experimental=experimental),
           )
           yield test + api.post_check(
               lambda check, steps: check('Download goldctl' in steps)
@@ -325,7 +325,7 @@
   yield (
       api.test(
           'pull_request',
-          api.runtime(is_luci=True, is_experimental=True),
+          api.runtime(is_experimental=True),
           api.properties(
               git_url='https://github.com/flutter/flutter',
               git_ref='refs/pull/1/head',
diff --git a/recipes/fuchsia/fuchsia.expected/basic.json b/recipes/fuchsia/fuchsia.expected/basic.json
index 487297b..b40ecff 100644
--- a/recipes/fuchsia/fuchsia.expected/basic.json
+++ b/recipes/fuchsia/fuchsia.expected/basic.json
@@ -123,6 +123,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -148,6 +151,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -172,6 +178,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -213,6 +222,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -242,6 +254,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -306,6 +321,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -335,6 +353,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -370,6 +391,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -398,6 +422,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -426,6 +453,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -454,6 +484,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -490,6 +523,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -520,6 +556,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -562,6 +601,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -590,6 +632,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -626,6 +671,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -656,6 +704,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -695,6 +746,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -743,6 +797,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -774,6 +831,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "1",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
diff --git a/recipes/plugins/plugins.expected/basic.json b/recipes/plugins/plugins.expected/basic.json
index 385fc2f..83c41af 100644
--- a/recipes/plugins/plugins.expected/basic.json
+++ b/recipes/plugins/plugins.expected/basic.json
@@ -248,6 +248,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -269,6 +272,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -290,6 +296,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -313,6 +322,9 @@
     "cwd": "[START_DIR]/flutter",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -340,6 +352,9 @@
     "cwd": "[START_DIR]/plugins",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {
@@ -363,6 +378,9 @@
     "cwd": "[START_DIR]/plugins",
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
       "PUB_CACHE": "[CACHE]/.pub-cache"
     },
     "env_prefixes": {