Fix rerun stage command with merged commit history (#17960)
This commit is contained in:
+110
-11
@@ -72,10 +72,16 @@ jobs:
|
|||||||
check-changes:
|
check-changes:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
main_package: ${{ steps.filter.outputs.main_package || steps.run-mode.outputs.run_all_tests }}
|
# Use API-based detection for target_stage mode (filter-api), otherwise use dorny/paths-filter (filter)
|
||||||
sgl_kernel: ${{ steps.filter.outputs.sgl_kernel }} # sgl-kernel tests only run when kernels are rebuilt
|
main_package: ${{ steps.filter-api.outputs.main_package || steps.filter.outputs.main_package || steps.run-mode.outputs.run_all_tests }}
|
||||||
jit_kernel: ${{ steps.filter.outputs.jit_kernel || steps.run-mode.outputs.run_all_tests }}
|
# sgl_kernel is forced to false when target_stage is set, since sgl-kernel-build-wheels won't run
|
||||||
multimodal_gen: ${{ steps.filter.outputs.multimodal_gen || steps.run-mode.outputs.run_all_tests }}
|
# This prevents CUSTOM_BUILD_SGL_KERNEL=true when the wheel artifacts aren't available
|
||||||
|
# Note: If PR has kernel changes AND target_stage is set, the validate-target-stage step will fail
|
||||||
|
sgl_kernel: ${{ !inputs.target_stage && (steps.filter-api.outputs.sgl_kernel || steps.filter.outputs.sgl_kernel) }}
|
||||||
|
# Raw sgl_kernel value before target_stage override (used for validation)
|
||||||
|
sgl_kernel_raw: ${{ steps.filter-api.outputs.sgl_kernel || steps.filter.outputs.sgl_kernel }}
|
||||||
|
jit_kernel: ${{ steps.filter-api.outputs.jit_kernel || steps.filter.outputs.jit_kernel || steps.run-mode.outputs.run_all_tests }}
|
||||||
|
multimodal_gen: ${{ steps.filter-api.outputs.multimodal_gen || steps.filter.outputs.multimodal_gen || steps.run-mode.outputs.run_all_tests }}
|
||||||
max_parallel: ${{ steps.set-parallel.outputs.max_parallel }}
|
max_parallel: ${{ steps.set-parallel.outputs.max_parallel }}
|
||||||
b200_runner: ${{ steps.set-runner.outputs.b200_runner }}
|
b200_runner: ${{ steps.set-runner.outputs.b200_runner }}
|
||||||
enable_retry: ${{ steps.set-retry.outputs.enable_retry }}
|
enable_retry: ${{ steps.set-retry.outputs.enable_retry }}
|
||||||
@@ -102,7 +108,9 @@ jobs:
|
|||||||
- name: Detect file changes
|
- name: Detect file changes
|
||||||
id: filter
|
id: filter
|
||||||
uses: dorny/paths-filter@v3
|
uses: dorny/paths-filter@v3
|
||||||
if: steps.run-mode.outputs.run_all_tests != 'true'
|
# Only use paths-filter for pull_request events (where it works correctly)
|
||||||
|
# For workflow_dispatch with target_stage, we use GitHub API in the next step
|
||||||
|
if: steps.run-mode.outputs.run_all_tests != 'true' && !inputs.target_stage
|
||||||
with:
|
with:
|
||||||
filters: |
|
filters: |
|
||||||
main_package:
|
main_package:
|
||||||
@@ -124,6 +132,70 @@ jobs:
|
|||||||
- "python/pyproject.toml"
|
- "python/pyproject.toml"
|
||||||
- ".github/workflows/pr-test.yml"
|
- ".github/workflows/pr-test.yml"
|
||||||
|
|
||||||
|
# For /rerun-stage (workflow_dispatch with target_stage), dorny/paths-filter doesn't work
|
||||||
|
# correctly because it falls back to "last commit" detection which breaks for merge commits.
|
||||||
|
# Instead, we use the GitHub API to compare the PR commit against main.
|
||||||
|
- name: Detect file changes via API (for target_stage)
|
||||||
|
id: filter-api
|
||||||
|
if: inputs.target_stage && inputs.pr_head_sha
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
echo "Detecting file changes via GitHub API for target_stage mode..."
|
||||||
|
echo "PR head SHA: ${{ inputs.pr_head_sha }}"
|
||||||
|
|
||||||
|
# Get the list of changed files by comparing PR commit against main
|
||||||
|
# This correctly handles merge commits by looking at the actual PR diff
|
||||||
|
CHANGED_FILES=$(gh api "repos/${{ github.repository }}/compare/main...${{ inputs.pr_head_sha }}" \
|
||||||
|
--jq '[.files[].filename] | .[]' 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
if [ -z "$CHANGED_FILES" ]; then
|
||||||
|
echo "Warning: Could not fetch changed files from API, assuming no changes"
|
||||||
|
echo "sgl_kernel=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "main_package=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "jit_kernel=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "multimodal_gen=false" >> $GITHUB_OUTPUT
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Changed files:"
|
||||||
|
echo "$CHANGED_FILES" | head -20
|
||||||
|
echo "..."
|
||||||
|
|
||||||
|
# Check for sgl-kernel changes
|
||||||
|
if echo "$CHANGED_FILES" | grep -q "^sgl-kernel/"; then
|
||||||
|
echo "sgl_kernel=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "Detected sgl-kernel changes"
|
||||||
|
else
|
||||||
|
echo "sgl_kernel=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for main_package changes (excluding multimodal_gen)
|
||||||
|
# Note: Need to filter out multimodal_gen before checking, not pipe grep -q output
|
||||||
|
MAIN_PKG_FILES=$(echo "$CHANGED_FILES" | grep -E "^(python/sglang/|python/pyproject\.toml|scripts/ci/cuda/|scripts/ci/utils/|test/|\.github/workflows/pr-test\.yml)" | grep -v "^python/sglang/multimodal_gen/" || true)
|
||||||
|
if [ -n "$MAIN_PKG_FILES" ]; then
|
||||||
|
echo "main_package=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "Detected main_package changes"
|
||||||
|
else
|
||||||
|
echo "main_package=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for jit_kernel changes
|
||||||
|
if echo "$CHANGED_FILES" | grep -qE "^(python/sglang/jit_kernel/|python/pyproject\.toml|\.github/workflows/pr-test\.yml)"; then
|
||||||
|
echo "jit_kernel=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "Detected jit_kernel changes"
|
||||||
|
else
|
||||||
|
echo "jit_kernel=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for multimodal_gen changes
|
||||||
|
if echo "$CHANGED_FILES" | grep -qE "^(python/sglang/multimodal_gen/|python/sglang/cli/|python/pyproject\.toml|\.github/workflows/pr-test\.yml)"; then
|
||||||
|
echo "multimodal_gen=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "Detected multimodal_gen changes"
|
||||||
|
else
|
||||||
|
echo "multimodal_gen=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Set max-parallel based on run type
|
- name: Set max-parallel based on run type
|
||||||
id: set-parallel
|
id: set-parallel
|
||||||
run: |
|
run: |
|
||||||
@@ -142,8 +214,12 @@ jobs:
|
|||||||
- name: Set B200 runner tag
|
- name: Set B200 runner tag
|
||||||
id: set-runner
|
id: set-runner
|
||||||
run: |
|
run: |
|
||||||
sgl_kernel="${{ steps.filter.outputs.sgl_kernel || steps.run-mode.outputs.run_all_tests }}"
|
# Use kernel-build runner only when sgl_kernel changes are detected AND we're not in target_stage mode
|
||||||
if [[ "$sgl_kernel" == "true" ]]; then
|
# (target_stage skips wheel builds, so we can't use custom kernels)
|
||||||
|
# Use API-based detection (filter-api) for target_stage mode, otherwise use dorny/paths-filter (filter)
|
||||||
|
sgl_kernel="${{ steps.filter-api.outputs.sgl_kernel || steps.filter.outputs.sgl_kernel || steps.run-mode.outputs.run_all_tests }}"
|
||||||
|
target_stage="${{ inputs.target_stage }}"
|
||||||
|
if [[ "$sgl_kernel" == "true" && -z "$target_stage" ]]; then
|
||||||
echo "b200_runner=4-gpu-b200-kernel" >> $GITHUB_OUTPUT
|
echo "b200_runner=4-gpu-b200-kernel" >> $GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
echo "b200_runner=4-gpu-b200" >> $GITHUB_OUTPUT
|
echo "b200_runner=4-gpu-b200" >> $GITHUB_OUTPUT
|
||||||
@@ -166,6 +242,26 @@ jobs:
|
|||||||
echo "Filtered run, continue-on-error disabled"
|
echo "Filtered run, continue-on-error disabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: Validate target_stage with kernel changes
|
||||||
|
# Use API-based detection (filter-api) for target_stage mode, otherwise use dorny/paths-filter (filter)
|
||||||
|
if: inputs.target_stage && (steps.filter-api.outputs.sgl_kernel == 'true' || steps.filter.outputs.sgl_kernel == 'true')
|
||||||
|
run: |
|
||||||
|
echo "::error::Cannot use /rerun-stage when PR has sgl-kernel changes."
|
||||||
|
echo "::error::The sgl-kernel-build-wheels job is skipped in target_stage mode, but this PR modifies sgl-kernel/ files."
|
||||||
|
echo "::error::Please use /tag-and-rerun-ci to run the full workflow including kernel builds."
|
||||||
|
echo ""
|
||||||
|
echo "ERROR: Cannot use /rerun-stage when PR has sgl-kernel changes."
|
||||||
|
echo ""
|
||||||
|
echo "This PR modifies files in sgl-kernel/, which requires building custom kernel wheels."
|
||||||
|
echo "The /rerun-stage command skips the wheel build job, so the test would run against"
|
||||||
|
echo "the wrong (PyPI) version of sgl-kernel instead of your changes."
|
||||||
|
echo ""
|
||||||
|
echo "To properly test your kernel changes, use one of these commands instead:"
|
||||||
|
echo " /tag-and-rerun-ci - Re-run the full workflow including kernel builds"
|
||||||
|
echo " /rerun-ci - Re-run the full workflow"
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
|
||||||
- name: Show filter results in summary (table)
|
- name: Show filter results in summary (table)
|
||||||
run: |
|
run: |
|
||||||
{
|
{
|
||||||
@@ -173,10 +269,13 @@ jobs:
|
|||||||
echo ""
|
echo ""
|
||||||
echo "| Component | Changed |"
|
echo "| Component | Changed |"
|
||||||
echo "|-------------------|---------|"
|
echo "|-------------------|---------|"
|
||||||
echo "| main_package | ${{ steps.filter.outputs.main_package || steps.run-mode.outputs.run_all_tests }} |"
|
echo "| main_package | ${{ steps.filter-api.outputs.main_package || steps.filter.outputs.main_package || steps.run-mode.outputs.run_all_tests }} |"
|
||||||
echo "| sgl_kernel | ${{ steps.filter.outputs.sgl_kernel || steps.run-mode.outputs.run_all_tests }} |"
|
echo "| sgl_kernel (raw) | ${{ steps.filter-api.outputs.sgl_kernel || steps.filter.outputs.sgl_kernel }} |"
|
||||||
echo "| jit_kernel | ${{ steps.filter.outputs.jit_kernel || steps.run-mode.outputs.run_all_tests }} |"
|
echo "| sgl_kernel (used) | ${{ !inputs.target_stage && (steps.filter-api.outputs.sgl_kernel || steps.filter.outputs.sgl_kernel) }} |"
|
||||||
echo "| multimodal_gen | ${{ steps.filter.outputs.multimodal_gen || steps.run-mode.outputs.run_all_tests }} |"
|
echo "| jit_kernel | ${{ steps.filter-api.outputs.jit_kernel || steps.filter.outputs.jit_kernel || steps.run-mode.outputs.run_all_tests }} |"
|
||||||
|
echo "| multimodal_gen | ${{ steps.filter-api.outputs.multimodal_gen || steps.filter.outputs.multimodal_gen || steps.run-mode.outputs.run_all_tests }} |"
|
||||||
|
echo "| target_stage | ${{ inputs.target_stage || '(none)' }} |"
|
||||||
|
echo "| detection_method | ${{ inputs.target_stage && 'GitHub API' || 'dorny/paths-filter' }} |"
|
||||||
echo "| max_parallel | ${{ steps.set-parallel.outputs.max_parallel }} |"
|
echo "| max_parallel | ${{ steps.set-parallel.outputs.max_parallel }} |"
|
||||||
echo "| b200_runner | ${{ steps.set-runner.outputs.b200_runner }} |"
|
echo "| b200_runner | ${{ steps.set-runner.outputs.b200_runner }} |"
|
||||||
echo "| enable_retry | ${{ steps.set-retry.outputs.enable_retry }} |"
|
echo "| enable_retry | ${{ steps.set-retry.outputs.enable_retry }} |"
|
||||||
|
|||||||
Reference in New Issue
Block a user