hiropr/llm-code-deployment
0
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 