jeuko's picture
Sync from GitHub (main)
8018595 verified
#!/usr/bin/env python3
"""
Sync secrets from GitHub Actions to HuggingFace Space.
Reads configuration from environment variables:
HF_SPACE: HuggingFace Space repository ID (e.g., "InstaDeepAI/sentinel")
HF_TOKEN: HuggingFace API token
RUNTIME_SECRETS: Multi-line string with secrets in format "KEY: value"
"""
import logging
import os
from huggingface_hub import HfApi
# Configure logging
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
def extract(payload):
"""Parse secrets from YAML-like format.
Args:
payload: Multi-line string with secrets in format "KEY: value"
Returns:
Dictionary mapping secret keys to values
"""
secrets = {}
if not payload:
return secrets
for line in payload.strip().split("\n"):
line = line.strip()
if ":" in line and line:
key, value = line.split(":", 1)
key = key.strip()
value = value.strip()
if key and value: # Only add if both key and value are non-empty
secrets[key] = value
return secrets
def upload(repository, token, payload):
"""Sync secrets to HuggingFace Space.
Args:
repository: HuggingFace Space repository ID
token: HuggingFace API token
payload: Multi-line string with secrets in format "KEY: value"
Raises:
RuntimeError: If any secret fails to sync
"""
client = HfApi(token=token)
secrets = extract(payload)
if not secrets:
logging.info("No runtime secrets to configure")
return
count = 0
for key, value in secrets.items():
try:
client.add_space_secret(repo_id=repository, key=key, value=value)
logging.info("Added %s secret to HuggingFace Space", key)
count += 1
except Exception as e:
logging.error("Failed to add %s: %s", key, e)
raise RuntimeError(f"Failed to sync secret {key}") from e
logging.info("Successfully configured %d secret(s)", count)
if __name__ == "__main__":
# Read configuration from environment variables
repository = os.getenv("HF_SPACE")
token = os.getenv("HF_TOKEN")
payload = os.getenv("RUNTIME_SECRETS", "")
# Validate required environment variables
if not repository:
raise ValueError("HF_SPACE environment variable is required")
if not token:
raise ValueError("HF_TOKEN environment variable is required")
# Run the sync - any exceptions will naturally exit with code 1
upload(repository, token, payload)