196 lines
7.7 KiB
YAML
196 lines
7.7 KiB
YAML
name: PR Test Extra
|
|
# Label-gated CI for nightly-class tests opted into a per-PR run.
|
|
#
|
|
# Adds runtime to a PR only when the author asks for it: pull_request
|
|
# events bail unless the PR carries the `run-ci-extra` label. The same job
|
|
# graph runs unconditionally on workflow_dispatch / workflow_call so it
|
|
# can be triggered manually or chained from another workflow.
|
|
#
|
|
# Stages: extra-a (1-/2-gpu) and extra-b (4-/8-gpu) caller stubs reuse
|
|
# `_pr-test-stage.yml` and `_pr-test-check-changes.yml` from pr-test.yml.
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [main]
|
|
workflow_dispatch:
|
|
inputs:
|
|
force_continue_on_error:
|
|
description: "Force continue-on-error (test scheduled CI behavior)"
|
|
required: false
|
|
type: boolean
|
|
default: false
|
|
test_parallel_dispatch:
|
|
description: "Test parallel dispatch behavior (simulates scheduled run)"
|
|
required: false
|
|
type: boolean
|
|
default: false
|
|
workflow_call:
|
|
inputs:
|
|
git_ref:
|
|
description: 'Git ref (branch, tag, or SHA) to test. If not provided, uses the default branch.'
|
|
required: false
|
|
type: string
|
|
default: ''
|
|
run_all_tests:
|
|
description: "Run all tests (for releasing or testing purpose)"
|
|
required: false
|
|
type: boolean
|
|
default: false
|
|
skip_pr_test_health_check:
|
|
description: "Skip PR test health check fast-fail (e.g. for release branch cuts)"
|
|
required: false
|
|
type: boolean
|
|
default: false
|
|
|
|
concurrency:
|
|
group: pr-test-extra-${{ github.event_name }}-${{ github.head_ref || github.ref_name || 'default' }}-${{ inputs.git_ref || 'all' }}
|
|
cancel-in-progress: ${{ github.event_name != 'workflow_call' }}
|
|
|
|
env:
|
|
SGLANG_IS_IN_CI: true
|
|
SGLANG_CUDA_COREDUMP: "1"
|
|
SGLANG_JIT_DEEPGEMM_FAST_WARMUP: true
|
|
SKIP_PR_TEST_HEALTH_CHECK: ${{ (inputs.skip_pr_test_health_check == true || inputs.run_all_tests == true) && 'true' || 'false' }}
|
|
FORCE_REBUILD_DEEPEP: '1'
|
|
PR_TEST_BYPASS_MAINTENANCE_ON_MAIN: ${{ github.ref == 'refs/heads/main' && 'true' || 'false' }}
|
|
USE_VENV: false
|
|
|
|
permissions:
|
|
actions: write
|
|
contents: read
|
|
issues: read
|
|
pull-requests: read
|
|
|
|
jobs:
|
|
# =============================================== check changes ====================================================
|
|
# Label gate: pull_request events only proceed when the PR carries BOTH
|
|
# `run-ci` and `run-ci-extra` labels — `run-ci` is the basic-CI prerequisite
|
|
# (matching pr-test.yml's pr-gate `require-run-ci`) and `run-ci-extra` is the
|
|
# explicit opt-in to this workflow. Other event types
|
|
# (workflow_dispatch / workflow_call) always run. When this job is
|
|
# skipped by the gate, every downstream caller stub naturally skips
|
|
# because its needs do not resolve.
|
|
check-changes:
|
|
if: |
|
|
github.event_name != 'pull_request' ||
|
|
(
|
|
contains(github.event.pull_request.labels.*.name, 'run-ci') &&
|
|
contains(github.event.pull_request.labels.*.name, 'run-ci-extra')
|
|
)
|
|
uses: ./.github/workflows/_pr-test-check-changes.yml
|
|
with:
|
|
git_ref: ${{ inputs.git_ref || '' }}
|
|
run_all_tests: ${{ inputs.run_all_tests == true }}
|
|
force_continue_on_error: ${{ inputs.force_continue_on_error == true }}
|
|
pr_test_yml: '.github/workflows/pr-test-extra.yml'
|
|
secrets: inherit
|
|
|
|
# =============================================== sgl-kernel ====================================================
|
|
sgl-kernel-build-wheels:
|
|
needs: check-changes
|
|
if: |
|
|
needs.check-changes.result == 'success' &&
|
|
needs.check-changes.outputs.sgl_kernel == 'true'
|
|
uses: ./.github/workflows/_pr-test-sgl-kernel-build.yml
|
|
with:
|
|
runs_on: x64-kernel-build-node
|
|
job_display_name: Build Wheel
|
|
git_ref: ${{ inputs.git_ref || '' }}
|
|
skip_pr_test_health_check: ${{ inputs.skip_pr_test_health_check == true }}
|
|
secrets: inherit
|
|
|
|
# =============================================== extra-a (1-/2-gpu) ===============================================
|
|
extra-a-test-1-gpu-small:
|
|
needs: [check-changes, sgl-kernel-build-wheels]
|
|
if: ${{ !failure() && !cancelled() && needs.check-changes.result == 'success' }}
|
|
uses: ./.github/workflows/_pr-test-stage.yml
|
|
with:
|
|
self_name: extra-a-test-1-gpu-small
|
|
runner_config: 1-gpu-small
|
|
check_changes: ${{ toJson(needs.check-changes.outputs) }}
|
|
caller_inputs: ${{ toJson(inputs) }}
|
|
partitions: ${{ needs.check-changes.outputs.partitions }}
|
|
run_timeout_minutes: '60'
|
|
secrets: inherit
|
|
|
|
extra-a-test-1-gpu-large:
|
|
needs: [check-changes, sgl-kernel-build-wheels]
|
|
if: ${{ !failure() && !cancelled() && needs.check-changes.result == 'success' }}
|
|
uses: ./.github/workflows/_pr-test-stage.yml
|
|
with:
|
|
self_name: extra-a-test-1-gpu-large
|
|
runner_config: 1-gpu-large
|
|
check_changes: ${{ toJson(needs.check-changes.outputs) }}
|
|
caller_inputs: ${{ toJson(inputs) }}
|
|
partitions: ${{ needs.check-changes.outputs.partitions }}
|
|
run_timeout_minutes: '60'
|
|
timeout_per_file: '1800'
|
|
secrets: inherit
|
|
|
|
extra-a-test-2-gpu-large:
|
|
needs: [check-changes, sgl-kernel-build-wheels]
|
|
if: ${{ !failure() && !cancelled() && needs.check-changes.result == 'success' }}
|
|
uses: ./.github/workflows/_pr-test-stage.yml
|
|
with:
|
|
self_name: extra-a-test-2-gpu-large
|
|
runner_config: 2-gpu-large
|
|
check_changes: ${{ toJson(needs.check-changes.outputs) }}
|
|
caller_inputs: ${{ toJson(inputs) }}
|
|
partitions: ${{ needs.check-changes.outputs.partitions }}
|
|
run_timeout_minutes: '60'
|
|
secrets: inherit
|
|
|
|
# =============================================== extra-b (4-/8-gpu) ===============================================
|
|
extra-b-test-4-gpu-h100:
|
|
needs: [check-changes, sgl-kernel-build-wheels]
|
|
if: ${{ !failure() && !cancelled() && needs.check-changes.result == 'success' }}
|
|
uses: ./.github/workflows/_pr-test-stage.yml
|
|
with:
|
|
self_name: extra-b-test-4-gpu-h100
|
|
runner_config: 4-gpu-h100
|
|
check_changes: ${{ toJson(needs.check-changes.outputs) }}
|
|
caller_inputs: ${{ toJson(inputs) }}
|
|
partitions: ${{ needs.check-changes.outputs.partitions }}
|
|
run_timeout_minutes: '60'
|
|
secrets: inherit
|
|
|
|
extra-b-test-4-gpu-b200:
|
|
needs: [check-changes, sgl-kernel-build-wheels]
|
|
if: ${{ !failure() && !cancelled() && needs.check-changes.result == 'success' }}
|
|
uses: ./.github/workflows/_pr-test-stage.yml
|
|
with:
|
|
self_name: extra-b-test-4-gpu-b200
|
|
runner_config: 4-gpu-b200
|
|
check_changes: ${{ toJson(needs.check-changes.outputs) }}
|
|
caller_inputs: ${{ toJson(inputs) }}
|
|
partitions: ${{ needs.check-changes.outputs.partitions }}
|
|
run_timeout_minutes: '60'
|
|
timeout_per_file: '1800'
|
|
secrets: inherit
|
|
|
|
extra-b-test-8-gpu-h200:
|
|
needs: [check-changes, sgl-kernel-build-wheels]
|
|
if: ${{ !failure() && !cancelled() && needs.check-changes.result == 'success' }}
|
|
uses: ./.github/workflows/_pr-test-stage.yml
|
|
with:
|
|
self_name: extra-b-test-8-gpu-h200
|
|
runner_config: 8-gpu-h200
|
|
check_changes: ${{ toJson(needs.check-changes.outputs) }}
|
|
caller_inputs: ${{ toJson(inputs) }}
|
|
partitions: ${{ needs.check-changes.outputs.partitions }}
|
|
run_timeout_minutes: '60'
|
|
secrets: inherit
|
|
|
|
extra-b-test-deepep-8-gpu-h200:
|
|
needs: [check-changes, sgl-kernel-build-wheels]
|
|
if: ${{ !failure() && !cancelled() && needs.check-changes.result == 'success' }}
|
|
uses: ./.github/workflows/_pr-test-stage.yml
|
|
with:
|
|
self_name: extra-b-test-deepep-8-gpu-h200
|
|
runner_config: deepep-8-gpu-h200
|
|
check_changes: ${{ toJson(needs.check-changes.outputs) }}
|
|
caller_inputs: ${{ toJson(inputs) }}
|
|
partitions: ${{ needs.check-changes.outputs.partitions }}
|
|
run_timeout_minutes: '60'
|
|
secrets: inherit
|