This is an automated email from the ASF dual-hosted git repository.

tqchen pushed a commit to branch tvm-simplify-jenkins-pytest-sharding
in repository https://gitbox.apache.org/repos/asf/tvm.git

commit db8e16d2a7a55f11dd5ebecc421fb3d53c5af7b5
Author: Tianqi Chen <[email protected]>
AuthorDate: Sat Jul 4 23:55:04 2026 +0000

    Remove external Jenkins pytest sharding
---
 ci/jenkins/generated/arm_jenkinsfile.groovy    |  4 +-
 ci/jenkins/generated/cpu_jenkinsfile.groovy    | 79 ++-------------------
 ci/jenkins/generated/docker_jenkinsfile.groovy |  4 +-
 ci/jenkins/generated/gpu_jenkinsfile.groovy    | 98 ++++----------------------
 ci/jenkins/generated/wasm_jenkinsfile.groovy   |  4 +-
 ci/jenkins/templates/cpu_jenkinsfile.groovy.j2 |  3 +-
 ci/jenkins/templates/gpu_jenkinsfile.groovy.j2 |  8 +--
 ci/jenkins/templates/utils/base.groovy.j2      |  2 +-
 ci/jenkins/templates/utils/macros.j2           | 15 ++--
 conftest.py                                    | 40 -----------
 tests/scripts/setup-pytest-env.sh              | 12 +---
 tests/scripts/task_python_unittest.sh          |  4 +-
 12 files changed, 38 insertions(+), 235 deletions(-)

diff --git a/ci/jenkins/generated/arm_jenkinsfile.groovy 
b/ci/jenkins/generated/arm_jenkinsfile.groovy
index d6826878bf..573885545a 100644
--- a/ci/jenkins/generated/arm_jenkinsfile.groovy
+++ b/ci/jenkins/generated/arm_jenkinsfile.groovy
@@ -60,7 +60,7 @@
 // 'python3 jenkins/generate.py'
 // Note: This timestamp is here to ensure that updates to the Jenkinsfile are
 // always rebased on main before merging:
-// Generated at 2026-06-23T03:28:14.520193
+// Generated at 2026-07-04T23:53:56.833713
 
 import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
 // These are set at runtime from data in ci/jenkins/docker-images.yml, update
@@ -97,7 +97,7 @@ properties([
 upstream_revision = null
 
 // command to start a docker container
-docker_run = 'docker/bash.sh --env CI --env PLATFORM --env TVM_SHARD_INDEX 
--env TVM_NUM_SHARDS --env RUN_DISPLAY_URL --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
+docker_run = 'docker/bash.sh --env CI --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
 docker_build = 'docker/build.sh'
 // timeout in minutes
 max_time = 180
diff --git a/ci/jenkins/generated/cpu_jenkinsfile.groovy 
b/ci/jenkins/generated/cpu_jenkinsfile.groovy
index 879cd8b79f..dc944096ab 100644
--- a/ci/jenkins/generated/cpu_jenkinsfile.groovy
+++ b/ci/jenkins/generated/cpu_jenkinsfile.groovy
@@ -60,7 +60,7 @@
 // 'python3 jenkins/generate.py'
 // Note: This timestamp is here to ensure that updates to the Jenkinsfile are
 // always rebased on main before merging:
-// Generated at 2026-06-23T03:28:14.505504
+// Generated at 2026-07-04T23:53:56.855205
 
 import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
 // These are set at runtime from data in ci/jenkins/docker-images.yml, update
@@ -97,7 +97,7 @@ properties([
 upstream_revision = null
 
 // command to start a docker container
-docker_run = 'docker/bash.sh --env CI --env PLATFORM --env TVM_SHARD_INDEX 
--env TVM_NUM_SHARDS --env RUN_DISPLAY_URL --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
+docker_run = 'docker/bash.sh --env CI --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
 docker_build = 'docker/build.sh'
 // timeout in minutes
 max_time = 180
@@ -510,52 +510,7 @@ build()
 
 
 
-
-def shard_run_unittest_CPU_1_of_2(node_type) {
-  echo 'Begin running on node_type ' + node_type
-  if (!skip_ci && is_docs_only_build != 1) {
-    node(node_type) {
-      ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-cpu") {
-        // NOTE: if exception happens, it will be caught outside
-        init_git()
-        docker_init(ci_cpu)
-        timeout(time: max_time, unit: 'MINUTES') {
-          withEnv([
-            'PLATFORM=cpu',
-            'TEST_STEP_NAME=unittest: CPU',
-            'TVM_NUM_SHARDS=2',
-            'TVM_SHARD_INDEX=0',
-            "SKIP_SLOW_TESTS=${skip_slow_tests}"], {
-            sh(
-                  script: "./${jenkins_scripts_root}/s3.py --action download 
--bucket ${s3_bucket} --prefix ${s3_prefix}/cpu",
-                  label: 'Download artifacts from S3',
-                )
-
-              ci_setup(ci_cpu)
-              cpp_unittest(ci_cpu)
-              python_unittest(ci_cpu)
-          })
-        }
-        // only run upload if things are successful
-        try {
-          sh(
-            script: "./${jenkins_scripts_root}/s3.py --action upload --bucket 
${s3_bucket} --prefix ${s3_prefix}/pytest-results/unittest_CPU --items 
build/pytest-results",
-            label: 'Upload JUnits to S3',
-          )
-
-          junit 'build/pytest-results/*.xml'
-        } catch (Exception e) {
-          echo 'Exception during JUnit upload: ' + e.toString()
-        }
-      }
-    }
-    echo 'End running on node_type ' + node_type
-  } else {
-    Utils.markStageSkippedForConditional('unittest: CPU 1 of 2')
-  }
-}
-
-def shard_run_unittest_CPU_2_of_2(node_type) {
+def run_unittest_CPU(node_type) {
   echo 'Begin running on node_type ' + node_type
   if (!skip_ci && is_docs_only_build != 1) {
     node(node_type) {
@@ -567,8 +522,6 @@ def shard_run_unittest_CPU_2_of_2(node_type) {
           withEnv([
             'PLATFORM=cpu',
             'TEST_STEP_NAME=unittest: CPU',
-            'TVM_NUM_SHARDS=2',
-            'TVM_SHARD_INDEX=1',
             "SKIP_SLOW_TESTS=${skip_slow_tests}"], {
             sh(
                   script: "./${jenkins_scripts_root}/s3.py --action download 
--bucket ${s3_bucket} --prefix ${s3_prefix}/cpu",
@@ -595,7 +548,7 @@ def shard_run_unittest_CPU_2_of_2(node_type) {
     }
     echo 'End running on node_type ' + node_type
   } else {
-    Utils.markStageSkippedForConditional('unittest: CPU 2 of 2')
+    Utils.markStageSkippedForConditional('unittest: CPU')
   }
 }
 
@@ -606,27 +559,9 @@ def test() {
       SKIP_SLOW_TESTS = "${skip_slow_tests}"
     }
     parallel(
-    'unittest: CPU 1 of 2': {
-      try {
-      shard_run_unittest_CPU_1_of_2('CPU-SMALL-SPOT')
-      } catch (Throwable ex) {
-        echo 'Exception during SPOT run ' + ex.toString()
-        if (is_last_build()) {
-          // retry if at last build
-          // mark the current stage as success
-          // and try again via on demand node
-          echo 'Retry on-demand given it is last build'
-          currentBuild.result = 'SUCCESS'
-          shard_run_unittest_CPU_1_of_2('CPU-SMALL')
-        } else {
-          echo 'Exit since it is not last build'
-          throw ex
-        }
-      }
-    },
-    'unittest: CPU 2 of 2': {
+    'unittest: CPU': {
       try {
-      shard_run_unittest_CPU_2_of_2('CPU-SMALL-SPOT')
+      run_unittest_CPU('CPU-SMALL-SPOT')
       } catch (Throwable ex) {
         echo 'Exception during SPOT run ' + ex.toString()
         if (is_last_build()) {
@@ -635,7 +570,7 @@ def test() {
           // and try again via on demand node
           echo 'Retry on-demand given it is last build'
           currentBuild.result = 'SUCCESS'
-          shard_run_unittest_CPU_2_of_2('CPU-SMALL')
+          run_unittest_CPU('CPU-SMALL')
         } else {
           echo 'Exit since it is not last build'
           throw ex
diff --git a/ci/jenkins/generated/docker_jenkinsfile.groovy 
b/ci/jenkins/generated/docker_jenkinsfile.groovy
index f5409e23aa..95f2fd8dd6 100644
--- a/ci/jenkins/generated/docker_jenkinsfile.groovy
+++ b/ci/jenkins/generated/docker_jenkinsfile.groovy
@@ -60,7 +60,7 @@
 // 'python3 jenkins/generate.py'
 // Note: This timestamp is here to ensure that updates to the Jenkinsfile are
 // always rebased on main before merging:
-// Generated at 2026-06-23T03:28:14.487314
+// Generated at 2026-07-04T23:53:56.875051
 
 import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
 // These are set at runtime from data in ci/jenkins/docker-images.yml, update
@@ -97,7 +97,7 @@ properties([
 upstream_revision = null
 
 // command to start a docker container
-docker_run = 'docker/bash.sh --env CI --env PLATFORM --env TVM_SHARD_INDEX 
--env TVM_NUM_SHARDS --env RUN_DISPLAY_URL --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
+docker_run = 'docker/bash.sh --env CI --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
 docker_build = 'docker/build.sh'
 // timeout in minutes
 max_time = 180
diff --git a/ci/jenkins/generated/gpu_jenkinsfile.groovy 
b/ci/jenkins/generated/gpu_jenkinsfile.groovy
index 28c9a6040e..d31160dd52 100644
--- a/ci/jenkins/generated/gpu_jenkinsfile.groovy
+++ b/ci/jenkins/generated/gpu_jenkinsfile.groovy
@@ -60,7 +60,7 @@
 // 'python3 jenkins/generate.py'
 // Note: This timestamp is here to ensure that updates to the Jenkinsfile are
 // always rebased on main before merging:
-// Generated at 2026-06-23T03:28:14.533751
+// Generated at 2026-07-04T23:53:56.896868
 
 import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
 // These are set at runtime from data in ci/jenkins/docker-images.yml, update
@@ -97,7 +97,7 @@ properties([
 upstream_revision = null
 
 // command to start a docker container
-docker_run = 'docker/bash.sh --env CI --env PLATFORM --env TVM_SHARD_INDEX 
--env TVM_NUM_SHARDS --env RUN_DISPLAY_URL --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
+docker_run = 'docker/bash.sh --env CI --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
 docker_build = 'docker/build.sh'
 // timeout in minutes
 max_time = 180
@@ -515,8 +515,7 @@ def build() {
 build()
 
 
-
-def shard_run_unittest_GPU_1_of_2(node_type) {
+def run_unittest_GPU(node_type) {
   echo 'Begin running on node_type ' + node_type
   if (!skip_ci && is_docs_only_build != 1) {
     node(node_type) {
@@ -528,58 +527,6 @@ def shard_run_unittest_GPU_1_of_2(node_type) {
           withEnv([
             'PLATFORM=gpu',
             'TEST_STEP_NAME=unittest: GPU',
-            'TVM_NUM_SHARDS=2',
-            'TVM_SHARD_INDEX=0',
-            "SKIP_SLOW_TESTS=${skip_slow_tests}"], {
-            sh(
-                  script: "./${jenkins_scripts_root}/s3.py --action download 
--bucket ${s3_bucket} --prefix ${s3_prefix}/gpu",
-                  label: 'Download artifacts from S3',
-                )
-
-              ci_setup(ci_gpu)
-              sh (
-                script: "${docker_run} ${ci_gpu} 
./tests/scripts/task_python_unittest_gpuonly.sh",
-                label: 'Run Python GPU unit tests',
-              )
-              sh (
-                script: "${docker_run} ${ci_gpu} 
./tests/scripts/task_python_integration_gpuonly.sh",
-                label: 'Run Python GPU integration tests',
-              )
-          })
-        }
-        // only run upload if things are successful
-        try {
-          sh(
-            script: "./${jenkins_scripts_root}/s3.py --action upload --bucket 
${s3_bucket} --prefix ${s3_prefix}/pytest-results/unittest_GPU --items 
build/pytest-results",
-            label: 'Upload JUnits to S3',
-          )
-
-          junit 'build/pytest-results/*.xml'
-        } catch (Exception e) {
-          echo 'Exception during JUnit upload: ' + e.toString()
-        }
-      }
-    }
-    echo 'End running on node_type ' + node_type
-  } else {
-    Utils.markStageSkippedForConditional('unittest: GPU 1 of 2')
-  }
-}
-
-def shard_run_unittest_GPU_2_of_2(node_type) {
-  echo 'Begin running on node_type ' + node_type
-  if (!skip_ci && is_docs_only_build != 1) {
-    node(node_type) {
-      ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-gpu") {
-        // NOTE: if exception happens, it will be caught outside
-        init_git()
-        docker_init(ci_gpu)
-        timeout(time: max_time, unit: 'MINUTES') {
-          withEnv([
-            'PLATFORM=gpu',
-            'TEST_STEP_NAME=unittest: GPU',
-            'TVM_NUM_SHARDS=2',
-            'TVM_SHARD_INDEX=1',
             "SKIP_SLOW_TESTS=${skip_slow_tests}"], {
             sh(
                   script: "./${jenkins_scripts_root}/s3.py --action download 
--bucket ${s3_bucket} --prefix ${s3_prefix}/gpu",
@@ -616,14 +563,13 @@ def shard_run_unittest_GPU_2_of_2(node_type) {
     }
     echo 'End running on node_type ' + node_type
   } else {
-    Utils.markStageSkippedForConditional('unittest: GPU 2 of 2')
+    Utils.markStageSkippedForConditional('unittest: GPU')
   }
 }
 
 
 
-
-def shard_run_docs_GPU_1_of_1(node_type) {
+def run_docs_GPU(node_type) {
   echo 'Begin running on node_type ' + node_type
   if (!skip_ci) {
     node(node_type) {
@@ -635,8 +581,6 @@ def shard_run_docs_GPU_1_of_1(node_type) {
           withEnv([
             'PLATFORM=gpu',
             'TEST_STEP_NAME=docs: GPU',
-            'TVM_NUM_SHARDS=1',
-            'TVM_SHARD_INDEX=0',
             "SKIP_SLOW_TESTS=${skip_slow_tests}"], {
             sh(
                   script: "./${jenkins_scripts_root}/s3.py --action download 
--bucket ${s3_bucket} --prefix ${s3_prefix}/gpu",
@@ -674,7 +618,7 @@ def shard_run_docs_GPU_1_of_1(node_type) {
     }
     echo 'End running on node_type ' + node_type
   } else {
-    Utils.markStageSkippedForConditional('docs: GPU 1 of 1')
+    Utils.markStageSkippedForConditional('docs: GPU')
   }
 }
 
@@ -686,27 +630,9 @@ def test() {
       SKIP_SLOW_TESTS = "${skip_slow_tests}"
     }
     parallel(
-    'unittest: GPU 1 of 2': {
-      try {
-      shard_run_unittest_GPU_1_of_2('GPU-SPOT')
-      } catch (Throwable ex) {
-        echo 'Exception during SPOT run ' + ex.toString()
-        if (is_last_build()) {
-          // retry if at last build
-          // mark the current stage as success
-          // and try again via on demand node
-          echo 'Retry on-demand given it is last build'
-          currentBuild.result = 'SUCCESS'
-          shard_run_unittest_GPU_1_of_2('GPU')
-        } else {
-          echo 'Exit since it is not last build'
-          throw ex
-        }
-      }
-    },
-    'unittest: GPU 2 of 2': {
+    'unittest: GPU': {
       try {
-      shard_run_unittest_GPU_2_of_2('GPU-SPOT')
+      run_unittest_GPU('GPU-SPOT')
       } catch (Throwable ex) {
         echo 'Exception during SPOT run ' + ex.toString()
         if (is_last_build()) {
@@ -715,16 +641,16 @@ def test() {
           // and try again via on demand node
           echo 'Retry on-demand given it is last build'
           currentBuild.result = 'SUCCESS'
-          shard_run_unittest_GPU_2_of_2('GPU')
+          run_unittest_GPU('GPU')
         } else {
           echo 'Exit since it is not last build'
           throw ex
         }
       }
     },
-    'docs: GPU 1 of 1': {
+    'docs: GPU': {
       try {
-      shard_run_docs_GPU_1_of_1('GPU-SPOT')
+      run_docs_GPU('GPU-SPOT')
       } catch (Throwable ex) {
         echo 'Exception during SPOT run ' + ex.toString()
         if (is_last_build()) {
@@ -733,7 +659,7 @@ def test() {
           // and try again via on demand node
           echo 'Retry on-demand given it is last build'
           currentBuild.result = 'SUCCESS'
-          shard_run_docs_GPU_1_of_1('GPU')
+          run_docs_GPU('GPU')
         } else {
           echo 'Exit since it is not last build'
           throw ex
diff --git a/ci/jenkins/generated/wasm_jenkinsfile.groovy 
b/ci/jenkins/generated/wasm_jenkinsfile.groovy
index ab64444e4a..b6946a40fe 100644
--- a/ci/jenkins/generated/wasm_jenkinsfile.groovy
+++ b/ci/jenkins/generated/wasm_jenkinsfile.groovy
@@ -60,7 +60,7 @@
 // 'python3 jenkins/generate.py'
 // Note: This timestamp is here to ensure that updates to the Jenkinsfile are
 // always rebased on main before merging:
-// Generated at 2026-06-23T03:28:14.550555
+// Generated at 2026-07-04T23:53:56.918767
 
 import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
 // These are set at runtime from data in ci/jenkins/docker-images.yml, update
@@ -97,7 +97,7 @@ properties([
 upstream_revision = null
 
 // command to start a docker container
-docker_run = 'docker/bash.sh --env CI --env PLATFORM --env TVM_SHARD_INDEX 
--env TVM_NUM_SHARDS --env RUN_DISPLAY_URL --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
+docker_run = 'docker/bash.sh --env CI --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
 docker_build = 'docker/build.sh'
 // timeout in minutes
 max_time = 180
diff --git a/ci/jenkins/templates/cpu_jenkinsfile.groovy.j2 
b/ci/jenkins/templates/cpu_jenkinsfile.groovy.j2
index d2e479d5e8..75b43c52a8 100644
--- a/ci/jenkins/templates/cpu_jenkinsfile.groovy.j2
+++ b/ci/jenkins/templates/cpu_jenkinsfile.groovy.j2
@@ -37,11 +37,10 @@
 {% set test_method_names = [] %}
 
 
-{% call(shard_index, num_shards) m.sharded_test_step(
+{% call m.test_step(
   name="unittest: CPU",
   ws="tvm/ut-python-cpu",
   platform="cpu",
-  num_shards=2,
   docker_image="ci_cpu",
   test_method_names=test_method_names,
 ) %}
diff --git a/ci/jenkins/templates/gpu_jenkinsfile.groovy.j2 
b/ci/jenkins/templates/gpu_jenkinsfile.groovy.j2
index 7ab5256419..33e5a8aed5 100644
--- a/ci/jenkins/templates/gpu_jenkinsfile.groovy.j2
+++ b/ci/jenkins/templates/gpu_jenkinsfile.groovy.j2
@@ -38,9 +38,8 @@
 
 {% set test_method_names = [] %}
 
-{% call(shard_index, num_shards) m.sharded_test_step(
+{% call m.test_step(
   name="unittest: GPU",
-  num_shards=2,
   ws="tvm/ut-python-gpu",
   platform="gpu",
   docker_image="ci_gpu",
@@ -48,12 +47,10 @@
 ) %}
   {{ m.download_artifacts(tag='gpu') }}
   ci_setup(ci_gpu)
-  {% if shard_index == 2 or num_shards < 2 %}
   sh (
     script: "${docker_run} ${ci_gpu} ./tests/scripts/task_java_unittest.sh",
     label: 'Run Java unit tests',
   )
-  {% endif %}
   sh (
     script: "${docker_run} ${ci_gpu} 
./tests/scripts/task_python_unittest_gpuonly.sh",
     label: 'Run Python GPU unit tests',
@@ -65,9 +62,8 @@
 {% endcall %}
 
 
-{% call(shard_index, num_shards) m.sharded_test_step(
+{% call m.test_step(
   name="docs: GPU",
-  num_shards=1,
   ws="tvm/docs-python-gpu",
   platform="gpu",
   docker_image="ci_gpu",
diff --git a/ci/jenkins/templates/utils/base.groovy.j2 
b/ci/jenkins/templates/utils/base.groovy.j2
index 813ceee886..a8fda460b7 100644
--- a/ci/jenkins/templates/utils/base.groovy.j2
+++ b/ci/jenkins/templates/utils/base.groovy.j2
@@ -82,7 +82,7 @@ properties([
 upstream_revision = null
 
 // command to start a docker container
-docker_run = 'docker/bash.sh --env CI --env PLATFORM --env TVM_SHARD_INDEX 
--env TVM_NUM_SHARDS --env RUN_DISPLAY_URL --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
+docker_run = 'docker/bash.sh --env CI --env PLATFORM --env SKIP_SLOW_TESTS 
--env TEST_STEP_NAME'
 docker_build = 'docker/build.sh'
 // timeout in minutes
 max_time = 180
diff --git a/ci/jenkins/templates/utils/macros.j2 
b/ci/jenkins/templates/utils/macros.j2
index b1bd3679ac..bd0e0d4ee4 100644
--- a/ci/jenkins/templates/utils/macros.j2
+++ b/ci/jenkins/templates/utils/macros.j2
@@ -26,10 +26,8 @@ sh(
           )
 {% endmacro %}
 
-{% macro sharded_test_step(name, num_shards, ws, docker_image, platform, 
test_method_names, condition="!skip_ci && is_docs_only_build != 1") %}
-
-{% for shard_index in range(1, num_shards + 1) %}
-{% set method_name = "shard_run_" + name.replace(":", "").replace(" ", 
"-").replace("-", "_") + "_" + shard_index|string + "_of_" + num_shards|string 
%}
+{% macro test_step(name, ws, docker_image, platform, test_method_names, 
condition="!skip_ci && is_docs_only_build != 1") %}
+{% set method_name = "run_" + name.replace(":", "").replace(" ", 
"-").replace("-", "_") %}
 {% set test_dir_name = name.replace(":", "").replace(" ", "-").replace("-", 
"_")|string %}
 def {{ method_name }}(node_type) {
   echo 'Begin running on node_type ' + node_type
@@ -43,10 +41,8 @@ def {{ method_name }}(node_type) {
           withEnv([
             'PLATFORM={{ platform }}',
             'TEST_STEP_NAME={{ name }}',
-            'TVM_NUM_SHARDS={{ num_shards }}',
-            'TVM_SHARD_INDEX={{ shard_index - 1 }}',
             "SKIP_SLOW_TESTS=${skip_slow_tests}"], {
-            {{ caller(shard_index, num_shards) | trim | indent(width=12) }}
+            {{ caller() | trim | indent(width=12) }}
           })
         }
         // only run upload if things are successful
@@ -60,12 +56,11 @@ def {{ method_name }}(node_type) {
     }
     echo 'End running on node_type ' + node_type
   } else {
-    Utils.markStageSkippedForConditional('{{ name }} {{ shard_index }} of {{ 
num_shards }}')
+    Utils.markStageSkippedForConditional('{{ name }}')
   }
 }
-{% set _ = test_method_names.append((name + " " + shard_index|string + " of " 
+ num_shards|string, method_name)) %}
+{% set _ = test_method_names.append((name, method_name)) %}
 
-{% endfor %}
 {% endmacro %}
 
 {% macro invoke_build(name, condition, node, docker_image, ws, platform) %}
diff --git a/conftest.py b/conftest.py
index 8edf545cd7..dd294ea548 100644
--- a/conftest.py
+++ b/conftest.py
@@ -14,8 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-# ruff: noqa: E501
-import hashlib
 import os
 import sys
 from pathlib import Path
@@ -25,44 +23,6 @@ IS_IN_CI = os.getenv("CI", "") == "true"
 REPO_ROOT = Path(__file__).resolve().parent
 
 
-# These rely on running on the same node to pass successfully
-FIXED_ALLOCATION_PREFIXES = {
-    "tests/python/testing/test_tvm_testing_features.py": 0,
-}
-
-
-def find_shard_index(nodeid: str, num_shards: int) -> int:
-    """
-    Return the index of the shard that should run this test
-    """
-    for prefix, target_shard_idx in FIXED_ALLOCATION_PREFIXES.items():
-        if nodeid.startswith(prefix):
-            if target_shard_idx >= num_shards:
-                raise RuntimeError(
-                    f"Cannot collect sharded tests, {nodeid} has hardcoded 
shard index {target_shard_idx} among only {num_shards} shards"
-                )
-            return target_shard_idx
-
-    node_hash = hashlib.md5(nodeid.encode()).hexdigest()
-    return int(node_hash, 16) % num_shards
-
-
-def pytest_collection_modifyitems(config, items):
-    if not all(k in os.environ for k in ["CI", "TVM_NUM_SHARDS", 
"TVM_SHARD_INDEX"]):
-        # Only apportion tests if in CI and in a job that is set up for it
-        return
-
-    num_shards = int(os.environ["TVM_NUM_SHARDS"])
-    shard_index = int(os.environ["TVM_SHARD_INDEX"])
-
-    print(f"Marking tests for shard {shard_index} of {num_shards}")
-    items_copy = list(items)
-    for item in items_copy:
-        item_shard_index = find_shard_index(item.nodeid, num_shards=num_shards)
-        if item_shard_index != shard_index:
-            items.remove(item)
-
-
 def pytest_sessionstart():
     if IS_IN_CI:
         hook_script_dir = REPO_ROOT / "tests" / "scripts" / "request_hook"
diff --git a/tests/scripts/setup-pytest-env.sh 
b/tests/scripts/setup-pytest-env.sh
index bac4cf6ccb..ee68a08dfd 100755
--- a/tests/scripts/setup-pytest-env.sh
+++ b/tests/scripts/setup-pytest-env.sh
@@ -60,15 +60,6 @@ function run_pytest() {
         exit 2
     fi
 
-    # Allow unbound variable here.
-    set +u
-    if [[ -z "${TVM_SHARD_INDEX}" ]]; then
-      current_shard="no-shard"
-    else
-      current_shard="shard-${TVM_SHARD_INDEX}"
-    fi
-    set -u
-
     has_reruns=$(python3 -m pytest --help 2>&1 | grep 'reruns=' || true)
     if [ -n "$has_reruns" ]; then
         if [[ ! "${extra_args[*]}" == *"--reruns"* ]]; then
@@ -76,7 +67,7 @@ function run_pytest() {
         fi
     fi
 
-    suite_name="${test_suite_name}-${current_shard}"
+    suite_name="${test_suite_name}"
 
     DEFAULT_PARALLELISM=auto
 
@@ -96,6 +87,7 @@ function run_pytest() {
     set +e
     python3 -m pytest \
            "--junit-xml=${TVM_PYTEST_RESULT_DIR}/${suite_name}.xml" \
+           -o "junit_suite_name=${suite_name}" \
            "${extra_args[@]}" || exit_code=$?
     # Pytest will return error code -5 if no test is collected.
     if [ "$exit_code" -ne "0" ] && [ "$exit_code" -ne "5" ]; then
diff --git a/tests/scripts/task_python_unittest.sh 
b/tests/scripts/task_python_unittest.sh
index 7e09926cc0..dfe4bcef41 100755
--- a/tests/scripts/task_python_unittest.sh
+++ b/tests/scripts/task_python_unittest.sh
@@ -31,10 +31,10 @@ if [ -z "${TVM_UNITTEST_TESTSUITE_NAME:-}" ]; then
     TVM_UNITTEST_TESTSUITE_NAME=python-unittest
 fi
 
-# First run minimal test on both ctypes and cython.
+# First run the minimal platform test.
 run_pytest ${TVM_UNITTEST_TESTSUITE_NAME}-platform-minimal-test 
tests/python/all-platform-minimal-test
 
-# Then run all unittests on both ctypes and cython.
+# Then run all unit tests.
 TEST_FILES=(
   "ffi"
   "arith"

Reply via email to