diff --git a/buildkite/pipelines/bazelci.py b/buildkite/pipelines/bazelci.py
index 6e3b5b3..3f1847e 100644
--- a/buildkite/pipelines/bazelci.py
+++ b/buildkite/pipelines/bazelci.py
@@ -5,13 +5,11 @@
 import shutil
 import subprocess
 import sys
+import tempfile
 import urllib.request
 from shutil import copyfile
 from urllib.parse import urlparse
 
-OUTPUT_DIRECTORY = ".bazelci_outputs/"
-BEP_OUTPUT_FILENAME = OUTPUT_DIRECTORY + "test.json"
-
 def supported_platforms():
     return {
         "ubuntu1404" : "Ubuntu 14.04",
@@ -28,7 +26,10 @@
         return json.load(reader(resp))
 
 def run(config, platform, bazel_binary, git_repository):
+    exit_code = 0
+    tmpdir = None
     try:
+        tmpdir = tempfile.mkdtemp()
         if git_repository:
             if os.path.exists("downstream-repo"):
                 shutil.rmtree("downstream-repo")
@@ -36,17 +37,19 @@
             cleanup(bazel_binary)
         else:
             cleanup(bazel_binary)
-        os.mkdir(OUTPUT_DIRECTORY)
         shell_commands(config.get("shell_commands", None))
         bazel_run(bazel_binary, config.get("run_targets", None))
         bazel_build(bazel_binary, config.get("build_flags", []), config.get("build_targets", None))
-        exit_code = bazel_test(bazel_binary, config.get("test_flags", []), config.get("test_targets", None))
-        upload_failed_test_logs(BEP_OUTPUT_FILENAME)
+        bep_file = os.path.join(tmpdir, "build_event_json_file.json")
+        exit_code = bazel_test(bazel_binary, config.get("test_flags", []), config.get("test_targets", None), bep_file)
+        upload_failed_test_logs(bep_file, tmpdir)
         if git_repository:
             delete_repository(git_repository)
-        exit(exit_code)
     finally:
+        if tmpdir:
+             os.rmtree(tmpdir)
         cleanup(bazel_binary)
+        exit(exit_code)
 
 def clone_repository(git_repository):
     fail_if_nonzero(run_command(["git", "clone", git_repository, "downstream-repo"]))
@@ -76,24 +79,24 @@
     print("\n+++ Build")
     fail_if_nonzero(run_command([bazel_binary, "build", "--color=yes", "--keep_going"] + flags + targets))
 
-def bazel_test(bazel_binary, flags, targets):
+def bazel_test(bazel_binary, flags, targets, bep_file):
     if not targets:
         return
     print("\n+++ Test")
-    return run_command([bazel_binary, "test", "--color=yes", "--keep_going", "--build_tests_only", "--build_event_json_file=" + BEP_OUTPUT_FILENAME] + flags + targets)
+    return run_command([bazel_binary, "test", "--color=yes", "--keep_going", "--build_tests_only", "--build_event_json_file=" + bep_file] + flags + targets)
 
 def fail_if_nonzero(exitcode):
     if exitcode is not 0:
         exit(exitcode)
 
-def upload_failed_test_logs(bep_path):
-    for logfile in failed_test_logs(bep_path):
-        fail_if_nonzero(fail_if_nonzero(run_command(["buildkite-agent", "artifact", "upload", logfile])))
+def upload_failed_test_logs(bep_file, tmpdir):
+    for logfile in failed_test_logs(bep_file, tmpdir):
+        fail_if_nonzero(run_command(["buildkite-agent", "artifact", "upload", logfile]))
 
-def failed_test_logs(bep_path):
+def failed_test_logs(bep_file, tmpdir):
     test_logs = []
     raw_data = ""
-    with open(bep_path) as f:
+    with open(bep_file) as f:
         raw_data = f.read()
     decoder = json.JSONDecoder()
 
@@ -106,25 +109,23 @@
                 outputs = test_result["testActionOutput"]
                 for output in outputs:
                     if output["name"] == "test.log":
-                        new_path = label_to_path(json_dict["id"]["testResult"]["label"])
+                        new_path = label_to_path(tmpdir, json_dict["id"]["testResult"]["label"])
                         os.makedirs(os.path.dirname(new_path), exist_ok=True)
                         copyfile(urlparse(output["uri"]).path, new_path)
                         test_logs.append(new_path)
         pos += size + 1
     return test_logs
 
-def label_to_path(label):
+def label_to_path(tmpdir, label):
   # remove leading //
   path = label[2:]
   path = path.replace(":", "/")
-  return OUTPUT_DIRECTORY + path + ".log"
+  return os.path.join(tmpdir, path + ".log")
 
 def cleanup(bazel_binary):
     print("\n--- Cleanup")
     if os.path.exists("WORKSPACE"):
         fail_if_nonzero(run_command([bazel_binary, "clean", "--expunge"]))
-    if os.path.exists(OUTPUT_DIRECTORY):
-        shutil.rmtree(OUTPUT_DIRECTORY)
     if os.path.exists("downstream-repo"):
         shutil.rmtree("downstream-repo")
 
