# Nightly release workflow for SGLang Router name: Nightly Release SGLang Router to PyPI on: schedule: # Run at 2 AM UTC every day - cron: '0 2 * * *' workflow_dispatch: # Allow manual trigger jobs: build: name: build on ${{ matrix.platform || matrix.os }} (${{ matrix.target }} - ${{ matrix.manylinux || 'auto' }}) runs-on: ${{ matrix.os }}-latest strategy: fail-fast: false matrix: os: [ubuntu, macos, windows] target: [x86_64, aarch64] manylinux: [auto] include: - os: ubuntu platform: linux - os: windows ls: dir target: x86_64 python-architecture: x64 interpreter: 3.9 3.10 3.11 3.12 3.13 - os: macos target: aarch64 interpreter: 3.9 3.10 3.11 3.12 3.13 - os: ubuntu platform: linux target: aarch64 # musllinux - os: ubuntu platform: linux target: x86_64 manylinux: musllinux_1_1 - os: ubuntu platform: linux target: aarch64 manylinux: musllinux_1_1 exclude: - os: windows target: aarch64 steps: - uses: actions/checkout@v4 with: path: sglang-repo - name: Move sgl-router folder to root and delete sglang-repo run: | mv sglang-repo/sgl-router/* . rm -rf sglang-repo ls -alt shell: bash - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.13" architecture: ${{ matrix.python-architecture || 'x64' }} - name: Modify version for nightly release run: | # Get current version from pyproject.toml CURRENT_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])" 2>/dev/null || python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])") # Create nightly version with date: e.g., 0.2.1.dev20250128 NIGHTLY_VERSION="${CURRENT_VERSION}.dev$(date +%Y%m%d)" echo "Nightly version: $NIGHTLY_VERSION" # Update pyproject.toml with nightly version (temporary, not committed) sed -i.bak "s/version = \"${CURRENT_VERSION}\"/version = \"${NIGHTLY_VERSION}\"/" pyproject.toml # Verify the change cat pyproject.toml | grep "^version" shell: bash - name: Install twine and tomli run: pip install -U twine tomli - name: Install protoc (macOS) if: matrix.os == 'macos' run: brew install protobuf - name: Install protoc (Windows) if: matrix.os == 'windows' run: choco install protoc -y - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} manylinux: ${{ matrix.manylinux || 'auto' }} args: --release --out dist --features vendored-openssl --interpreter ${{ matrix.interpreter || '3.9 3.10 3.11 3.12 3.13 3.14' }} rust-toolchain: stable docker-options: -e CI -e CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc -e CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++ before-script-linux: | # Install build dependencies (perl/make for vendored OpenSSL, protoc for gRPC) if command -v yum &> /dev/null; then yum update -y && yum install -y wget unzip gcc gcc-c++ perl-core make # Install cross-compilation toolchain for aarch64 if needed if [ "${{ matrix.target }}" = "aarch64" ]; then yum install -y gcc-aarch64-linux-gnu gcc-c++-aarch64-linux-gnu || true fi elif command -v apt-get &> /dev/null; then apt-get update && apt-get install -y wget unzip gcc g++ perl make # Install cross-compilation toolchain for aarch64 if needed if [ "${{ matrix.target }}" = "aarch64" ]; then apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu || true fi fi (cd /tmp && \ wget https://github.com/protocolbuffers/protobuf/releases/download/v32.0/protoc-32.0-linux-x86_64.zip && \ unzip protoc-32.0-linux-x86_64.zip -d /usr/local && \ rm protoc-32.0-linux-x86_64.zip) protoc --version - name: List built packages run: ${{ matrix.ls || 'ls -lh' }} dist/ - name: Check packages run: twine check --strict dist/* - uses: actions/upload-artifact@v4 with: name: packages-${{ matrix.os }}-${{ matrix.target }}-${{ matrix.manylinux || 'auto' }} path: dist/ build-sdist: name: Build SDist runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: path: sglang-repo - name: Move sgl-router folder to root and delete sglang-repo run: | mv sglang-repo/sgl-router/* . rm -rf sglang-repo ls -alt - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.13" - name: Modify version for nightly release run: | # Get current version from pyproject.toml CURRENT_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])" 2>/dev/null || python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])") # Create nightly version with date: e.g., 0.2.1.dev20250128 NIGHTLY_VERSION="${CURRENT_VERSION}.dev$(date +%Y%m%d)" echo "Nightly version: $NIGHTLY_VERSION" # Update pyproject.toml with nightly version (temporary, not committed) sed -i "s/version = \"${CURRENT_VERSION}\"/version = \"${NIGHTLY_VERSION}\"/" pyproject.toml # Verify the change cat pyproject.toml | grep "^version" - name: Build SDist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist rust-toolchain: stable - uses: actions/upload-artifact@v4 with: name: sdist path: dist/*.tar.gz upload: name: Upload to TestPyPI if: github.repository == 'sgl-project/sglang' # Ensure this job only runs for the sgl-project/sglang repository needs: [build, build-sdist] runs-on: ubuntu-latest steps: - uses: actions/download-artifact@v4 with: path: dist merge-multiple: true - name: Upload to TestPyPI env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.TEST_PYPI_TOKEN_ROUTER }} run: | pip install twine twine upload --repository testpypi dist/* --verbose