参与贡献

如何报告问题、提出建议,或修改 ThirtyFile 代码。

所有参与者都须遵守行为准则。

本页内容
  1. 问题与建议
  2. 修改代码
  3. 检查
  4. 其他语言的网站
  5. 标签
  6. 发布版本
  7. 许可证

问题与建议

安全问题应私下报告。请使用 Report a vulnerability,不要创建公开 Issue,以便在公开前修复问题。

修改代码

禁止直接推送到 main。每项更改都通过独立分支的 Pull Request 提交。

  1. 从 Issue 开始。大于小修复的工作,先在 Issue 中讨论并确认方案。
  2. 从 main 创建分支,按用途命名:
    分支用途
    feat/share-link-editing新增功能
    fix/upload-resume问题修复
    docs/backup-guide网站与指南
    chore/update-actions工具、构建和依赖
  3. 完成更改,执行下方检查。
  4. 创建 Pull Request。标题用清晰语言说明改动,并添加一个标签。在说明中写 Closes #123,合并后即可关闭对应 Issue。
  5. 等待检查。轻量的 Checks passed 检查必须通过才能合并。
  6. 合并。Pull Request 在 main 上压缩为一个提交,随后删除分支。

检查

创建 Pull Request 前,请使用统一脚本在本地运行完整检查。发布和手动完整验证也会运行这些检查;自动 Pull Request 检查更轻量。

scripts/check.sh
部分检查内容
scripts/check.sh quick自动 Pull Request 检查:前端格式、翻译、模块边界、端到端测试结构、类型和 lint;Rust 格式;迁移编号及已发布迁移保持不变;网站链接。不运行单元/浏览器测试、Rust 编译或镜像构建
scripts/check.sh web界面:按锁文件安装依赖、格式(pnpm format:check)、翻译(node scripts/check-i18n.mjs)、确保 web/src/ooxml 的 Office 代码不导入应用其他模块(node scripts/check-boundaries.mjs)、确保端到端测试没有固定等待且名称包含随机部分(node scripts/check-e2e.mjs)、类型、lint 和单元测试。使用 scripts/check.sh web --coverage 时(与 GitHub 一样),覆盖率低于 web/vitest.config.ts 中的门槛也会失败
scripts/check.sh server服务器:格式(cargo fmt --check)、cargo test,以及将警告视为错误的 cargo clippy
scripts/check.sh e2e端到端测试:通过真实浏览器(Playwright)对从仓库构建的服务器执行登录、上传和预览。多个测试并行运行(GitHub 上为 4 个),因此每个测试使用独立文件夹,名称含随机部分,操作后等待服务器响应而非固定时间;web/tests/e2e/helpers.ts 提供这些辅助功能。首次运行前,用 cd web && pnpm exec playwright install chromium 安装浏览器
scripts/check.sh site网站:每种语言都具有全部翻译页面及相互对应的语言链接,站内链接和锚点有效(node scripts/check-site.mjs)。仅需要 Node,修改网站时也会执行

Windows 上请在 Git Bash 中运行。GitHub 完整验证还会检查依赖的已知安全问题(cargo deny 和 pnpm audit);服务器测试与端到端测试合计必须覆盖至少 90% 的服务器代码行(cargo llvm-cov,门槛在 .github/workflows/build.yml)。

代码由工具格式化,未符合格式时检查会失败。提交前请格式化:

cd server && cargo fmt
cd web && pnpm format

服务器使用 rustfmt(配置在 server/rustfmt.toml),界面使用 oxfmt(配置在 web/.oxfmtrc.json;格式化 web/src、web/tests 和 web/scripts)。编辑器安装 rustfmt 或 oxfmt 扩展后可按同样设置在保存时格式化。手工排版、每行多项的表格可在上方加 // oxfmt-ignore 保持布局。web/src/lib/i18n/ 中的词典不格式化,保持每行一个条目。

仅调整格式的提交列在 .git-blame-ignore-revs。GitHub blame 视图会跳过这些提交;如需本地 git blame 也跳过,在克隆仓库中执行一次 git config blame.ignoreRevsFile .git-blame-ignore-revs。

每个 Pull Request 都运行上述轻量检查。完整测试与镜像构建在正式发布和预发布前运行,也可在 Actions › Build › Run workflow 手动运行;手动验证不发布任何内容。发布前,两种架构的镜像都会使用 compose.yaml 在最新已发布版本的数据上启动。CodeQL 在合并后、每周及发布前扫描 main。合并到 main 不发布任何内容,网站也不发布:指南随版本发布,以描述用户实际可安装的功能。对当前已发布版本也正确的指南修复可手动发布:在 Actions › Website › Run workflow 中选择 main 为要发布的分支或标签。

其他语言的网站

首页和全部 16 篇指南提供英文、繁体中文、简体中文和日文版本。每种语言覆盖相同的 17 个页面:

页面英文其他语言
首页site/index.htmlsite/<language>/index.html
安装site/docs/index.htmlsite/<language>/docs/index.html
其他所有指南site/docs/<guide>.htmlsite/<language>/docs/<guide>.html

指南菜单、相关链接、上一页/下一页链接和章节列表均保持当前语言。切换语言时停留在同一指南,有 JavaScript 时还会保留当前章节。README 也有翻译:README.md 旁有 README.zh-TW.md、README.zh-CN.md 和 README.ja.md,分别链接到对应语言网站。

标签

标签版本说明中的分类
enhancement新功能
bug修复
performance性能提升
accessibility更易使用
documentation指南与网站
dependencies依赖更新
maintenance维护

发布版本

正式镜像同时发布到 ghcr.io/thirtyfile/thirtyfile 和 docker.io/thirtyfile/thirtyfile。首次向 Docker Hub 发布前,在 Settings › Secrets and variables › Actions 中添加 Actions variable DOCKERHUB_USERNAME 和 secret DOCKERHUB_TOKEN。使用可读写该仓库的 Docker Hub access token。发布流程会在扫描与构建前检查凭据,按 digest 复制已验证的镜像,并在发布 GitHub release 前验证每个 Docker Hub 标签。

合并后的更改累积在 main,由维护者决定何时发布。发布须手动启动:在 GitHub 打开 Actions › Release › Run workflow,保留 main,输入新版本号,例如 1.2.3;预发布使用 1.2.3-rc.1。也可运行:

gh workflow run release.yml -f version=1.2.3

流程对 main 执行 CodeQL 扫描、测试,构建并启动 amd64 与 arm64 镜像。全部通过后才推送尚未附加标签的镜像。接着依序:从镜像提取两种架构的服务器程序,与校验码、许可声明和指向版本系列的 compose.yaml 创建草稿 release(1.0.0 之前为 :1.2,之后为 :1);不重新构建,给镜像添加 1.2.3、1.2、1(从 1.0.0 起)及 latest 标签;发布 release,创建 v1.2.3 标签,说明由上次发布以来合并的 Pull Request 生成;最后从该标签发布网站。如果扫描发现未关闭的 high 或 critical 告警,或者测试或镜像失败,不会推送、添加标签或发布。修复告警,或在不适用时从 Security › Code scanning 中关闭告警,再次运行发布。后续步骤失败时,用相同版本号重试,会发布已标记为 1.2.3 的镜像,而非重新构建。版本号必须比上次发布更新。以 v 开头的标签不能移动或删除。

含 - 的版本号,例如 1.2.3-rc.1,为预发布:镜像仅添加 1.2.3-rc.1 标签,GitHub 将其标为预发布,用户必须主动选择才会获得;预发布不会发布网站。预发布验证通过且之后没有合并新提交时,可从同一提交发布 1.2.3:流程直接为预发布镜像添加标签,不重新构建,确保发布的就是已试用的内容(镜像版本标签仍显示预发布版本)。

版本位递增时机
第一位(2.0.0)修改或移除用户依赖的行为
第二位(1.3.0)新增功能
第三位(1.2.4)仅修复问题

复制已有版本时,在 Actions › Mirror a release to Docker Hub › Run workflow 中选择 main,填写已发布版本,例如 0.6.0。流程先验证 Git 标签、镜像 revision 和已签名的 GHCR 来源证明,再复制镜像。仅当 GHCR 对应的版本系列、主版本或 latest 标签目前指向同一镜像时,才更新该标签;镜像旧版本不会覆盖更新版本。已有的精确版本标签必须与源 digest 一致,否则流程停止。内容一致的复制可安全重试,不会重新构建镜像。

许可证

ThirtyFile 采用 Apache License 2.0,贡献内容遵循相同条款。

依赖须采用宽松许可证:Rust 依赖按 server/deny.toml 清单检查,server/about.toml 使用相同清单;npm 包按 web/scripts/third-party-notices.mjs 中相同清单(另加字体许可证 OFL-1.1)检查,两者均有测试。镜像构建会把所有 crate、npm 包、musl、证书颁发机构和时区数据库的许可声明汇总为 THIRD-PARTY-NOTICES;出现清单之外的许可证时构建失败。