diff --git a/buildkite/README.md b/buildkite/README.md
index 3d82252..fd30c0e 100644
--- a/buildkite/README.md
+++ b/buildkite/README.md
@@ -511,6 +511,47 @@
 
 The exported JSON profiles are available as artifacts after each run.
 
+### Matrix Testing
+
+Similar to Github Actions's [matrix testing support](https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix), you can specify a matrix to create multiple tasks by performing variable substitution in a single task configuration.
+
+Example usage:
+
+```yaml
+---
+matrix:
+  bazel_version: ["4.2.2", "5.0.0"]
+  unix_platform: ["centos7", "debian10", "macos", "ubuntu2004"]
+  python: ["python2", "python3"]
+  unix_compiler: ["gcc", "clang"]
+  win_compiler: ["msvc", "clang"]
+
+tasks:
+  unix_test:
+    name: "Test my project on Unix systems"
+    platform: ${{ unix_platform }}
+    compiler: ${{ unix_compiler }}
+    python: ${{ python }}
+    build_targets:
+    - "//..."
+    test_targets:
+    - "//..."
+  windows_test:
+    name: "Test my project on Windows"
+    platform: "windows"
+    bazel: ${{ bazel_version }}
+    compiler: ${{ win_compiler }}
+    python: ${{ python }}
+    build_targets:
+    - "//..."
+    test_targets:
+    - "//..."
+```
+
+The `unix_test` task configuration will generate 16 tasks (4 * 2 * 2) for each `unix_platform`, `unix_compiler`, and `python` combination.
+
+The `windows_test` task configuration will generate 8 tasks (2 * 2 * 2) for each `bazel_version`, `win_compiler` and `python` combination.
+
 ## FAQ
 
 ### My tests fail on Bazel CI due to "Error downloading"
diff --git a/buildkite/bazelci.py b/buildkite/bazelci.py
index 5794489..901237f 100755
--- a/buildkite/bazelci.py
+++ b/buildkite/bazelci.py
@@ -17,9 +17,11 @@
 import argparse
 import base64
 import codecs
+import copy
 import datetime
 from glob import glob
 import hashlib
+import itertools
 import json
 import multiprocessing
 import os
@@ -874,6 +876,54 @@
     return downstream_root
 
 
+def match_matrix_attr_pattern(s):
+    return re.match("^\${{\s*(\w+)\s*}}$", s)
+
+
+def get_matrix_attributes(task):
+    """Get unexpanded matrix attributes from the given task.
+
+    If a value of field matches "${{<name>}}", then <name> is a wanted matrix attribute.
+    eg. platform: ${{ platform }}
+    """
+    attributes = []
+    for key, value in task.items():
+        if type(value) is str:
+            res = match_matrix_attr_pattern(value)
+            if res:
+                attributes.append(res.groups()[0])
+    return list(set(attributes))
+
+
+def get_combinations(matrix, attributes):
+    """Given a matrix and the wanted attributes, return all possible combinations.
+
+    eg.
+    With matrix = {'a': [1, 2], 'b': [1], 'c': [1]},
+    if attributes = ['a', 'b'], then returns [[('a', 1), ('b', 1)], [('a', 2), ('b', 1)]]
+    if attributes = ['b', 'c'], then returns [[('b', 1), ('c', 1)]]
+    if attributes = ['c'], then returns [[('c', 1)]]
+    """
+    for attr in attributes:
+        if attr not in matrix:
+            raise BuildkiteException("${{ %s }} is not defined in `matrix` section." % attr)
+    pairs = [[(attr, value) for value in matrix[attr]] for attr in attributes]
+    return itertools.product(*pairs)
+
+
+def get_expanded_task(task, combination):
+    """Expand a task with the given combination of values of attributes."""
+    combination = dict(combination)
+    expanded_task = copy.deepcopy(task)
+    for key, value in task.items():
+        if type(value) is str:
+            res = match_matrix_attr_pattern(value)
+            if res:
+                attr = res.groups()[0]
+                expanded_task[key] = combination[attr]
+    return expanded_task
+
+
 def fetch_configs(http_url, file_config):
     """
     If specified fetches the build configuration from file_config or http_url, else tries to
@@ -904,6 +954,29 @@
     if "tasks" not in config:
         config["tasks"] = {}
 
+    # Expand tasks that uses attributes defined in the matrix section.
+    # The original task definition expands to multiple tasks for each possible combination.
+    tasks_to_expand = []
+    expanded_tasks = {}
+    matrix = config.pop("matrix", {})
+    for key, value in matrix.items():
+        if type(key) is not str or type(value) is not list:
+            raise BuildkiteException("Expect `matrix` is a map of str -> list")
+
+    for task in config["tasks"]:
+        attributes = get_matrix_attributes(config["tasks"][task])
+        if attributes:
+            tasks_to_expand.append(task)
+            count = 1
+            for combination in get_combinations(matrix, attributes):
+                expanded_task_name = "%s_config_%.2d" % (task, count)
+                count += 1
+                expanded_tasks[expanded_task_name] = get_expanded_task(config["tasks"][task], combination)
+
+    for task in tasks_to_expand:
+        config["tasks"].pop(task)
+    config["tasks"].update(expanded_tasks)
+
     imports = config.pop("imports", None)
     if imports:
         if not allow_imports:
