diff --git a/buildkite/pipelines/bazelci.py b/buildkite/pipelines/bazelci.py
index 99ced0f..652fac5 100644
--- a/buildkite/pipelines/bazelci.py
+++ b/buildkite/pipelines/bazelci.py
@@ -116,19 +116,39 @@
   print(*args, file=sys.stderr, **kwargs)
   exit(1)
 
-
-def supported_platforms():
+def platforms_info():
   '''
   Returns a map containing all supported platform names as keys, with the
-  values being the platform name in a human readable format.
+  values being the platform name in a human readable format, and a the
+  buildkite-agent's working directory.
   '''
   return {
-      "ubuntu1404": "Ubuntu 14.04",
-      "ubuntu1604": "Ubuntu 16.04",
-      "macos": "macOS"
+      "ubuntu1404":
+      {
+          "name": "Ubuntu 14.04",
+          "agent-directory": " /var/lib/buildkite-agent/builds/${BUILDKITE_AGENT_NAME}/"
+      },
+      "ubuntu1604":
+      {
+          "name": "Ubuntu 16.04",
+          "agent-directory": " /var/lib/buildkite-agent/builds/${BUILDKITE_AGENT_NAME}/"
+      },
+      "macos":
+      {
+          "name": "macOS",
+          "agent-directory": "/usr/local/var/buildkite-agent/builds/${BUILDKITE_AGENT_NAME}/"
+      },
   }
 
 
+def supported_platforms():
+    return set(platforms_info().keys())
+
+
+def platform_name(platform):
+    return platforms_info()[platform]["name"]
+
+
 def git_clone_path():
   return "project-under-test"
 
@@ -155,7 +175,7 @@
   try:
     tmpdir = tempfile.mkdtemp()
     if use_but:
-      source_step = create_label(supported_platforms()[platform], "Bazel",
+      source_step = create_label(platform_name(platform), "Bazel",
                                  build_only=True, test_only=False)
       bazel_binary = download_bazel_binary(tmpdir, source_step)
     if git_repository:
@@ -336,8 +356,8 @@
     command = command + " --build_only"
   if test_only:
     command = command + " --test_only"
-  platform_name = supported_platforms()[platform]
-  label = create_label(platform_name, project_name, build_only, test_only)
+  label = create_label(platform_name(platform),
+                       project_name, build_only, test_only)
   return """
   - label: \"{0}\"
     command: \"{1}\\n{2}\"
@@ -396,7 +416,7 @@
   return label
 
 
-def bazel_build_step(platform_name, platform, project_name, http_config=None,
+def bazel_build_step(platform, project_name, http_config=None,
                      build_only=False, test_only=False):
   pipeline_command = python_binary() + " bazelci.py runner"
   if build_only:
@@ -405,7 +425,7 @@
     pipeline_command = pipeline_command + " --test_only"
   if http_config:
     pipeline_command = pipeline_command + " --http_config=" + http_config
-  label = create_label(platform_name, project_name, build_only=build_only,
+  label = create_label(platform_name(platform), project_name, build_only=build_only,
                        test_only=test_only)
   pipeline_command = pipeline_command + " --platform=" + platform
 
@@ -420,19 +440,17 @@
 def print_bazel_postsubmit_pipeline(configs, http_config):
   if not configs:
     eprint("Bazel postsubmit pipeline configuration is empty.")
-  if set(configs.keys()) != set(supported_platforms().keys()):
+  if set(configs.keys()) != set(supported_platforms()):
     eprint("Bazel postsubmit pipeline needs to build Bazel on all " +
            "supported platforms.")
 
   pipeline_steps = []
   for platform, config in configs.items():
-    platform_name = supported_platforms()[platform]
-    pipeline_steps.append(bazel_build_step(platform_name, platform, "Bazel",
+    pipeline_steps.append(bazel_build_step(platform, "Bazel",
                                            http_config, build_only=True))
   pipeline_steps.append(wait_step())
   for platform, config in configs.items():
-    platform_name = supported_platforms()[platform]
-    pipeline_steps.append(bazel_build_step(platform_name, platform, "Bazel",
+    pipeline_steps.append(bazel_build_step(platform, "Bazel",
                                            http_config, test_only=True))
   for project, config in downstream_projects().items():
     git_repository = config["git_repository"]
@@ -470,18 +488,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)
