move checkout path into buildkite agent directory
diff --git a/buildkite/pipelines/bazelci.py b/buildkite/pipelines/bazelci.py
index 652fac5..9248ada 100644
--- a/buildkite/pipelines/bazelci.py
+++ b/buildkite/pipelines/bazelci.py
@@ -3,6 +3,7 @@
 import codecs
 import json
 import os.path
+import re
 import shutil
 import subprocess
 import sys
@@ -116,6 +117,7 @@
   print(*args, file=sys.stderr, **kwargs)
   exit(1)
 
+
 def platforms_info():
   '''
   Returns a map containing all supported platform names as keys, with the
@@ -141,12 +143,23 @@
   }
 
 
+def downstream_projects_root(platform):
+    path = os.path.join(agent_directory(platform), "downstream-projects")
+    if not os.path.exists(path):
+        os.makedirs(path)
+    return path
+
+
+def agent_directory(platform):
+    return os.path.expandvars(platforms_info()[platform]["agent-directory"])
+
+
 def supported_platforms():
-    return set(platforms_info().keys())
+  return set(platforms_info().keys())
 
 
 def platform_name(platform):
-    return platforms_info()[platform]["name"]
+  return platforms_info()[platform]["name"]
 
 
 def git_clone_path():
@@ -179,8 +192,7 @@
                                  build_only=True, test_only=False)
       bazel_binary = download_bazel_binary(tmpdir, source_step)
     if git_repository:
-      clone_git_repository(git_repository)
-      os.chdir(git_clone_path())
+      clone_git_repository(git_repository, platform)
       cleanup(bazel_binary)
     else:
       cleanup(bazel_binary)
@@ -197,9 +209,6 @@
                                      config.get("test_targets", None), bep_file)
       upload_failed_test_logs(bep_file, tmpdir)
   finally:
-    if git_repository:
-      os.chdir("..")
-      delete_git_checkout()
     if tmpdir:
       shutil.rmtree(tmpdir)
     if exit_code > -1:
@@ -222,11 +231,14 @@
   return bazel_binary_path
 
 
-def clone_git_repository(git_repository):
-  delete_git_checkout()
-  fail_if_nonzero(execute_command(["git", "clone", git_repository,
-                                   git_clone_path()]))
-
+def clone_git_repository(git_repository, platform):
+  root = downstream_projects_root(platform)
+  project_name = re.search("/([^/]+)\.git$", git_repository).group(1)
+  clone_path = os.path.join(root, project_name)
+  if os.path.exists(clone_path):
+      shutil.rmtree(clone_path)
+  fail_if_nonzero(execute_command(["git", "clone", git_repository, clone_path]))
+  os.chdir(clone_path)
 
 def delete_git_checkout():
   if os.path.exists(git_clone_path()):
@@ -488,18 +500,18 @@
   runner.add_argument("--build_only", type=bool, nargs="?", const=True)
   runner.add_argument("--test_only", type=bool, nargs="?", const=True)
 
-  args=parser.parse_args()
+  args = parser.parse_args()
 
   if args.subparsers_name == "bazel_postsubmit_pipeline":
-    configs=fetch_configs(args.http_config)
+    configs = fetch_configs(args.http_config)
     print_bazel_postsubmit_pipeline(configs.get("platforms", None),
                                     args.http_config)
   elif args.subparsers_name == "project_pipeline":
-    configs=fetch_configs(args.http_config)
+    configs = fetch_configs(args.http_config)
     print_project_pipeline(configs.get("platforms", None), args.project_name,
                            args.http_config, args.git_repository, args.use_but)
   elif args.subparsers_name == "runner":
-    configs=fetch_configs(args.http_config)
+    configs = fetch_configs(args.http_config)
     execute_commands(configs.get("platforms", None)[args.platform],
                      args.platform, args.git_repository, args.use_but, args.save_but,
                      args.build_only, args.test_only)