From 24c235c93da352509506ceb49d1113e785e8b6b7 Mon Sep 17 00:00:00 2001 From: snowy-yang <102860110+snowy-yang@users.noreply.github.com> Date: Thu, 24 Sep 2026 22:00:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20CI=EF=BC=9Aslim=20?= =?UTF-8?q?=E9=95=9C=E5=83=8F=E6=B2=A1=E6=9C=89=20curl=EF=BC=8C=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E6=93=8D=E4=BD=9C=E6=94=B9=E7=94=A8=20python=20?= =?UTF-8?q?=E6=A0=87=E5=87=86=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 首轮实跑 1s 即死,日志定位 /var/run/act/workflow/0.sh: curl: command not found——python:3.13-slim 不带 curl/wget/git;SDK 仓库那份 ci.yml 的「curl 可用」是宿主机 probe 验证的,进了 container 不成立(且该 方案在 Gitea 上从未跑绿过,后来整体迁去了 GitHub)。 - archive 拉取与 commit status 上报改用 python3 urllib(容器里保证 在场的只有 python),note() 参数经 argv 传入、token 走环境变量 - 去掉 pyright 及其 apt 装 node 的兜底:多一条网络依赖链,且本地 pyright 常绿,CI 保持 ruff + pytest 即可 - 各步骤不再吞输出,日志可直接定位 --- .gitea/workflows/ci.yml | 52 ++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index e79143c..f01e6ea 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -8,7 +8,7 @@ on: jobs: test: - name: ruff + pyright + pytest + name: ruff + pytest runs-on: ubuntu-latest # 固定官方 python 镜像:保证 python3.13 + pip 在场(runner 默认镜像 # 工具链不明,SDK 仓库实测任务曾 7s 即死);runner 不支持 container @@ -16,32 +16,48 @@ jobs: container: python:3.13-slim steps: # 不用 actions/checkout、不用 git:runner 对 github 连通性不稳 - # (SDK 仓库 probe 实测),改走 Gitea archive 接口拉源码 tarball; - # 每步结果写进 commit status(日志匿名不可读,status 远程可读, - # GITEA_TOKEN 未配置时静默降级,不影响流程) + # (SDK 仓库 probe 实测),改走 Gitea archive 接口拉源码 tarball。 + # slim 镜像没有 curl/wget/git,网络操作一律用容器里保证在场的 + # python 标准库;每步结果写进 commit status(日志匿名不可读, + # status 远程可读;GITEA_TOKEN 未配置时静默降级,不影响流程) - name: 拉源码、装依赖并执行测试 env: TOKEN: ${{ secrets.GITEA_TOKEN }} UV_PYTHON_INSTALL_MIRROR: https://registry.npmmirror.com/-/binary/python-build-standalone run: | set -e - SERVER="${GITHUB_SERVER_URL:-https://gitea.4i.hk}" + export SERVER="${GITHUB_SERVER_URL:-https://gitea.4i.hk}" note() { - curl -s -m 10 -X POST \ - -H "Authorization: token $TOKEN" \ - -H 'Content-Type: application/json' \ - -d "{\"state\":\"$3\",\"context\":\"ci/$1\",\"description\":\"$2\"}" \ - "$SERVER/api/v1/repos/$GITHUB_REPOSITORY/statuses/$GITHUB_SHA" \ - -o /dev/null + python3 -c ' + import sys, os, json, urllib.request + ctx, desc, state = sys.argv[1:4] + req = urllib.request.Request( + os.environ["SERVER"] + "/api/v1/repos/" + os.environ["GITHUB_REPOSITORY"] + + "/statuses/" + os.environ["GITHUB_SHA"], + data=json.dumps( + {"state": state, "context": "ci/" + ctx, "description": desc} + ).encode(), + headers={ + "Content-Type": "application/json", + "Authorization": "token " + os.environ["TOKEN"], + }, + ) + try: + urllib.request.urlopen(req, timeout=10) + except Exception: + pass # status 只是旁路:token 未配置或网络抖动都不能影响主流程 + ' "$1" "$2" "$3" } trap 'note error "步骤意外失败,详见 Actions 日志" failure' ERR - curl -sL "$SERVER/api/v1/repos/$GITHUB_REPOSITORY/archive/$GITHUB_SHA.tar.gz" -o src.tgz \ + python3 -c "import urllib.request; urllib.request.urlretrieve( + '$SERVER/api/v1/repos/$GITHUB_REPOSITORY/archive/$GITHUB_SHA.tar.gz', + 'src.tgz')" \ && mkdir src && tar -xzf src.tgz -C src --strip-components=1 && cd src \ || { note fetch "archive 拉取失败" failure; exit 1; } note fetch ok success - pip install uv >/dev/null 2>&1 \ + pip install uv \ || { note pip "pip 安装 uv 失败" failure; exit 1; } note pip ok success @@ -49,7 +65,7 @@ jobs: # runner 到 github 时通时不通,sync 失败自动重试 sync_ok="" for _ in 1 2 3; do - if uv sync >/dev/null 2>&1; then sync_ok=1; break; fi + if uv sync; then sync_ok=1; break; fi sleep 5 done [ -n "$sync_ok" ] || { note sync "uv sync 失败(已重试 3 次)" failure; exit 1; } @@ -59,12 +75,6 @@ jobs: || { note ruff "ruff check 未通过" failure; exit 1; } note ruff ok success - # pyright 需要 node:镜像里没有就装 Debian 的(保底 pyright 自带下载) - command -v node >/dev/null 2>&1 || { apt-get update -qq && apt-get install -y -qq nodejs; } || true - uv run pyright \ - || { note pyright "pyright 未通过" failure; exit 1; } - note pyright ok success - - uv run pytest -q \ + uv run pytest \ || { note pytest "pytest 未通过" failure; exit 1; } note pytest ok success