From 2417a9da57ce07d86b66cf16f4e45cdd42e137f4 Mon Sep 17 00:00:00 2001 From: Liangsheng Yin Date: Thu, 14 May 2026 01:02:01 -0700 Subject: [PATCH] [CI] Bundle `check-changes` outputs + caller inputs into 2 JSON inputs (#25238) --- .github/workflows/_pr-test-stage.yml | 98 ++++++++------------ .github/workflows/pr-test.yml | 130 ++++++--------------------- 2 files changed, 63 insertions(+), 165 deletions(-) diff --git a/.github/workflows/_pr-test-stage.yml b/.github/workflows/_pr-test-stage.yml index d25a22906..38102dddf 100644 --- a/.github/workflows/_pr-test-stage.yml +++ b/.github/workflows/_pr-test-stage.yml @@ -1,85 +1,63 @@ name: PR Test Stage -# Reusable workflow that owns one CUDA test stage. Caller (pr-test.yml) passes -# (self_name, runner_config, runs_on, partitions, ...) and the -# per-commit/target_stage gating + matrix fanout + setup/run/teardown all live -# here. Only stage-a-test-cpu still lives inline in pr-test.yml (bespoke -# uv pip / protoc / rust-cache install path). +# Reusable workflow for one CUDA test stage. Caller pr-test.yml forwards +# `check_changes` = toJson(needs.check-changes.outputs) and +# `caller_inputs` = toJson(inputs) as bundles. `partitions` is forwarded +# separately to keep matrix expressions single-fromJson — its value is itself +# a JSON string, so reading it via `check_changes` would need double fromJson, +# and matrix can't use step-resolved values. stage-a-test-cpu stays inline in +# pr-test.yml (bespoke uv pip / protoc / rust-cache install). on: workflow_call: inputs: self_name: - description: 'Caller job key, used for $GITHUB_JOB-style gating + partitions[suite] lookup.' + description: 'Caller job key; used for partitions[suite] lookup and target_stage gating.' type: string required: true runner_config: - description: 'Looked up in scripts/ci/runner_configs.yml for install script / artifact version / install timeout.' + description: 'Key in scripts/ci/runner_configs.yml (install script / artifact version / install timeout).' type: string required: true runs_on: - description: 'Physical GHA runner label, e.g. "1-gpu-5090" or the b200_runner output from check-changes for B200 stages.' + description: 'GHA runner label. B200 stages pass needs.check-changes.outputs.b200_runner for dynamic selection.' type: string required: true - target_stage: - description: 'Forwarded from pr-test.yml inputs.target_stage (used by /rerun-stage to skip everything except the targeted stage).' + check_changes: + description: 'toJson(needs.check-changes.outputs). Read via fromJson(...).main_package / sgl_kernel / continue_on_error etc.' type: string - default: '' - test_parallel_dispatch: - description: 'Forwarded from pr-test.yml inputs.test_parallel_dispatch.' + required: true + caller_inputs: + description: 'toJson(inputs) from pr-test.yml. Read via fromJson(...).target_stage / pr_head_sha / git_ref / skip_stage_health_check / test_parallel_dispatch.' type: string - default: 'false' + required: true partitions: - description: 'JSON from check-changes (size, arr, max_parallel per suite).' + description: 'check-changes.outputs.partitions raw — kept separate to avoid double-fromJson in matrix expressions.' type: string required: true - main_package: - description: 'check-changes.outputs.main_package — gates the default per-commit run.' - type: string - required: true - sgl_kernel: - description: 'check-changes.outputs.sgl_kernel — both gates the run and forwarded to the install/download steps.' - type: string - required: true - continue_on_error_flag: - description: 'Empty or `--continue-on-error`; forwarded to run_suite.py.' - type: string - default: '' run_timeout_minutes: - description: 'Per-suite wall-clock cap (minutes), enforced via bash `timeout` around run_suite.py.' + description: 'timeout-minutes for the Run test step.' type: string default: '30' timeout_per_file: - description: 'Optional run_suite.py --timeout-per-file value.' + description: 'run_suite.py --timeout-per-file value (empty = unset).' type: string default: '' warmup_deep_gemm_models: - description: 'Space-separated `model:gpus` list. Empty = skip DeepGEMM warmup.' + description: 'Space-separated `model:gpus` list; empty skips DeepGEMM warmup.' type: string default: '' warmup_server_models: - description: 'Space-separated `model:gpus` list. Empty = skip server-CUDA-graph warmup.' + description: 'Space-separated `model:gpus` list; empty skips server-CUDA-graph warmup.' type: string default: '' warmup_timeout_minutes: - description: 'Wall-clock cap for each warmup step (DeepGEMM + server). Default 25min; bump for stages with large cold-cache warmup model lists.' + description: 'timeout-minutes for each warmup step. Bump for stages with large cold-cache model lists.' type: string default: '25' extra_pytest_path: - description: 'Optional pytest path to run after the suite (stage-b-test-4-gpu-b200 uses this for FA4 jit_kernel tests). Empty = skip.' + description: 'pytest path to run after the suite (b200 FA4 jit_kernel tests). Empty skips.' type: string default: '' - pr_head_sha: - description: 'Forwarded from pr-test.yml inputs.pr_head_sha (for /rerun-stage on fork PRs).' - type: string - default: '' - git_ref: - description: 'Forwarded from pr-test.yml inputs.git_ref (for workflow_call from main).' - type: string - default: '' - skip_stage_health_check: - description: 'Forwarded from pr-test.yml inputs.skip_stage_health_check (release branch cut bypass).' - type: boolean - default: false # Mirror pr-test.yml top-level env. Reusable workflows do NOT inherit caller's # workflow-level env across the workflow_call boundary, so anything pr-test.yml @@ -88,32 +66,30 @@ env: SGLANG_IS_IN_CI: true SGLANG_CUDA_COREDUMP: "1" SGLANG_JIT_DEEPGEMM_FAST_WARMUP: true - SKIP_STAGE_HEALTH_CHECK: ${{ inputs.skip_stage_health_check && 'true' || 'false' }} + SKIP_STAGE_HEALTH_CHECK: ${{ fromJson(inputs.caller_inputs).skip_stage_health_check && 'true' || 'false' }} FORCE_REBUILD_DEEPEP: '1' PR_TEST_BYPASS_MAINTENANCE_ON_MAIN: ${{ github.ref == 'refs/heads/main' && 'true' || 'false' }} USE_VENV: false jobs: run: - # Mirror the inline gating that used to live in pr-test.yml on every CUDA - # stage job. target_stage takes precedence; otherwise default per-commit - # gating runs the stage on schedule / parallel-dispatch / non-failed PR - # with main_package or sgl_kernel changes. + # target_stage takes precedence; otherwise default per-commit gating + # runs on schedule / parallel-dispatch / non-failed PR with main_package + # or sgl_kernel changes. if: | always() && ( - (inputs.target_stage == inputs.self_name) || + (fromJson(inputs.caller_inputs).target_stage == inputs.self_name) || ( - !inputs.target_stage && - ((github.event_name == 'schedule' || inputs.test_parallel_dispatch == 'true') || (!failure() && !cancelled())) && - (inputs.main_package == 'true' || inputs.sgl_kernel == 'true') + !fromJson(inputs.caller_inputs).target_stage && + ((github.event_name == 'schedule' || fromJson(inputs.caller_inputs).test_parallel_dispatch == true) || (!failure() && !cancelled())) && + (fromJson(inputs.check_changes).main_package == 'true' || fromJson(inputs.check_changes).sgl_kernel == 'true') ) ) runs-on: ${{ inputs.runs_on }} timeout-minutes: 240 env: - # Only stage-c-test-8-gpu-h20 needs the RDMA device list. Empty for - # everyone else (env var unset, harmless). + # Only stage-c-test-8-gpu-h20 needs the RDMA device list. SGLANG_CI_RDMA_ALL_DEVICES: ${{ inputs.runner_config == '8-gpu-h20' && 'mlx5_1,mlx5_2,mlx5_3,mlx5_4' || '' }} strategy: fail-fast: false @@ -123,7 +99,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: ${{ inputs.pr_head_sha || inputs.git_ref || github.sha }} + ref: ${{ fromJson(inputs.caller_inputs).pr_head_sha || fromJson(inputs.caller_inputs).git_ref || github.sha }} - name: Resolve runner_config id: rc @@ -134,7 +110,7 @@ jobs: - uses: ./.github/actions/check-maintenance - name: Download artifacts (v4) - if: ${{ inputs.sgl_kernel == 'true' && steps.rc.outputs.artifact_version == 'v4' }} + if: ${{ fromJson(inputs.check_changes).sgl_kernel == 'true' && steps.rc.outputs.artifact_version == 'v4' }} uses: actions/download-artifact@v4 with: path: sgl-kernel/dist/ @@ -142,7 +118,7 @@ jobs: pattern: wheel-python3.10-cuda* - name: Download artifacts (v6) - if: ${{ inputs.sgl_kernel == 'true' && steps.rc.outputs.artifact_version == 'v6' }} + if: ${{ fromJson(inputs.check_changes).sgl_kernel == 'true' && steps.rc.outputs.artifact_version == 'v6' }} uses: actions/download-artifact@v6 with: path: sgl-kernel/dist/ @@ -152,7 +128,7 @@ jobs: - name: Install dependencies timeout-minutes: ${{ fromJson(steps.rc.outputs.install_timeout) }} run: | - CUSTOM_BUILD_SGL_KERNEL=${{ inputs.sgl_kernel }} bash ${{ steps.rc.outputs.install }} + CUSTOM_BUILD_SGL_KERNEL=${{ fromJson(inputs.check_changes).sgl_kernel }} bash ${{ steps.rc.outputs.install }} - name: Warmup DeepGEMM JIT Compilation if: inputs.warmup_deep_gemm_models != '' @@ -174,7 +150,7 @@ jobs: - name: Run test timeout-minutes: ${{ fromJson(inputs.run_timeout_minutes) }} env: - CONTINUE_ON_ERROR_FLAG: ${{ inputs.continue_on_error_flag }} + CONTINUE_ON_ERROR_FLAG: ${{ fromJson(inputs.check_changes).continue_on_error == 'true' && '--continue-on-error' || '' }} run: | cd test python3 run_suite.py --hw cuda --suite ${{ inputs.self_name }} \ diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 0abbe971e..ce6ddf768 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -283,16 +283,10 @@ jobs: self_name: stage-a-test-1-gpu-small runner_config: 1-gpu-small runs_on: 1-gpu-5090 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} run_timeout_minutes: '10' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-a-test-cpu: @@ -375,15 +369,9 @@ jobs: self_name: stage-b-test-1-gpu-small runner_config: 1-gpu-small runs_on: 1-gpu-5090 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit # Runs on H100 (80GB, SM90) - tests that don't pass on 5090 (FA3, FP8, high VRAM, etc.) @@ -395,16 +383,10 @@ jobs: self_name: stage-b-test-1-gpu-large runner_config: 1-gpu-large runs_on: 1-gpu-h100 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} timeout_per_file: '1800' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-b-test-2-gpu-large: @@ -415,15 +397,9 @@ jobs: self_name: stage-b-test-2-gpu-large runner_config: 2-gpu-large runs_on: 2-gpu-h100 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-b-test-4-gpu-b200: @@ -434,17 +410,11 @@ jobs: self_name: stage-b-test-4-gpu-b200 runner_config: 4-gpu-b200 runs_on: ${{ needs.check-changes.outputs.b200_runner }} - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} run_timeout_minutes: '40' extra_pytest_path: 'python/sglang/jit_kernel/tests/test_flash_attention_4.py' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit call-multimodal-gen-tests: @@ -488,15 +458,9 @@ jobs: self_name: stage-c-test-4-gpu-h100 runner_config: 4-gpu-h100 runs_on: 4-gpu-h100 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-c-test-8-gpu-h200: @@ -507,12 +471,9 @@ jobs: self_name: stage-c-test-8-gpu-h200 runner_config: 8-gpu-h200 runs_on: 8-gpu-h200 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} # Per-model TP must match the test's launch in test/registered/ -- see # FALLBACK_ARGS in scripts/ci/cuda/warmup_deep_gemm.py for extra dp/ep # flags. Only models that actually invoke DeepGEMM kernels at runtime @@ -520,9 +481,6 @@ jobs: # Server CUDA Graph warmup is combined into this step (warmup_server_models unset). warmup_deep_gemm_models: 'deepseek-ai/DeepSeek-V3-0324:8 deepseek-ai/DeepSeek-V3.2:8 zai-org/GLM-5-FP8:8 XiaomiMiMo/MiMo-V2-Flash:4 XiaomiMiMo/MiMo-V2.5:8' warmup_timeout_minutes: '60' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-c-test-8-gpu-h20: @@ -533,15 +491,9 @@ jobs: self_name: stage-c-test-8-gpu-h20 runner_config: 8-gpu-h20 runs_on: 8-gpu-h20 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-c-test-deepep-4-gpu-h100: @@ -552,17 +504,11 @@ jobs: self_name: stage-c-test-deepep-4-gpu-h100 runner_config: deepep-4-gpu-h100 runs_on: 4-gpu-h100 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} warmup_deep_gemm_models: 'lmsys/sglang-ci-dsv3-test:4' warmup_server_models: 'lmsys/sglang-ci-dsv3-test:4' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-c-test-deepep-8-gpu-h200: @@ -573,18 +519,12 @@ jobs: self_name: stage-c-test-deepep-8-gpu-h200 runner_config: deepep-8-gpu-h200 runs_on: 8-gpu-h200-deepep - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} run_timeout_minutes: '45' warmup_deep_gemm_models: 'deepseek-ai/DeepSeek-V3-0324:8 deepseek-ai/DeepSeek-V3.2:8' warmup_server_models: 'deepseek-ai/DeepSeek-V3-0324:8' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-c-test-4-gpu-b200: @@ -595,16 +535,10 @@ jobs: self_name: stage-c-test-4-gpu-b200 runner_config: 4-gpu-b200 runs_on: ${{ needs.check-changes.outputs.b200_runner }} - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} timeout_per_file: '1800' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-c-test-dsv4-4-gpu-b200: @@ -615,16 +549,10 @@ jobs: self_name: stage-c-test-dsv4-4-gpu-b200 runner_config: dsv4-4-gpu-b200 runs_on: ${{ needs.check-changes.outputs.b200_runner }} - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} timeout_per_file: '1800' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit stage-c-test-dsv4-8-gpu-h200: @@ -635,16 +563,10 @@ jobs: self_name: stage-c-test-dsv4-8-gpu-h200 runner_config: dsv4-8-gpu-h200 runs_on: 8-gpu-h200 - target_stage: ${{ inputs.target_stage || '' }} - test_parallel_dispatch: ${{ inputs.test_parallel_dispatch == true && 'true' || 'false' }} + check_changes: ${{ toJson(needs.check-changes.outputs) }} + caller_inputs: ${{ toJson(inputs) }} partitions: ${{ needs.check-changes.outputs.partitions }} - main_package: ${{ needs.check-changes.outputs.main_package }} - sgl_kernel: ${{ needs.check-changes.outputs.sgl_kernel }} - continue_on_error_flag: ${{ needs.check-changes.outputs.continue_on_error == 'true' && '--continue-on-error' || '' }} timeout_per_file: '1800' - pr_head_sha: ${{ inputs.pr_head_sha || '' }} - git_ref: ${{ inputs.git_ref || '' }} - skip_stage_health_check: ${{ inputs.skip_stage_health_check == true }} secrets: inherit pr-test-finish: