From f5eb84589fa323867b6713a9e70f69020375684a Mon Sep 17 00:00:00 2001 From: kuaifan Date: Mon, 1 Jun 2026 23:18:39 +0000 Subject: [PATCH] =?UTF-8?q?docs(skill):=20release=20=E6=94=B9=E5=90=8D=20d?= =?UTF-8?q?ootask-release=EF=BC=8C=E8=A1=A5=20CI=20=E7=A1=AE=E8=AE=A4/iOS/?= =?UTF-8?q?uploads=20=E8=B5=8B=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 push 后确认 Publish 工作流、可选 iOS 发布(gh workflow run) - 构建 EACCES:改为 chown 赋权整个 public/uploads(不删数据),删除仅限 tmp - 同步 Red Flags;目录与 name 统一为 dootask-release Co-Authored-By: Claude Opus 4.8 (1M context) --- .../{release => dootask-release}/SKILL.md | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) rename .claude/skills/{release => dootask-release}/SKILL.md (58%) diff --git a/.claude/skills/release/SKILL.md b/.claude/skills/dootask-release/SKILL.md similarity index 58% rename from .claude/skills/release/SKILL.md rename to .claude/skills/dootask-release/SKILL.md index 7177fa377..6649304c8 100644 --- a/.claude/skills/release/SKILL.md +++ b/.claude/skills/dootask-release/SKILL.md @@ -1,5 +1,5 @@ --- -name: release +name: dootask-release description: Use when releasing a new DooTask frontend version from the `pro` branch. Rigid sequential workflow (translate → version → build → commit → push) with strict pre-checks (branch, clean worktree, Node 20+) and per-step user confirmation. Use when user says "发布新版本", "release", "出新版本", "打版本". Stop on any failure; do NOT auto-fix dirty worktree, do NOT add tag step, do NOT use `git add -A`. --- @@ -43,6 +43,12 @@ npm run build ``` 构建前端生产版本。 +> **已知失败**:若 build 报 `public/uploads/...` 的 `EACCES: permission denied, copyfile`,是 vite 复制 `public/` 目录时碰到运行时残留的上传文件——这些文件常为 **root 属主**(容器内 root 进程写入),复制需覆盖写入,构建用户没有写权限。报错路径可能落在 `public/uploads` 下任意子目录(`tmp`、`avatar` 等),不限于 `tmp`。这不是代码问题。**补救(赋权,不删数据)**:把整个 uploads 的属主改回当前用户后重试 build: +> ```shell +> sudo chown -R "$(id -u):$(id -g)" public/uploads +> ``` +> 需 root(本机可免密 sudo;或经 docker 以 root 改权限)。**优先赋权,不要删**——`public/uploads` 含真实上传数据。即便用户要求清理,也只清临时目录 `public/uploads/tmp`,切勿删 uploads 下其他内容。 + ## 最终:提交并推送 所有步骤完成后: @@ -56,6 +62,26 @@ npm run build - 提交信息使用 `release: v<新版本号>`(与历史提交风格一致,参见 `git log --oneline | grep '^release:'`) - **只 add 本次发布相关改动**,按文件名显式添加(例如 `git add package.json public/js/...`),**不要用 `git add -A` 或 `git add .`**,以免卷入未跟踪的本地实验文件 +## push 之后:确认发布工作流(CI 才是真正出包) + +push 到 `pro` 只是触发器,真正的构建/出包由 GitHub Actions 完成——**push 成功 ≠ 发布完成**: + +- **Publish**(`.github/workflows/publish.yml`,push→pro 触发)跑完才算出包;成功后会自动触发 **Sync to Gitee**(镜像同步)。 +- push 完成后**主动确认** Publish 工作流 `conclusion=success`。优先用 `gh`(未装可临时装;公开仓库也可用 GitHub REST API 免鉴权读取 runs): + ```shell + gh run list --workflow=publish.yml -R kuaifan/dootask -L 1 + gh run view -R kuaifan/dootask --json status,conclusion,url + ``` +- 工作流仍在跑时,挂后台轮询、结束即通知用户,**不要在前台死等**。 + +### 可选:iOS 发布 + +`ios-publish.yml` 是**独立的手动工作流**(`workflow_dispatch`),不随 push 触发。**仅当用户明确要求**发 iOS 时执行: +```shell +gh workflow run ios-publish.yml --ref pro -R kuaifan/dootask +``` +需 `gh` 已登录且 token 含 `workflow` 权限。触发后同样可挂后台轮询其结果。 + ## 失败处理 - 任何步骤失败立即停止,报告错误信息 @@ -81,3 +107,5 @@ npm run build - "`git add -A` 省事" → 不,显式 add - "翻译这步没改动可以跳" → 不,按顺序执行、执行后报告结果即可 - "一起 commit + push 一气呵成" → 必须先让用户确认 +- "push 上去了,发布就完成了" → 不,push 只是触发器,要确认 GitHub Actions 的 Publish 工作流 success +- "build 报 uploads 权限错,我直接删掉" → 优先 `chown` 赋权整个 `public/uploads`(不丢数据);真要删也只删 `tmp`,别碰 uploads 下真实上传数据