| |
| """Deploy the current repository to a single HuggingFace Space. |
| |
| Intended to be called from CI (see ``.github/workflows/deploy_spaces.yml``), |
| one invocation per matrix entry so that deployments run in parallel. |
| |
| Environment variables: |
| |
| * ``HF_TOKEN`` -- HuggingFace access token (required). |
| * ``HF_USERNAME`` -- HuggingFace username/organisation (required). |
| * ``SPACE_NAME`` -- Target Space name (required). |
| * ``SPACE_SDK`` -- Space SDK, defaults to ``streamlit``. |
| """ |
|
|
| from __future__ import annotations |
|
|
| import os |
| import sys |
|
|
| from huggingface_hub import HfApi, create_repo |
|
|
|
|
| IGNORE_PATTERNS = [ |
| ".git/*", |
| ".github/*", |
| "*.pyc", |
| "__pycache__/*", |
| ".env", |
| "venv/*", |
| ".venv/*", |
| ] |
|
|
|
|
| def _require(name: str) -> str: |
| value = os.environ.get(name) |
| if not value: |
| print(f"ERROR: {name} is not set", file=sys.stderr) |
| sys.exit(1) |
| return value |
|
|
|
|
| def main() -> int: |
| token = _require("HF_TOKEN") |
| username = _require("HF_USERNAME") |
| space_name = _require("SPACE_NAME") |
| sdk = os.environ.get("SPACE_SDK", "streamlit") |
|
|
| repo_id = f"{username}/{space_name}" |
| api = HfApi(token=token) |
|
|
| try: |
| create_repo( |
| repo_id=repo_id, |
| token=token, |
| repo_type="space", |
| space_sdk=sdk, |
| private=False, |
| ) |
| print(f"Created space: {repo_id}") |
| except Exception as exc: |
| if "already exists" in str(exc).lower(): |
| print(f"Space {repo_id} already exists") |
| else: |
| raise |
|
|
| api.upload_folder( |
| folder_path=".", |
| path_in_repo="", |
| repo_id=repo_id, |
| repo_type="space", |
| commit_message="Deploy from GitHub Actions", |
| ignore_patterns=IGNORE_PATTERNS, |
| ) |
|
|
| print(f"Deployed to: https://huggingface.co/spaces/{repo_id}") |
| return 0 |
|
|
|
|
| if __name__ == "__main__": |
| sys.exit(main()) |
|
|