Fix issue where system ruby is used when installing jazzy from "Mac mac_ios_engine"

Change-Id: If4a3bf930763f580b4ce5578d60bc84d7c3f7232
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/38095
Reviewed-by: Godofredo Contreras <godofredoc@google.com>
Reviewed-by: Xilai Zhang <xilaizhang@google.com>
Commit-Queue: Godofredo Contreras <godofredoc@google.com>
diff --git a/recipe_modules/flutter_deps/api.py b/recipe_modules/flutter_deps/api.py
index 0f3edbe..570cbfa 100644
--- a/recipe_modules/flutter_deps/api.py
+++ b/recipe_modules/flutter_deps/api.py
@@ -296,8 +296,9 @@
       self.m.cipd.ensure(ruby_path, ruby)
       paths = env_prefixes.get('PATH', [])
       paths.insert(0, ruby_path.join('bin'))
-      env['RUBY_HOME'] = ruby_path.join('bin')
+      env['RUBY_HOME'] = ruby_path
       env_prefixes['PATH'] = paths
+      env_prefixes['DYLD_FALLBACK_LIBRARY_PATH'] = [ruby_path.join('dylibs')]
 
   def gems(self, env, env_prefixes, gem_dir, version=None):
     """Installs mac gems.
@@ -326,7 +327,7 @@
       with self.m.context(env=env, env_prefixes=env_prefixes, cwd=gemfile_dir):
         self.m.step(
             'Set gems path',
-            ['bundle', 'config', 'set', 'path', gem_destination],
+            ['bundle', 'config', 'set', '--local', 'path', gem_destination],
             infra_step=True,
         )
         opt_path = self.m.path['cache'].join('ruby', 'opt')
@@ -340,7 +341,7 @@
         self.m.step('install gems', ['bundler', 'install'], infra_step=True)
       # Find major/minor ruby version
       ruby_version = self.m.step(
-              'Ruby version', ['ruby', '-e', 'puts RUBY_PATCHLEVEL'],
+              'Ruby version', ['ruby', '-e', 'puts RUBY_VERSION'],
               stdout=self.m.raw_io.output_text(), ok_ret='any'
               ).stdout.rstrip()
       parts = ruby_version.split('.')
@@ -583,25 +584,28 @@
       env_prefixes(dict):  Current environment prefixes variables.
       gemfile_dir(Path): The path to the location of the repository gemfile.
     """
-    # TODO: Use bundler to install jazzy
-    # https://github.com/flutter/flutter/issues/118486
-    version = version or '0.9.5'
-    gem_dir = self.m.path['start_dir'].join('gems')
     with self.m.step.nest('Install jazzy'):
       # TODO: Don't hardcode the version here.
       self._install_ruby(env, env_prefixes, 'v3.3.14')
-      self.m.file.ensure_directory('mkdir gems', gem_dir)
-      with self.m.context(cwd=gem_dir):
-        self.m.step(
-            'install jazzy', [
-                'gem', 'install', 'jazzy:%s' % version,
-            '--install-dir', '.'
-            ]
-        )
-      env['GEM_HOME'] = gem_dir
+      # Find major/minor ruby version
+      with self.m.context(env=env, env_prefixes=env_prefixes):
+        ruby_version = self.m.step(
+            'Ruby version', ['ruby', '-e', 'puts RUBY_VERSION'],
+            stdout=self.m.raw_io.output_text(), ok_ret='any'
+        ).stdout.rstrip()
+      parts = ruby_version.split('.')
+      parts[-1] = '0'
+      ruby_version = '.'.join(parts)
+      version = version or 'v0.14.3'
+      jazzy_path = self.m.path['cache'].join('gems')
+      jazzy = self.m.cipd.EnsureFile()
+      jazzy.add_package("flutter/jazzy/${platform}", version)
+      self.m.cipd.ensure(jazzy_path, jazzy)
+      paths = env_prefixes.get('PATH', [])
+      env['GEM_HOME'] = jazzy_path.join('ruby', ruby_version)
       paths = env_prefixes.get('PATH', [])
       temp_paths = copy.deepcopy(paths)
-      temp_paths.append(gem_dir.join('bin'))
+      temp_paths.append(jazzy_path.join('ruby', ruby_version, 'bin'))
       env_prefixes['PATH'] = temp_paths
 
   def android_virtual_device(self, env, env_prefixes, version=None):
diff --git a/recipe_modules/flutter_deps/examples/full.expected/basic.json b/recipe_modules/flutter_deps/examples/full.expected/basic.json
index f8824e2..6bceda1 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/basic.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/basic.json
@@ -701,34 +701,80 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/android",
+      "ANDROID_NDK_PATH": "[CACHE]/android/ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]/android",
+      "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]/firefox/firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]/go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/dart_sdk",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[CACHE]/firefox",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[START_DIR]/firebase",
+        "[CACHE]/cmake/bin",
+        "[CLEANUP]/tmp_tmp_1",
+        "[CACHE]/cosign/bin",
+        "[CACHE]/ninja",
+        "[CACHE]/clang/bin",
+        "[CLEANUP]/tmp_tmp_3/curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]/gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -777,13 +823,16 @@
       "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
       "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
       "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
-      "GEM_HOME": "[START_DIR]/gems",
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
       "GOPATH": "[CLEANUP]/go_path",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
       "GRADLE_USER_HOME": "[CACHE]/gradle",
-      "RUBY_HOME": "[CACHE]/ruby/bin"
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[CACHE]/ruby/bin",
         "[CACHE]/dart_sdk",
@@ -801,7 +850,7 @@
         "[CACHE]/ninja",
         "[CACHE]/clang/bin",
         "[CLEANUP]/tmp_tmp_3/curl",
-        "[START_DIR]/gems/bin"
+        "[CACHE]/gems/ruby/0/bin"
       ]
     },
     "env_suffixes": {
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 c11db33..ecd6e27 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/flutter_engine.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/flutter_engine.json
@@ -785,34 +785,82 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/android",
+      "ANDROID_NDK_PATH": "[CACHE]/android/ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]/android",
+      "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]/firefox/firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]/go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LOCAL_ENGINE": "[CLEANUP]/builder/src/out/host_debug_unopt",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/dart_sdk",
+        "[CLEANUP]/builder/src/out/host_debug_unopt/dart-sdk/bin",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[CACHE]/firefox",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[START_DIR]/firebase",
+        "[CACHE]/cmake/bin",
+        "[CLEANUP]/tmp_tmp_1",
+        "[CACHE]/cosign/bin",
+        "[CACHE]/ninja",
+        "[CACHE]/clang/bin",
+        "[CLEANUP]/tmp_tmp_3/curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]/gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -861,14 +909,17 @@
       "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
       "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
       "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
-      "GEM_HOME": "[START_DIR]/gems",
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
       "GOPATH": "[CLEANUP]/go_path",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
       "GRADLE_USER_HOME": "[CACHE]/gradle",
       "LOCAL_ENGINE": "[CLEANUP]/builder/src/out/host_debug_unopt",
-      "RUBY_HOME": "[CACHE]/ruby/bin"
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[CACHE]/ruby/bin",
         "[CACHE]/dart_sdk",
@@ -887,7 +938,7 @@
         "[CACHE]/ninja",
         "[CACHE]/clang/bin",
         "[CLEANUP]/tmp_tmp_3/curl",
-        "[START_DIR]/gems/bin"
+        "[CACHE]/gems/ruby/0/bin"
       ]
     },
     "env_suffixes": {
diff --git a/recipe_modules/flutter_deps/examples/full.expected/goldTryjob.json b/recipe_modules/flutter_deps/examples/full.expected/goldTryjob.json
index f8824e2..6bceda1 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/goldTryjob.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/goldTryjob.json
@@ -701,34 +701,80 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/android",
+      "ANDROID_NDK_PATH": "[CACHE]/android/ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]/android",
+      "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]/firefox/firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]/go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/dart_sdk",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[CACHE]/firefox",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[START_DIR]/firebase",
+        "[CACHE]/cmake/bin",
+        "[CLEANUP]/tmp_tmp_1",
+        "[CACHE]/cosign/bin",
+        "[CACHE]/ninja",
+        "[CACHE]/clang/bin",
+        "[CLEANUP]/tmp_tmp_3/curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]/gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -777,13 +823,16 @@
       "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
       "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
       "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
-      "GEM_HOME": "[START_DIR]/gems",
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
       "GOPATH": "[CLEANUP]/go_path",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
       "GRADLE_USER_HOME": "[CACHE]/gradle",
-      "RUBY_HOME": "[CACHE]/ruby/bin"
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[CACHE]/ruby/bin",
         "[CACHE]/dart_sdk",
@@ -801,7 +850,7 @@
         "[CACHE]/ninja",
         "[CACHE]/clang/bin",
         "[CLEANUP]/tmp_tmp_3/curl",
-        "[START_DIR]/gems/bin"
+        "[CACHE]/gems/ruby/0/bin"
       ]
     },
     "env_suffixes": {
diff --git a/recipe_modules/flutter_deps/examples/full.expected/linux.json b/recipe_modules/flutter_deps/examples/full.expected/linux.json
index f8824e2..6bceda1 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/linux.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/linux.json
@@ -701,34 +701,80 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/android",
+      "ANDROID_NDK_PATH": "[CACHE]/android/ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]/android",
+      "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]/firefox/firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]/go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/dart_sdk",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[CACHE]/firefox",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[START_DIR]/firebase",
+        "[CACHE]/cmake/bin",
+        "[CLEANUP]/tmp_tmp_1",
+        "[CACHE]/cosign/bin",
+        "[CACHE]/ninja",
+        "[CACHE]/clang/bin",
+        "[CLEANUP]/tmp_tmp_3/curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]/gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -777,13 +823,16 @@
       "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
       "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
       "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
-      "GEM_HOME": "[START_DIR]/gems",
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
       "GOPATH": "[CLEANUP]/go_path",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
       "GRADLE_USER_HOME": "[CACHE]/gradle",
-      "RUBY_HOME": "[CACHE]/ruby/bin"
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[CACHE]/ruby/bin",
         "[CACHE]/dart_sdk",
@@ -801,7 +850,7 @@
         "[CACHE]/ninja",
         "[CACHE]/clang/bin",
         "[CLEANUP]/tmp_tmp_3/curl",
-        "[START_DIR]/gems/bin"
+        "[CACHE]/gems/ruby/0/bin"
       ]
     },
     "env_suffixes": {
diff --git a/recipe_modules/flutter_deps/examples/full.expected/local_engine_cas.json b/recipe_modules/flutter_deps/examples/full.expected/local_engine_cas.json
index 4ceed5f..682e06d 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/local_engine_cas.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/local_engine_cas.json
@@ -785,34 +785,82 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/android",
+      "ANDROID_NDK_PATH": "[CACHE]/android/ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]/android",
+      "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]/firefox/firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]/go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "LOCAL_ENGINE": "[CLEANUP]/builder/src/out/host-release",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/dart_sdk",
+        "[CLEANUP]/builder/src/out/host-release/dart-sdk/bin",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[CACHE]/firefox",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[START_DIR]/firebase",
+        "[CACHE]/cmake/bin",
+        "[CLEANUP]/tmp_tmp_1",
+        "[CACHE]/cosign/bin",
+        "[CACHE]/ninja",
+        "[CACHE]/clang/bin",
+        "[CLEANUP]/tmp_tmp_3/curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]/gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -861,14 +909,17 @@
       "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
       "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
       "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
-      "GEM_HOME": "[START_DIR]/gems",
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
       "GOPATH": "[CLEANUP]/go_path",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
       "GRADLE_USER_HOME": "[CACHE]/gradle",
       "LOCAL_ENGINE": "[CLEANUP]/builder/src/out/host-release",
-      "RUBY_HOME": "[CACHE]/ruby/bin"
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[CACHE]/ruby/bin",
         "[CACHE]/dart_sdk",
@@ -887,7 +938,7 @@
         "[CACHE]/ninja",
         "[CACHE]/clang/bin",
         "[CLEANUP]/tmp_tmp_3/curl",
-        "[START_DIR]/gems/bin"
+        "[CACHE]/gems/ruby/0/bin"
       ]
     },
     "env_suffixes": {
diff --git a/recipe_modules/flutter_deps/examples/full.expected/mac.json b/recipe_modules/flutter_deps/examples/full.expected/mac.json
index 32eb2d7..60b7fe9 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/mac.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/mac.json
@@ -716,34 +716,82 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/android",
+      "ANDROID_NDK_PATH": "[CACHE]/android/ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]/android",
+      "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome-mac/Chromium.app/Contents/MacOS/Chromium",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]/firefox/firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]/go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/dart_sdk",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[CACHE]/firefox",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[START_DIR]/firebase",
+        "[CACHE]/cmake/bin",
+        "[CLEANUP]/tmp_tmp_1",
+        "[CACHE]/cosign/bin",
+        "[CACHE]/ninja",
+        "[CACHE]/clang/bin",
+        "[CLEANUP]/tmp_tmp_2/curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]/gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
diff --git a/recipe_modules/flutter_deps/examples/full.expected/windows.json b/recipe_modules/flutter_deps/examples/full.expected/windows.json
index 20b3c26..468e998 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/windows.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/windows.json
@@ -852,34 +852,82 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]\\resources\\fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]\\gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]\\android",
+      "ANDROID_NDK_PATH": "[CACHE]\\android\\ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]\\android",
+      "CHROME_EXECUTABLE": "[CACHE]\\chrome\\chrome\\chrome.exe",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]\\firefox\\firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]\\go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]\\gradle",
+      "RUBY_HOME": "[CACHE]\\ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]\\ruby\\dylibs"
+      ],
+      "PATH": [
+        "[CACHE]\\ruby\\bin",
+        "[CACHE]\\vsbuild",
+        "[CACHE]\\certs",
+        "[CACHE]\\dart_sdk",
+        "[CACHE]\\chrome\\chrome",
+        "[CACHE]\\chrome\\drivers",
+        "[CACHE]\\firefox",
+        "[CACHE]\\go\\bin",
+        "[CLEANUP]\\go_path\\bin",
+        "[CACHE]\\go\\bin",
+        "[CLEANUP]\\go_path\\bin",
+        "[START_DIR]\\firebase",
+        "[CACHE]\\cmake\\bin",
+        "[CLEANUP]\\tmp_tmp_1",
+        "[CACHE]\\cosign\\bin",
+        "[CACHE]\\ninja",
+        "[CACHE]\\clang\\bin",
+        "[CLEANUP]\\tmp_tmp_3\\curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd.bat",
+      "ensure",
+      "-root",
+      "[CACHE]\\gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]\\gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
diff --git a/recipe_modules/flutter_deps/examples/full.expected/with-arm64ruby.json b/recipe_modules/flutter_deps/examples/full.expected/with-arm64ruby.json
index cc5717f..2264cf9 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/with-arm64ruby.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/with-arm64ruby.json
@@ -701,34 +701,80 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/android",
+      "ANDROID_NDK_PATH": "[CACHE]/android/ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]/android",
+      "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]/firefox/firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]/go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/dart_sdk",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[CACHE]/firefox",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[START_DIR]/firebase",
+        "[CACHE]/cmake/bin",
+        "[CLEANUP]/tmp_tmp_1",
+        "[CACHE]/cosign/bin",
+        "[CACHE]/ninja",
+        "[CACHE]/clang/bin",
+        "[CLEANUP]/tmp_tmp_3/curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]/gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -777,13 +823,16 @@
       "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
       "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
       "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
-      "GEM_HOME": "[START_DIR]/gems",
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
       "GOPATH": "[CLEANUP]/go_path",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
       "GRADLE_USER_HOME": "[CACHE]/gradle",
-      "RUBY_HOME": "[CACHE]/ruby/bin"
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[CACHE]/ruby/bin",
         "[CACHE]/dart_sdk",
@@ -801,7 +850,7 @@
         "[CACHE]/ninja",
         "[CACHE]/clang/bin",
         "[CLEANUP]/tmp_tmp_3/curl",
-        "[START_DIR]/gems/bin"
+        "[CACHE]/gems/ruby/0/bin"
       ]
     },
     "env_suffixes": {
@@ -967,6 +1016,7 @@
       "bundle",
       "config",
       "set",
+      "--local",
       "path",
       "[START_DIR]/gems"
     ],
@@ -981,10 +1031,13 @@
       "OS": "linux",
       "PUB_CACHE": "[START_DIR]/.pub-cache",
       "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "RUBY_HOME": "[CACHE]/ruby/bin",
+      "RUBY_HOME": "[CACHE]/ruby",
       "SDK_CHECKOUT_PATH": "[START_DIR]/flutter\\ sdk"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[START_DIR]/dev/ci/mac/bin",
         "[CACHE]/ruby/bin",
@@ -1018,10 +1071,13 @@
       "OS": "linux",
       "PUB_CACHE": "[START_DIR]/.pub-cache",
       "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "RUBY_HOME": "[CACHE]/ruby/bin",
+      "RUBY_HOME": "[CACHE]/ruby",
       "SDK_CHECKOUT_PATH": "[START_DIR]/flutter\\ sdk"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[START_DIR]/dev/ci/mac/bin",
         "[CACHE]/ruby/bin",
@@ -1053,10 +1109,13 @@
       "OS": "linux",
       "PUB_CACHE": "[START_DIR]/.pub-cache",
       "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "RUBY_HOME": "[CACHE]/ruby/bin",
+      "RUBY_HOME": "[CACHE]/ruby",
       "SDK_CHECKOUT_PATH": "[START_DIR]/flutter\\ sdk"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[START_DIR]/dev/ci/mac/bin",
         "[CACHE]/ruby/bin",
@@ -1076,7 +1135,7 @@
     "cmd": [
       "ruby",
       "-e",
-      "puts RUBY_PATCHLEVEL"
+      "puts RUBY_VERSION"
     ],
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
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 362c1b2..d834877 100644
--- a/recipe_modules/flutter_deps/examples/full.expected/with-gems.json
+++ b/recipe_modules/flutter_deps/examples/full.expected/with-gems.json
@@ -701,34 +701,80 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
     ],
-    "infra_step": true,
-    "name": "Install jazzy.mkdir gems",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/android",
+      "ANDROID_NDK_PATH": "[CACHE]/android/ndk-bundle",
+      "ANDROID_SDK_ROOT": "[CACHE]/android",
+      "CHROME_EXECUTABLE": "[CACHE]/chrome/chrome/chrome",
+      "CHROME_NO_SANDBOX": "true",
+      "FIREFOX_EXECUTABLE": "[CACHE]/firefox/firefox",
+      "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
+      "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
+      "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
+      "GOPATH": "[CLEANUP]/go_path",
+      "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
+      "GRADLE_USER_HOME": "[CACHE]/gradle",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/dart_sdk",
+        "[CACHE]/chrome/chrome",
+        "[CACHE]/chrome/drivers",
+        "[CACHE]/firefox",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[CACHE]/go/bin",
+        "[CLEANUP]/go_path/bin",
+        "[START_DIR]/firebase",
+        "[CACHE]/cmake/bin",
+        "[CLEANUP]/tmp_tmp_1",
+        "[CACHE]/cosign/bin",
+        "[CACHE]/ninja",
+        "[CACHE]/clang/bin",
+        "[CLEANUP]/tmp_tmp_3/curl"
+      ]
+    },
+    "name": "Install jazzy.Ruby version",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
   },
   {
     "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
-    "cwd": "[START_DIR]/gems",
-    "name": "Install jazzy.install jazzy",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -777,13 +823,16 @@
       "FLUTTER_XCODE_CODE_SIGN_STYLE": "Manual",
       "FLUTTER_XCODE_DEVELOPMENT_TEAM": "S8QB4VV633",
       "FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER": "match Development *",
-      "GEM_HOME": "[START_DIR]/gems",
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
       "GOPATH": "[CLEANUP]/go_path",
       "GRADLE_OPTS": "-Dorg.gradle.daemon=false",
       "GRADLE_USER_HOME": "[CACHE]/gradle",
-      "RUBY_HOME": "[CACHE]/ruby/bin"
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[CACHE]/ruby/bin",
         "[CACHE]/dart_sdk",
@@ -801,7 +850,7 @@
         "[CACHE]/ninja",
         "[CACHE]/clang/bin",
         "[CLEANUP]/tmp_tmp_3/curl",
-        "[START_DIR]/gems/bin"
+        "[CACHE]/gems/ruby/0/bin"
       ]
     },
     "env_suffixes": {
@@ -967,6 +1016,7 @@
       "bundle",
       "config",
       "set",
+      "--local",
       "path",
       "[START_DIR]/gems"
     ],
@@ -981,10 +1031,13 @@
       "OS": "linux",
       "PUB_CACHE": "[START_DIR]/.pub-cache",
       "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "RUBY_HOME": "[CACHE]/ruby/bin",
+      "RUBY_HOME": "[CACHE]/ruby",
       "SDK_CHECKOUT_PATH": "[START_DIR]/flutter\\ sdk"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[START_DIR]/dev/ci/mac/bin",
         "[CACHE]/ruby/bin",
@@ -1018,10 +1071,13 @@
       "OS": "linux",
       "PUB_CACHE": "[START_DIR]/.pub-cache",
       "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "RUBY_HOME": "[CACHE]/ruby/bin",
+      "RUBY_HOME": "[CACHE]/ruby",
       "SDK_CHECKOUT_PATH": "[START_DIR]/flutter\\ sdk"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[START_DIR]/dev/ci/mac/bin",
         "[CACHE]/ruby/bin",
@@ -1053,10 +1109,13 @@
       "OS": "linux",
       "PUB_CACHE": "[START_DIR]/.pub-cache",
       "REVISION": "12345abcde12345abcde12345abcde12345abcde",
-      "RUBY_HOME": "[CACHE]/ruby/bin",
+      "RUBY_HOME": "[CACHE]/ruby",
       "SDK_CHECKOUT_PATH": "[START_DIR]/flutter\\ sdk"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
         "[START_DIR]/dev/ci/mac/bin",
         "[CACHE]/ruby/bin",
@@ -1076,7 +1135,7 @@
     "cmd": [
       "ruby",
       "-e",
-      "puts RUBY_PATCHLEVEL"
+      "puts RUBY_VERSION"
     ],
     "env": {
       "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
diff --git a/recipes/engine/engine.expected/mac.json b/recipes/engine/engine.expected/mac.json
index f649bb5..fe2414e 100644
--- a/recipes/engine/engine.expected/mac.json
+++ b/recipes/engine/engine.expected/mac.json
@@ -11703,15 +11703,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -11734,7 +11785,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -11747,55 +11797,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -11809,12 +11824,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11851,12 +11872,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11899,12 +11918,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_font_subset.json b/recipes/engine/engine.expected/mac_font_subset.json
index f649bb5..fe2414e 100644
--- a/recipes/engine/engine.expected/mac_font_subset.json
+++ b/recipes/engine/engine.expected/mac_font_subset.json
@@ -11703,15 +11703,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -11734,7 +11785,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -11747,55 +11797,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -11809,12 +11824,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11851,12 +11872,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11899,12 +11918,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_no_lto.json b/recipes/engine/engine.expected/mac_no_lto.json
index 51195f8..7a53eb5 100644
--- a/recipes/engine/engine.expected/mac_no_lto.json
+++ b/recipes/engine/engine.expected/mac_no_lto.json
@@ -11711,15 +11711,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -11742,7 +11793,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -11755,55 +11805,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -11817,12 +11832,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11859,12 +11880,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11907,12 +11926,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_no_lto_font_subset.json b/recipes/engine/engine.expected/mac_no_lto_font_subset.json
index 51195f8..7a53eb5 100644
--- a/recipes/engine/engine.expected/mac_no_lto_font_subset.json
+++ b/recipes/engine/engine.expected/mac_no_lto_font_subset.json
@@ -11711,15 +11711,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -11742,7 +11793,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -11755,55 +11805,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -11817,12 +11832,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11859,12 +11880,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11907,12 +11926,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_publish_cipd.json b/recipes/engine/engine.expected/mac_publish_cipd.json
index f649bb5..fe2414e 100644
--- a/recipes/engine/engine.expected/mac_publish_cipd.json
+++ b/recipes/engine/engine.expected/mac_publish_cipd.json
@@ -11703,15 +11703,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -11734,7 +11785,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -11747,55 +11797,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -11809,12 +11824,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11851,12 +11872,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11899,12 +11918,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_publish_cipd_font_subset.json b/recipes/engine/engine.expected/mac_publish_cipd_font_subset.json
index f649bb5..fe2414e 100644
--- a/recipes/engine/engine.expected/mac_publish_cipd_font_subset.json
+++ b/recipes/engine/engine.expected/mac_publish_cipd_font_subset.json
@@ -11703,15 +11703,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -11734,7 +11785,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -11747,55 +11797,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -11809,12 +11824,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11851,12 +11872,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11899,12 +11918,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_publish_cipd_no_lto.json b/recipes/engine/engine.expected/mac_publish_cipd_no_lto.json
index 51195f8..7a53eb5 100644
--- a/recipes/engine/engine.expected/mac_publish_cipd_no_lto.json
+++ b/recipes/engine/engine.expected/mac_publish_cipd_no_lto.json
@@ -11711,15 +11711,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -11742,7 +11793,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -11755,55 +11805,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -11817,12 +11832,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11859,12 +11880,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11907,12 +11926,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_publish_cipd_no_lto_font_subset.json b/recipes/engine/engine.expected/mac_publish_cipd_no_lto_font_subset.json
index 51195f8..7a53eb5 100644
--- a/recipes/engine/engine.expected/mac_publish_cipd_no_lto_font_subset.json
+++ b/recipes/engine/engine.expected/mac_publish_cipd_no_lto_font_subset.json
@@ -11711,15 +11711,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -11742,7 +11793,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -11755,55 +11805,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -11817,12 +11832,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11859,12 +11880,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -11907,12 +11926,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_upload.json b/recipes/engine/engine.expected/mac_upload.json
index d0f6678..f711d6d 100644
--- a/recipes/engine/engine.expected/mac_upload.json
+++ b/recipes/engine/engine.expected/mac_upload.json
@@ -12876,15 +12876,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -12907,7 +12958,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -12920,55 +12970,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -12982,12 +12997,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13024,12 +13045,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13074,12 +13093,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13125,12 +13142,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_upload_font_subset.json b/recipes/engine/engine.expected/mac_upload_font_subset.json
index e39d484..abfc327 100644
--- a/recipes/engine/engine.expected/mac_upload_font_subset.json
+++ b/recipes/engine/engine.expected/mac_upload_font_subset.json
@@ -12978,15 +12978,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -13009,7 +13060,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -13022,55 +13072,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -13084,12 +13099,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13126,12 +13147,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13176,12 +13195,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13227,12 +13244,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_upload_no_lto.json b/recipes/engine/engine.expected/mac_upload_no_lto.json
index cb22051..913fb75 100644
--- a/recipes/engine/engine.expected/mac_upload_no_lto.json
+++ b/recipes/engine/engine.expected/mac_upload_no_lto.json
@@ -12884,15 +12884,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -12915,7 +12966,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -12928,55 +12978,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -12990,12 +13005,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13032,12 +13053,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13082,12 +13101,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13133,12 +13150,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_upload_no_lto_font_subset.json b/recipes/engine/engine.expected/mac_upload_no_lto_font_subset.json
index c2a2ae6..eea4f25 100644
--- a/recipes/engine/engine.expected/mac_upload_no_lto_font_subset.json
+++ b/recipes/engine/engine.expected/mac_upload_no_lto_font_subset.json
@@ -12986,15 +12986,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -13017,7 +13068,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -13030,55 +13080,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -13092,12 +13107,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13134,12 +13155,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13184,12 +13203,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13235,12 +13252,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_upload_publish_cipd.json b/recipes/engine/engine.expected/mac_upload_publish_cipd.json
index d0f6678..f711d6d 100644
--- a/recipes/engine/engine.expected/mac_upload_publish_cipd.json
+++ b/recipes/engine/engine.expected/mac_upload_publish_cipd.json
@@ -12876,15 +12876,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -12907,7 +12958,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -12920,55 +12970,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -12982,12 +12997,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13024,12 +13045,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13074,12 +13093,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13125,12 +13142,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_upload_publish_cipd_font_subset.json b/recipes/engine/engine.expected/mac_upload_publish_cipd_font_subset.json
index e39d484..abfc327 100644
--- a/recipes/engine/engine.expected/mac_upload_publish_cipd_font_subset.json
+++ b/recipes/engine/engine.expected/mac_upload_publish_cipd_font_subset.json
@@ -12978,15 +12978,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -13009,7 +13060,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -13022,55 +13072,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -13084,12 +13099,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13126,12 +13147,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13176,12 +13195,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13227,12 +13244,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_upload_publish_cipd_no_lto.json b/recipes/engine/engine.expected/mac_upload_publish_cipd_no_lto.json
index cb22051..913fb75 100644
--- a/recipes/engine/engine.expected/mac_upload_publish_cipd_no_lto.json
+++ b/recipes/engine/engine.expected/mac_upload_publish_cipd_no_lto.json
@@ -12884,15 +12884,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -12915,7 +12966,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -12928,55 +12978,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -12990,12 +13005,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13032,12 +13053,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13082,12 +13101,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13133,12 +13150,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.expected/mac_upload_publish_cipd_no_lto_font_subset.json b/recipes/engine/engine.expected/mac_upload_publish_cipd_no_lto_font_subset.json
index c2a2ae6..eea4f25 100644
--- a/recipes/engine/engine.expected/mac_upload_publish_cipd_no_lto_font_subset.json
+++ b/recipes/engine/engine.expected/mac_upload_publish_cipd_no_lto_font_subset.json
@@ -12986,15 +12986,66 @@
   },
   {
     "cmd": [
-      "vpython3",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[START_DIR]/gems"
+      "ruby",
+      "-e",
+      "puts RUBY_VERSION"
+    ],
+    "cwd": "[CACHE]/builder",
+    "env": {
+      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_PREBUILT_DART_SDK": "True",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
+    },
+    "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
+      "PATH": [
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "luci_context": {
+      "realm": {
+        "name": "flutter:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "Install jazzy.Ruby version",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/gems",
+      "-ensure-file",
+      "flutter/jazzy/${platform} v0.14.3",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -13017,7 +13068,6 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "infra_step": true,
     "luci_context": {
       "realm": {
         "name": "flutter:ci"
@@ -13030,55 +13080,20 @@
         "hostname": "rdbhost"
       }
     },
-    "name": "Install jazzy.mkdir gems",
+    "name": "Install jazzy.ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gem",
-      "install",
-      "jazzy:0.9.5",
-      "--install-dir",
-      "."
-    ],
-    "cwd": "[START_DIR]/gems",
-    "env": {
-      "ANDROID_HOME": "[CACHE]/builder/src/third_party/android_tools/sdk",
-      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "FLUTTER_PREBUILT_DART_SDK": "True",
-      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "luci_context": {
-      "realm": {
-        "name": "flutter:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "Install jazzy.install jazzy",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-v0.14.3---------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"flutter/jazzy/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
     ]
   },
   {
@@ -13092,12 +13107,18 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
-      "GOMA_DIR": "[CACHE]/goma/client"
+      "GEM_HOME": "[CACHE]/gems/ruby/0",
+      "GOMA_DIR": "[CACHE]/goma/client",
+      "RUBY_HOME": "[CACHE]/ruby"
     },
     "env_prefixes": {
+      "DYLD_FALLBACK_LIBRARY_PATH": [
+        "[CACHE]/ruby/dylibs"
+      ],
       "PATH": [
-        "[START_DIR]/gems/bin",
+        "[CACHE]/ruby/bin",
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
+        "[CACHE]/gems/ruby/0/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13134,12 +13155,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13184,12 +13203,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
@@ -13235,12 +13252,10 @@
       "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
       "FLUTTER_PREBUILT_DART_SDK": "True",
       "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
-      "GEM_HOME": "[START_DIR]/gems",
       "GOMA_DIR": "[CACHE]/goma/client"
     },
     "env_prefixes": {
       "PATH": [
-        "[START_DIR]/gems/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine/engine.py b/recipes/engine/engine.py
index d6a9da2..5bc5ded 100644
--- a/recipes/engine/engine.py
+++ b/recipes/engine/engine.py
@@ -1642,33 +1642,22 @@
   )
 
 
-@contextmanager
-def InstallGems(api, env, env_prefixes):
-  api.flutter_deps.jazzy(env, env_prefixes)
-
-  # Update PATH to reflect where jazzy was installed by the above command.
-  gem_dir = api.path['start_dir'].join('gems')
-  with api.context(env={"GEM_HOME": gem_dir},
-                   env_prefixes={'PATH': [gem_dir.join('bin')]}):
-    yield
-
-
 def BuildObjcDoc(api, env, env_prefixes):
   """Builds documentation for the Objective-C variant of engine."""
-  with InstallGems(api, env, env_prefixes):
-    checkout = GetCheckoutPath(api)
-    with api.os_utils.make_temp_directory('BuildObjcDoc') as temp_dir:
-      objcdoc_cmd = [checkout.join('flutter/tools/gen_objcdoc.sh'), temp_dir]
-      with api.context(cwd=checkout.join('flutter')):
-        api.step('build obj-c doc', objcdoc_cmd)
-      api.zip.directory(
-          'archive obj-c doc', temp_dir, checkout.join('out/ios-objcdoc.zip')
-      )
+  api.flutter_deps.jazzy(env, env_prefixes)
+  checkout = GetCheckoutPath(api)
+  with api.os_utils.make_temp_directory('BuildObjcDoc') as temp_dir:
+    objcdoc_cmd = [checkout.join('flutter/tools/gen_objcdoc.sh'), temp_dir]
+    with api.context(env=env, env_prefixes=env_prefixes, cwd=checkout.join('flutter')):
+      api.step('build obj-c doc', objcdoc_cmd)
+    api.zip.directory(
+        'archive obj-c doc', temp_dir, checkout.join('out/ios-objcdoc.zip')
+    )
 
-      api.bucket_util.safe_upload(
-          checkout.join('out/ios-objcdoc.zip'),
-          GetCloudPath(api, 'ios-objcdoc.zip')
-      )
+    api.bucket_util.safe_upload(
+        checkout.join('out/ios-objcdoc.zip'),
+        GetCloudPath(api, 'ios-objcdoc.zip')
+    )
 
 
 def RunSteps(api, properties, env_properties):
diff --git a/recipes/engine_v2/engine_v2.expected/basic_linux.json b/recipes/engine_v2/engine_v2.expected/basic_linux.json
index ca9cfdd..874abe1 100644
--- a/recipes/engine_v2/engine_v2.expected/basic_linux.json
+++ b/recipes/engine_v2/engine_v2.expected/basic_linux.json
@@ -615,6 +615,11 @@
       "OS": "linux",
       "REVISION": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
     },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
     "infra_step": true,
     "luci_context": {
       "realm": {
@@ -659,6 +664,7 @@
     },
     "env_prefixes": {
       "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine_v2/engine_v2.expected/basic_mac.json b/recipes/engine_v2/engine_v2.expected/basic_mac.json
index fcb3573..2027b68 100644
--- a/recipes/engine_v2/engine_v2.expected/basic_mac.json
+++ b/recipes/engine_v2/engine_v2.expected/basic_mac.json
@@ -672,6 +672,11 @@
       "OS": "darwin",
       "REVISION": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
     },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
     "infra_step": true,
     "luci_context": {
       "realm": {
@@ -716,6 +721,7 @@
     },
     "env_prefixes": {
       "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin",
         "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
       ]
     },
diff --git a/recipes/engine_v2/engine_v2.py b/recipes/engine_v2/engine_v2.py
index 65c14ed..3d0497c 100644
--- a/recipes/engine_v2/engine_v2.py
+++ b/recipes/engine_v2/engine_v2.py
@@ -174,7 +174,7 @@
   for generator_task in generators['tasks']:
     # Generators must run from inside flutter folder.
     # If platform is mac we need to run the generator from an xcode context.
-    with api.context(env=env, cwd=full_engine_checkout):
+    with api.context(env=env, env_prefixes=env_prefixes, cwd=full_engine_checkout):
       cmd = [generator_task.get('language')] if generator_task.get('language') else []
       api.file.listdir('List checkout', full_engine_checkout.join('src', 'out'), recursive=True)
       script = generator_task.get('script')