mirror of
				https://github.com/datahub-project/datahub.git
				synced 2025-11-04 12:51:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			151 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import contextlib
 | 
						|
import json
 | 
						|
import os
 | 
						|
import pathlib
 | 
						|
import shutil
 | 
						|
import subprocess
 | 
						|
from datetime import datetime, timezone
 | 
						|
 | 
						|
PYTHON_BUILD_DIR = pathlib.Path(__file__).parent
 | 
						|
WHEEL_DIR = PYTHON_BUILD_DIR / "wheels"
 | 
						|
SITE_OUTPUT_DIR = PYTHON_BUILD_DIR / "site"
 | 
						|
 | 
						|
shutil.rmtree(SITE_OUTPUT_DIR, ignore_errors=True)
 | 
						|
SITE_OUTPUT_DIR.mkdir(parents=True)
 | 
						|
 | 
						|
SITE_ARTIFACT_WHEEL_DIR = SITE_OUTPUT_DIR / "artifacts" / "wheels"
 | 
						|
SITE_ARTIFACT_WHEEL_DIR.mkdir(parents=True)
 | 
						|
for wheel_file in WHEEL_DIR.glob("*"):
 | 
						|
    shutil.copy(wheel_file, SITE_ARTIFACT_WHEEL_DIR)
 | 
						|
 | 
						|
 | 
						|
def package_name(wheel_file: pathlib.Path) -> str:
 | 
						|
    return wheel_file.name.split("-")[0].replace("_", "-")
 | 
						|
 | 
						|
 | 
						|
# Get some extra context about the build
 | 
						|
ts = datetime.now(timezone.utc).isoformat()
 | 
						|
context_info: dict = {
 | 
						|
    "timestamp": ts,
 | 
						|
}
 | 
						|
 | 
						|
# Get branch info.
 | 
						|
with contextlib.suppress(Exception):
 | 
						|
    if branch_info := os.getenv("GITHUB_HEAD_REF"):
 | 
						|
        pass
 | 
						|
    else:
 | 
						|
        branch_info = subprocess.check_output(
 | 
						|
            ["git", "branch", "--show-current"], text=True
 | 
						|
        )
 | 
						|
    context_info["branch"] = branch_info.strip()
 | 
						|
 | 
						|
# Get commit info.
 | 
						|
with contextlib.suppress(Exception):
 | 
						|
    commit_info = subprocess.check_output(
 | 
						|
        ["git", "log", "-1", "--pretty=%H%n%B"], text=True
 | 
						|
    )
 | 
						|
    commit_hash, commit_msg = commit_info.strip().split("\n", 1)
 | 
						|
    context_info["commit"] = {
 | 
						|
        "hash": commit_hash,
 | 
						|
        "message": commit_msg.strip(),
 | 
						|
    }
 | 
						|
 | 
						|
# Get PR info.
 | 
						|
with contextlib.suppress(Exception):
 | 
						|
    pr_info = "unknown"
 | 
						|
    if github_ref := os.getenv("GITHUB_REF"):
 | 
						|
        # e.g. GITHUB_REF=refs/pull/12157/merge
 | 
						|
        parts = github_ref.split("/")
 | 
						|
        if parts[1] == "pull":
 | 
						|
            pull_number = parts[2]
 | 
						|
            pr_info = json.loads(
 | 
						|
                subprocess.check_output(
 | 
						|
                    ["gh", "pr", "view", pull_number, "--json", "title,number,url"],
 | 
						|
                    text=True,
 | 
						|
                )
 | 
						|
            )
 | 
						|
    else:
 | 
						|
        # The `gh` CLI might be able to figure it out.
 | 
						|
        pr_info = json.loads(
 | 
						|
            subprocess.check_output(
 | 
						|
                ["gh", "pr", "view", "--json", "title,number,url"], text=True
 | 
						|
            )
 | 
						|
        )
 | 
						|
    context_info["pr"] = pr_info
 | 
						|
 | 
						|
 | 
						|
newline = "\n"
 | 
						|
(SITE_OUTPUT_DIR / "index.html").write_text(
 | 
						|
    f"""
 | 
						|
<html>
 | 
						|
  <head>
 | 
						|
    <title>DataHub Python Builds</title>
 | 
						|
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
 | 
						|
 | 
						|
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.5.0/dist/semantic.min.css" integrity="sha256-cDGQ39yChhpN5vzgHbjIdGEtQ5kXE9tttCsI7VR9TuY=" crossorigin="anonymous">
 | 
						|
    <script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.5.0/dist/semantic.min.js" integrity="sha256-fN8vcX2ULyTDspVTHEteK8hd3rQAb5thNiwakjAW75Q=" crossorigin="anonymous"></script>
 | 
						|
 | 
						|
    <!-- CDN example (jsDelivr) -->
 | 
						|
    <script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js" integrity="sha256-nP25Pzivzy0Har7NZtMr/TODzfGWdlTrwmomYF2vQXM=" crossorigin="anonymous"></script>
 | 
						|
    <script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js" integrity="sha256-muryXOPFkVJcJO1YFmhuKyXYmGDT2TYVxivG0MCgRzg=" crossorigin="anonymous"></script>
 | 
						|
    <script>dayjs.extend(window.dayjs_plugin_relativeTime)</script>
 | 
						|
  </head>
 | 
						|
  <body>
 | 
						|
    <div class="ui container">
 | 
						|
      <h1 class="ui header" style="padding-top: 1.5em;">DataHub Python Builds</h1>
 | 
						|
      <p>
 | 
						|
        These prebuilt wheel files can be used to install our Python packages as of a specific commit.
 | 
						|
      </p>
 | 
						|
 | 
						|
      <h2>Build context</h2>
 | 
						|
      <p>
 | 
						|
        Built <span id="build-timestamp">at {ts}</span>.
 | 
						|
      </p>
 | 
						|
      <pre id="context-info">{json.dumps(context_info, indent=2)}</pre>
 | 
						|
 | 
						|
      <h2>Usage</h2>
 | 
						|
      <p>
 | 
						|
      Current base URL: <span class="base-url">unknown</span>
 | 
						|
      </p>
 | 
						|
 | 
						|
      <table class="ui celled table">
 | 
						|
      <thead>
 | 
						|
        <tr>
 | 
						|
          <th>Package</th>
 | 
						|
          <th>Size</th>
 | 
						|
          <th>Install command</th>
 | 
						|
        </tr>
 | 
						|
      </thead>
 | 
						|
      <tbody>
 | 
						|
        {
 | 
						|
        newline.join(
 | 
						|
            f'''
 | 
						|
            <tr>
 | 
						|
              <td><code>{package_name(wheel_file)}</code></td>
 | 
						|
              <td>{wheel_file.stat().st_size / 1024 / 1024:.3f} MB</td>
 | 
						|
              <td><code>uv pip install '{package_name(wheel_file)} @ <span class="base-url"><base-url></span>/artifacts/wheels/{wheel_file.name}'</code></td>
 | 
						|
            </tr>
 | 
						|
            '''
 | 
						|
            for wheel_file in sorted(WHEEL_DIR.glob("*.whl"))
 | 
						|
        )
 | 
						|
        }
 | 
						|
      </tbody>
 | 
						|
      </table>
 | 
						|
    </div>
 | 
						|
  </body>
 | 
						|
  <script>
 | 
						|
    const baseUrl = window.location.href.split('/').slice(0, -1).join('/');
 | 
						|
    document.querySelectorAll(".base-url").forEach(el => {{
 | 
						|
      el.textContent = baseUrl;
 | 
						|
    }});
 | 
						|
 | 
						|
    const buildTimestamp = document.getElementById("build-timestamp");
 | 
						|
    const buildTimestampDate = dayjs('{ts}');
 | 
						|
    buildTimestamp.textContent = buildTimestampDate.fromNow();
 | 
						|
  </script>
 | 
						|
</html>
 | 
						|
"""
 | 
						|
)
 | 
						|
 | 
						|
print("DataHub Python wheel site built in", SITE_OUTPUT_DIR)
 |