From 89099ae79db9347184ce8927ba19ca681d971ef2 Mon Sep 17 00:00:00 2001 From: ModelHub XC Automation Date: Mon, 26 Oct 2026 23:11:46 +0800 Subject: [PATCH] Add credential-free cloud build diagnostic --- .dockerignore | 3 +++ Dockerfile | 6 ++++++ README.md | 6 ++++++ app.py | 24 ++++++++++++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 app.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ce6de41 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +.git +__pycache__ +*.pyc diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..adf9a12 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM modelhubxc-4pd.tencentcloudcr.com/xc_agent_platform/python:3.11-slim +ENV PYTHONUNBUFFERED=1 +WORKDIR /app +COPY app.py /app/app.py +EXPOSE 8080 +CMD ["python", "/app/app.py"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d1ca6d --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# ModelHub cloud build probe + +Minimal standard-library HTTP server to distinguish source retrieval, base-image +and dependency-installation failures. Contains no account, password, token or +adaptation code. It logs credential-related environment variable names only; +values are never read into the log or HTTP response. It does not submit tasks. diff --git a/app.py b/app.py new file mode 100644 index 0000000..26d5447 --- /dev/null +++ b/app.py @@ -0,0 +1,24 @@ +"""Credential-free probe for the owner's ModelHub cloud deployment.""" +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +import json +import os + +metadata = {"name": "xc-cloud-build-probe", "version": "probe-20261026-01", + "strategyIdPresent": bool(os.environ.get("STRATEGY_ID")), + "credentialEnvironmentNames": sorted(name for name in os.environ + if any(marker in name for marker in ("TOKEN", "AUTH", "CREDENTIAL", "SECRET", "API_KEY")))} +print(json.dumps(metadata), flush=True) + + +class Handler(BaseHTTPRequestHandler): + def do_GET(self): + data = {"status": "ok"} if self.path.split("?", 1)[0] == "/health" else metadata + payload = json.dumps(data).encode() + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(payload))) + self.end_headers() + self.wfile.write(payload) + + +ThreadingHTTPServer(("0.0.0.0", 8080), Handler).serve_forever()