name: Release Documentation

on:
  release:
    types: [published]
  push:
    branches:
      - main
    paths:
      - "docs/**"
      - "python/sglang/version.py"
      - "python/sglang/**"
  workflow_dispatch:

concurrency:
  group: release-docs-${{ github.ref }}
  cancel-in-progress: true

env:
  SGLANG_IS_IN_CI: true

jobs:
  execute-and-deploy:
    runs-on: 1-gpu-h100
    if: github.repository == 'sgl-project/sglang'
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Fetch full git history for release index
        if: github.event_name == 'release'
        run: |
          git fetch --prune --unshallow || git fetch --prune --depth=0

      - name: Install dependencies
        run: |
          bash scripts/ci/cuda/ci_install_dependency.sh
          pip install -r docs/requirements.txt
          apt-get update && apt-get install -y pandoc parallel retry
          ln -sf "$(which python3)" /usr/bin/python

      - name: Setup Jupyter Kernel
        run: |
          python -m ipykernel install --user --name python3 --display-name "Python 3"

      - name: Execute notebooks
        timeout-minutes: 40
        run: |
          cd docs
          make clean
          make compile

      - name: Push HTML to sgl-project.github.io
        timeout-minutes: 30
        env:
          GITHUB_TOKEN: ${{ secrets.GH_PAT_FOR_DOCUMENTATION }}
        run: |
          cd docs
          make html
          make markdown
          python3 wrap_run_llm.py

          if [[ "${{ github.event_name }}" == "release" ]]; then
            python3 release_lookup/generate_index.py --output release_lookup/release_index.json

            # Copy release lookup tool for official docs on published releases.
            mkdir -p _build/html/release_lookup
            cp release_lookup/index.html _build/html/release_lookup/
            cp release_lookup/release_index.json _build/html/release_lookup/
          fi

          cd _build/html

          git clone https://$GITHUB_TOKEN@github.com/sgl-project/sgl-project.github.io.git ../sgl-project.github.io --depth 1
          if [[ "${{ github.event_name }}" == "release" ]]; then
            find ../sgl-project.github.io/ -mindepth 1 -not -path "../sgl-project.github.io/.git*" -not -name CNAME -not -name ".jekyll" -not -name ".nojekyll" -delete
          else
            find ../sgl-project.github.io/ -mindepth 1 -not -path "../sgl-project.github.io/.git*" -not -path "../sgl-project.github.io/release_lookup*" -not -name CNAME -not -name ".jekyll" -not -name ".nojekyll" -delete
          fi
          cp -r * ../sgl-project.github.io
          cp ../../README.md ../sgl-project.github.io/README.md
          cd ../sgl-project.github.io
          git config user.name "sglang-bot"
          git config user.email "sglangbot@gmail.com"
          git add .
          git commit -m "Update $(date +'%Y-%m-%d %H:%M:%S')"
          git push https://$GITHUB_TOKEN@github.com/sgl-project/sgl-project.github.io.git main
          cd ..
          rm -rf sgl-project.github.io
