From 859ff265108c58065b480acd3cba93147fb159d1 Mon Sep 17 00:00:00 2001 From: linmeng <819991304@qq.com> Date: Tue, 28 Jul 2026 17:53:07 +0800 Subject: [PATCH] fix: deploy into root-owned staging tree --- .gitea/workflows/backend-quality-gate.yml | 4 ++-- docs/BUG_HISTORY.md | 4 ++-- frontend/tests/staging-backend-workflows.test.ts | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/backend-quality-gate.yml b/.gitea/workflows/backend-quality-gate.yml index a873f082..7e17e05d 100644 --- a/.gitea/workflows/backend-quality-gate.yml +++ b/.gitea/workflows/backend-quality-gate.yml @@ -70,8 +70,8 @@ jobs: printf '%s' "$REGISTRY_PASSWORD" | ssh $SSH_OPTIONS "$REMOTE" "sudo docker login '$REGISTRY_HOST' --username '$REGISTRY_USERNAME' --password-stdin" ssh $SSH_OPTIONS "$REMOTE" " set -e - install -d '$DEPLOY_PATH' - tar -xf '$REMOTE_ARCHIVE' -C '$DEPLOY_PATH' + sudo install -d '$DEPLOY_PATH' + sudo tar -xf '$REMOTE_ARCHIVE' -C '$DEPLOY_PATH' rm -f '$REMOTE_ARCHIVE' cd '$DEPLOY_PATH' export API_IMAGE='$IMAGE_REPOSITORY:api-$GITEA_SHA' diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 89e39efc..cb95d900 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -1577,8 +1577,8 @@ - 用户现象:staging 自动部署先后在基础镜像、依赖下载及 Web 构建失败;Web 最终明确报错为 `frontend/src/app/page.tsx:3560` JSX 解析失败。 - 触发条件:`staging` push 后,Runner 使用 `registry.cn-hangzhou.aliyuncs.com/library/python:3.12-slim` 或对应 Node 地址解析基础镜像。 - 根因:阿里云 `library/*` 地址并非当前凭据可访问的公共镜像仓库,xiaoxin 直连 Docker Hub 超时;同时充值订单二维码条件渲染缺少右花括号,导致相邻 `payUrl` 条件 JSX 无法解析。 -- 修复:工作流保持单 job 构建发布部署链路;checkout 使用当前 SHA 的 depth-1 浅拉取并设置连接/低速超时;API/Web 使用已完整拉取验证的国内基础镜像;API 构建使用实测最快的阿里云 APT/PyPI;补齐二维码条件渲染的 `}`,使支付链接成为同级条件节点;远端 Docker 操作继续使用免交互 sudo。 -- 验证:替代 Python/Node 基础镜像均在真实 Runner 完整拉取;阿里云 APT/PyPI 为同机候选实测最快;Gitea run 1264 的 API 镜像构建成功,Web 构建精确暴露 JSX 错误;补齐括号后本地 `npm run build` 完整通过 31 个页面生成。后续 ACR push、服务器 Compose 和健康检查继续按运行日志闭环。 +- 修复:工作流保持单 job 构建发布部署链路;checkout 使用 depth-1 浅拉取和网络超时;API/Web 使用实测可达的国内基础镜像,API 使用阿里云 APT/PyPI;补齐二维码条件渲染的 `}`;服务器 deploy 目录由 root 管理,因此上传后的目录创建、控制文件解包及 Docker 操作均使用免交互 sudo。 +- 验证:Gitea run 1264 的 API 镜像构建成功并暴露 JSX 错误;补齐括号后本地 `npm run build` 完整通过 31 个页面。run 1265 的 API/Web 镜像均构建并推送 ACR 成功,部署精确失败在普通 `tar` 无权覆盖 root 所有文件;已据此将解包改为 sudo,继续用下一次运行闭环 Compose 和健康检查。 - 防复发:staging Dockerfile 的基础镜像必须在 xiaoxin 完整 `docker pull` 验证;APT 与 Python 包源均基于 Runner 实测选择并设置有限重试/超时,避免网络异常无限占用工作流。 - 相关记录:BUG-082、BUG-083、BUG-084 - 复发自:BUG-082 diff --git a/frontend/tests/staging-backend-workflows.test.ts b/frontend/tests/staging-backend-workflows.test.ts index 4acfa027..03415d6c 100644 --- a/frontend/tests/staging-backend-workflows.test.ts +++ b/frontend/tests/staging-backend-workflows.test.ts @@ -474,6 +474,7 @@ test("Gitea staging push builds ACR images and deploys them on the test server", assert.match(workflow, /docker push "\$IMAGE_REPOSITORY:api-\$GITEA_SHA"/); assert.match(workflow, /docker push "\$IMAGE_REPOSITORY:web-\$GITEA_SHA"/); assert.match(workflow, /scp \$SCP_OPTIONS/); + assert.match(workflow, /sudo tar -xf '\$REMOTE_ARCHIVE' -C '\$DEPLOY_PATH'/); assert.match(workflow, /pull api web/); assert.match(workflow, /up -d --no-build --remove-orphans/); assert.match(workflow, /curl --fail.*"\$STAGING_URL\/api\/health"/);