CoolFace
Apppublic

hiropr/llm-code-deployment

sourceHugging Facemitupdated 11mo agoView on Hugging Face
0likes
github_utils.py153 linesDownload Raw Back to root
1import os2import subprocess3import tempfile4import time5import requests6from github import Github, GithubException7 8 9def create_and_push_repo(repo_name, files, evaluation_data=None):10    """Create or reuse a GitHub repo, push files, enable Pages, and notify evaluation endpoint."""11    token = os.getenv("GITHUB_TOKEN")12    if not token:13        raise RuntimeError("GITHUB_TOKEN not set")14 15    # Authenticate user16    user = Github(token).get_user()17    print(f"๐Ÿ” Authenticated as: {user.login}")18 19    # Try creating or reusing repo20    try:21        repo = user.create_repo(22            repo_name,23            description="Auto-generated repo for IITM LLM Deployment",24            private=False,25        )26        print(f"โœ… Created new repo: {repo.html_url}")27    except GithubException as e:28        if e.status == 422 and "name already exists" in str(e.data).lower():29            repo = user.get_repo(repo_name)30            print(f"โ™ป๏ธ Repo '{repo_name}' already exists โ€” reusing it.")31        else:32            print(f"โŒ Repo creation failed: {e.data}")33            return None, None, None34 35    # Prepare workflow for GitHub Pages36    workflow_content = """name: Deploy Pages37on:38  push:39    branches: [ main ]40permissions:41  contents: read42  pages: write43  id-token: write44concurrency:45  group: "pages"46  cancel-in-progress: true47jobs:48  deploy:49    environment:50      name: github-pages51      url: ${{ steps.deployment.outputs.page_url }}52    runs-on: ubuntu-latest53    steps:54      - name: Checkout55        uses: actions/checkout@v456      - name: Setup Pages57        uses: actions/configure-pages@v458      - name: Upload artifact59        uses: actions/upload-pages-artifact@v360        with:61          path: .62      - name: Deploy to GitHub Pages63        id: deployment64        uses: actions/deploy-pages@v465"""66    files[".github/workflows/pages.yml"] = workflow_content67 68    # --- Write files to temp dir and push ---69    try:70        with tempfile.TemporaryDirectory() as tmp:71            # Redirect HOME to prevent permission errors in Hugging Face72            os.environ["HOME"] = tmp73 74            # Write all generated files75            for name, content in files.items():76                file_path = os.path.join(tmp, name)77                os.makedirs(os.path.dirname(file_path), exist_ok=True)78                with open(file_path, "w", encoding="utf-8") as f:79                    f.write(content)80 81            subprocess.check_call(["git", "init"], cwd=tmp)82 83            # Configure local git identity (sandbox safe)84            user_login = user.login85            user_email = f"{user_login}@users.noreply.github.com"86            subprocess.check_call(["git", "config", "--local", "user.name", user_login], cwd=tmp)87            subprocess.check_call(["git", "config", "--local", "user.email", user_email], cwd=tmp)88            print(f"๐Ÿ‘ค Configured local git identity: {user_login} <{user_email}>")89 90            # Commit + push91            subprocess.check_call(["git", "add", "."], cwd=tmp)92            subprocess.check_call(["git", "commit", "-m", "Automated deployment"], cwd=tmp)93            subprocess.check_call(["git", "branch", "-M", "main"], cwd=tmp)94 95            push_url = f"https://{token}@github.com/{user.login}/{repo_name}.git"96            subprocess.check_call(["git", "remote", "add", "origin", push_url], cwd=tmp)97            subprocess.check_call(["git", "push", "-u", "origin", "main", "--force"], cwd=tmp)98 99            commit_sha = subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=tmp).decode().strip()100            print(f"โœ… Successfully pushed commit {commit_sha} to {repo.html_url}")101 102    except subprocess.CalledProcessError as e:103        print(f"โŒ Git subprocess failed: {e}")104        return None, None, None105    except Exception as e:106        print(f"โŒ Unexpected git push error: {e}")107        return None, None, None108 109    # --- Enable GitHub Pages via API ---110    pages_url = f"https://{user.login}.github.io/{repo_name}/"111    api_url = f"https://api.github.com/repos/{user.login}/{repo_name}/pages"112    headers = {113        "Authorization": f"Bearer {token}",114        "Accept": "application/vnd.github+json",115        "X-GitHub-Api-Version": "2022-11-28",116    }117 118    # Try POST (create) instead of PUT (update)119    for attempt in range(3):120        r = requests.post(api_url, headers=headers, json={"source": {"branch": "main", "path": "/"}}, timeout=15)121        if r.status_code in (201, 204):122            print(f"โœ… Pages enabled successfully (attempt {attempt + 1})")123            break124        elif r.status_code == 409:125            print(f"โš ๏ธ Pages already exists (409) โ€” continuing.")126            break127        else:128            print(f"Attempt {attempt + 1}: Pages enablement failed ({r.status_code}) โ€” {r.text}")129            time.sleep(5)130    else:131        print("โŒ Could not enable GitHub Pages after 3 attempts.")132 133    # --- Notify evaluation server if applicable ---134    if evaluation_data:135        payload = {136            "email": evaluation_data["email"],137            "task": evaluation_data["task"],138            "round": evaluation_data["round"],139            "nonce": evaluation_data["nonce"],140            "repo_url": repo.html_url if repo else "",141            "commit_sha": commit_sha if repo else "",142            "pages_url": pages_url,143        }144        try:145            res = requests.post(evaluation_data["evaluation_url"], json=payload, timeout=10)146            print(f"๐Ÿ“จ Evaluation POST โ†’ {res.status_code}")147        except Exception as e:148            print(f"โš ๏ธ Evaluation callback failed: {e}")149 150    print(f"โœ… Repo ready: {repo.html_url}")151    print(f"๐Ÿ”— Pages URL: {pages_url}")152    return repo.html_url, commit_sha, pages_url153