update latest.json to contain all platforms
diff --git a/buildkite/bazelci.py b/buildkite/bazelci.py
index 405d93d..a23bf1a 100644
--- a/buildkite/bazelci.py
+++ b/buildkite/bazelci.py
@@ -586,14 +586,13 @@
                              pipeline_command, platform)
 
 
-def publish_bazel_binary_step(platform):
-  command = python_binary() + " bazelci.py publish_binary --platform=" + platform
+def publish_bazel_binaries_step():
+  command = python_binary() + " bazelci.py publish_binaries"
   return """
-  - label: \"Publish Bazel Binary ({0})\"
-    command: \"{1}\\n{2}\"
+  - label: \"Publish Bazel Binaries\"
+    command: \"{0}\\n{1}\"
     agents:
-      - \"pipeline=true\"""".format(platform_name(platform), fetch_bazelcipy_command(),
-                                    command)
+      - \"pipeline=true\"""".format(fetch_bazelcipy_command(), command)
 
 
 def print_bazel_postsubmit_pipeline(configs, http_config):
@@ -610,8 +609,7 @@
   pipeline_steps.append(wait_step())
 
   # todo move this to the end with a wait step.
-  for platform in supported_platforms():
-    pipeline_steps.append(publish_bazel_binary_step(platform))
+  pipeline_steps.append(publish_bazel_binaries_step())
 
   for platform, config in configs.items():
     pipeline_steps.append(bazel_build_step(platform, "Bazel",
@@ -626,23 +624,23 @@
 
 
 def bazelci_builds_download_url(platform, build_number):
-  return "https://storage.googleapis.com/bazel-builds/artifacts/{0}/{1}/bazel".format(build_number, platform)
+  return "https://storage.googleapis.com/bazel-builds/artifacts/{0}/{1}/bazel".format(platform, build_number)
 
 
 def bazelci_builds_upload_url(platform, build_number):
   return "gs://bazel-builds/artifacts/{0}/{1}/bazel".format(build_number, platform)
 
 
-def bazelci_builds_metadata_url(platform):
-  return "gs://bazel-builds/metadata/{0}/latest.json".format(platform)
+def bazelci_builds_metadata_url():
+  return "gs://bazel-builds/metadata/latest_fully_tested.json"
 
 
-def latest_generation_and_build_number(platform):
+def latest_generation_and_build_number():
   output = None
   attempt = 0
   while attempt < 5:
     output = subprocess.check_output(
-        ["gsutil", "stat", bazelci_builds_metadata_url(platform)])
+        ["gsutil", "stat", bazelci_builds_metadata_url()])
     match = re.search("Generation:[ ]*([0-9]+)", output.decode("utf-8"))
     if not match:
       eprint("Couldn't parse generation. gsutil output format changed?")
@@ -654,7 +652,7 @@
     expected_md5hash = base64.b64decode(match.group(1))
 
     output = subprocess.check_output(
-        ["gsutil", "cat", bazelci_builds_metadata_url(platform)])
+        ["gsutil", "cat", bazelci_builds_metadata_url()])
     hasher = hashlib.md5()
     hasher.update(output)
     actual_md5hash = hasher.digest()
@@ -674,21 +672,24 @@
   return sha256.hexdigest()
 
 
-def try_publish_binary(platform, build_number, expected_generation):
+def try_publish_binaries(build_number, expected_generation):
   tmpdir = None
   try:
     tmpdir = tempfile.mkdtemp()
-    bazel_binary_path = download_bazel_binary(tmpdir, platform)
-    fail_if_nonzero(execute_command(["gsutil", "cp", "-a", "public-read", bazel_binary_path,
-                                     bazelci_builds_upload_url(platform, build_number)]))
-
     info = {
         "build_number": build_number,
-        "binary_url": bazelci_builds_download_url(platform, build_number),
-        "binary_sha256": sha256_hexdigest(bazel_binary_path),
         "git_commit": os.environ["BUILDKITE_COMMIT"],
-        "platform": platform,
+        "platforms": {}
     }
+    for platform in supported_platforms():
+      bazel_binary_path = download_bazel_binary(tmpdir, platform)
+      fail_if_nonzero(execute_command(["gsutil", "cp", "-a", "public-read", bazel_binary_path,
+                                       bazelci_builds_upload_url(platform, build_number)]))
+      info["platforms"][platform] = {
+          "url": bazelci_builds_download_url(platform, build_number),
+          "sha256": sha256_hexdigest(bazel_binary_path),
+      }
+
     info_file = os.path.join(tmpdir, "info.json")
     with open(info_file, mode="w", encoding="utf-8") as fp:
       json.dump(info, fp)
@@ -701,14 +702,13 @@
       shutil.rmtree(tmpdir)
 
 
-def publish_binary(platform):
+def publish_binaries():
   '''
-  Publish tested Bazel binary to GCS.
+  Publish Bazel binaries to GCS.
   '''
   attempt = 0
   while attempt < 5:
-    latest_generation, latest_build_number = latest_generation_and_build_number(
-        platform)
+    latest_generation, latest_build_number = latest_generation_and_build_number()
 
     current_build_number = os.environ.get("BUILDKITE_BUILD_NUMBER", None)
     if not current_build_number:
@@ -720,9 +720,9 @@
                                                         latest_build_number))
       break
 
-    if try_publish_binary(platform, current_build_number, latest_generation):
-      print("Successfully published " +
-            bazelci_builds_download_url(platform, current_build_number))
+    if try_publish_binaries(current_build_number, latest_generation):
+      print("Successfully updated '{0}' to binaries from build {1}."
+            .format(bazelci_builds_metadata_url(), current_build_number))
       break
     attempt = attempt + 1
 
@@ -754,9 +754,7 @@
   runner.add_argument("--build_only", type=bool, nargs="?", const=True)
   runner.add_argument("--test_only", type=bool, nargs="?", const=True)
 
-  runner = subparsers.add_parser("publish_binary")
-  runner.add_argument("--platform", action="store", required=True,
-                      choices=list(supported_platforms()))
+  runner = subparsers.add_parser("publish_binaries")
 
   args = parser.parse_args()
 
@@ -773,7 +771,7 @@
     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)
-  elif args.subparsers_name == "publish_binary":
-    publish_binary(args.platform)
+  elif args.subparsers_name == "publish_binaries":
+    publish_binaries()
   else:
     parser.print_help()