mirror of
https://github.com/datahub-project/datahub.git
synced 2025-06-27 05:03:31 +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)
|