Spaces:
Running
Running
| name: Deploy to Hugging Face Space | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - main | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Validate required secrets | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| HF_SPACE_ID: ${{ secrets.HF_SPACE_ID }} | |
| run: | | |
| test -n "$HF_TOKEN" || (echo "❌ Missing secret: HF_TOKEN" && exit 1) | |
| test -n "$HF_SPACE_ID" || (echo "❌ Missing secret: HF_SPACE_ID" && exit 1) | |
| - name: Push repository to Hugging Face Space | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| HF_SPACE_ID: ${{ secrets.HF_SPACE_ID }} | |
| run: | | |
| git config --global user.name "github-actions[bot]" | |
| git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
| git remote add hf "https://oauth2:${HF_TOKEN}@huggingface.co/spaces/${HF_SPACE_ID}" | |
| # Push and retry once on transient failure | |
| git push hf HEAD:main --force || (sleep 5 && git push hf HEAD:main --force) | |
| - name: Wake up Space (resume if paused) | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| HF_SPACE_ID: ${{ secrets.HF_SPACE_ID }} | |
| run: | | |
| # Resume the space if it is paused/sleeping | |
| RESUME_RESP=$(curl -s -o /dev/null -w "%{http_code}" \ | |
| -X POST "https://huggingface.co/api/spaces/${HF_SPACE_ID}/resume" \ | |
| -H "Authorization: Bearer ${HF_TOKEN}") | |
| echo "Resume response: $RESUME_RESP" | |
| - name: Trigger rebuild via HF Spaces API | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| HF_SPACE_ID: ${{ secrets.HF_SPACE_ID }} | |
| run: | | |
| # Explicitly request a factory-reboot so HF always triggers a fresh build | |
| RESTART_RESP=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \ | |
| -X POST "https://huggingface.co/api/spaces/${HF_SPACE_ID}/restart?factory=true" \ | |
| -H "Authorization: Bearer ${HF_TOKEN}" \ | |
| -H "Content-Type: application/json") | |
| HTTP_STATUS=$(echo "$RESTART_RESP" | grep "HTTP_STATUS" | cut -d: -f2) | |
| BODY=$(echo "$RESTART_RESP" | grep -v "HTTP_STATUS") | |
| echo "Restart response ($HTTP_STATUS): $BODY" | |
| # 200 = restarted, 401/403 = token lacks write permission | |
| if [ "$HTTP_STATUS" != "200" ]; then | |
| echo "⚠️ Restart API returned $HTTP_STATUS — build may still start from the git push alone." | |
| fi | |
| - name: Wait for build to start and report status | |
| env: | |
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | |
| HF_SPACE_ID: ${{ secrets.HF_SPACE_ID }} | |
| run: | | |
| echo "Waiting for Space build to start..." | |
| sleep 10 | |
| STATUS_JSON=$(curl -s \ | |
| "https://huggingface.co/api/spaces/${HF_SPACE_ID}/runtime" \ | |
| -H "Authorization: Bearer ${HF_TOKEN}") | |
| STAGE=$(echo "$STATUS_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('stage','unknown'))" 2>/dev/null || echo "unknown") | |
| echo "Space stage: $STAGE" | |
| case "$STAGE" in | |
| BUILDING|RUNNING|RUNNING_BUILDING) | |
| echo "✅ Build triggered successfully — stage: $STAGE" ;; | |
| PAUSED|STOPPED|ERROR|RUNTIME_ERROR) | |
| echo "⚠️ Unexpected stage: $STAGE — check the Space logs on HuggingFace." ;; | |
| *) | |
| echo "ℹ️ Stage: $STAGE" ;; | |
| esac |