KernelSU Developer Portal 文档

发布

你发布的每个版本都是你仓库中的一个 GitHub release,并附带模块 ZIP。模块上架后,新 release 会被自动收录,通常在几分钟内(webhook),最迟在 15 分钟的兜底同步后。更新无需审核。

release 的要求 #

只有同时满足以下全部条件的 release 才会被使用:

  1. 已发布(不是 draft)。
  2. 是 immutable 的(GitHub API 中 immutable: true),见下文。
  3. 有恰好一个模块 ZIP:恰好一个 .zip 资源;或者,若 module.yaml 设置了 release.assetPattern,则恰好一个资源与之匹配。其他不匹配的资源没有影响。
  4. ZIP 通过检查:
    • ≤ 100 MiB,解压后 ≤ 512 MiB,压缩比 ≤ 200,≤ 20 000 个条目;
    • ZIP 根目录有 module.prop(≤ 64 KiB,UTF-8,stored 或 deflate 压缩),含 id、name、version、versionCode、author、description。它按 KernelSU 的方式读取(Java properties 语法;同一个键重复时以最后一个值为准),且 id、name、version、versionCode、author 或 description 重复会被拒绝;
    • id 与你注册的模块 ID 完全一致;
    • 没有绝对路径、.. 段、反斜杠或加密条目,也没有解压到同一路径的两个条目(./a、a 和 .//a 是同一路径);
    • 只使用 KernelSU 能解压的压缩方法:stored、deflate、deflate64、LZMA 或 XZ。
  5. 其 versionCode 有效且更新(见下一节)。

所有失败都会以 Check Run 的形式报告在打 tag 的 commit 上,详见检查。

Immutable release #

启用 Settings → General → Releases → Enable release immutability(启用 release 不可变性)后,GitHub 会在 release 发布时将其锁定:资源无法被替换或删除,tag 无法移动或复用,即使仓库被删除后重建也一样。这正是 KernelSU Modules 能把 sha256 与 URL 永久绑定的原因。

为什么无法修复已发布的 release #

immutable release 的资源和 tag 都被冻结,而且 KernelSU Modules 对每个 release 只处理一次。如果 release 有问题(ZIP 错误、id 错误、versionCode 过低等),唯一的修复办法是发布一个 versionCode 更高的新 release。你可以删除有问题的 release,但不能复用它的 tag,也不能复用 KernelSU Modules 已经接受过的 release 的 versionCode。

发布后仍然可以编辑的内容:标题、release notes 和预发布标记。KernelSU Modules 每次同步都会重新读取它们。

这就是发布前预检如此重要的原因:module-release action 会拒绝发布任何无法通过检查的内容,避免白白浪费一个版本号。

versionCode 规则 #

release notes 即更新日志 #

release notes 会作为该版本的更新日志展示,渲染和清理方式与描述相同(见 module.yaml),最大 64 KiB。

预发布 #

在 GitHub 上将 release 标记为 pre-release(或在 action 中设置 prerelease: true)即可发布测试版。预发布会被检查并记录,但不会作为稳定版本提供;当前的站点和 Manager 暂不显示它们。预发布同样计入已接受的最高 versionCode,因此正式版要么使用更高的 versionCode,要么在 GitHub 上取消 "Set as a pre-release" 勾选来提升该预发布(KernelSU Modules 每次同步都会重新读取该标记)。发布与已接受预发布 versionCode 相同的正式版会被拒绝。

使用 module-release action #

KernelSU-Modules/tools/actions/module-release 会在发布之前对你的 ZIP 运行 KernelSU Modules 所用的同一个验证器,然后按正确顺序(draft → 上传 → 发布)发布,资源命名为 {id}-{versionCode}-{version}.zip。在文件名中,version 里每一段 A-Z a-z 0-9 . _ - 以外的字符会变成 _,首尾的 .、_ 和 - 会被去掉,并截断为 64 个字符(若为空则为 unknown)——例如 version v1.2 (beta) 得到 mymodule-120-v1.2_beta.zip。显示的版本仍然原样取自 module.prop。

name: Release
on:
  push:
    tags: ['v*']
permissions:
  contents: write
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@<commit-sha>
      - uses: KernelSU-Modules/tools/actions/module-release@<commit-sha>
        with:
          module-dir: module            # 其内容将成为 ZIP 根目录的目录
          # zip: out/my-module.zip      # …或前面步骤中构建好的 ZIP
          release-notes-file: CHANGELOG.md

请将 action 固定到完整的 commit SHA。主要输入:

输入 默认值 说明
zip / module-dir — 二选一:预构建的 ZIP,或要打包的目录(会跳过 VCS 文件)。
tag 推送的 tag 要发布的 tag。
prerelease false 作为预发布发布。
release-notes / release-notes-file — release notes(更新日志)。
asset-pattern release.assetPattern 用于匹配生成的资源名。
dry-run false 运行全部检查但不发布(适合在 pull request 中使用)。

输出:release-id、release-url、asset-name、sha256(另有 zip-path、module-id、version、version-code、repository、metadata-commit)。完整列表见 action 的 README。

如需从私有源码仓库发布到公开的分发仓库,请设置 repository 和 token,见闭源模块。

action 的检查只是为了方便;KernelSU Modules 仍会在自己一侧再次验证每个 release。

不使用 action #

任何工具都可以,只要保证 release 是在上传 ZIP 之后才发布的,例如:

gh release create v1.2.0 my_module-120-v1.2.0.zip --title v1.2.0 --notes-file CHANGELOG.md

可选:托管的 update.json #

KernelSU 会读取 module.prop 中的 updateJson 来进行应用内更新。KernelSU Modules 会为每个已上架的模块发布一个经过验证的 update.json:

updateJson=https://modules.kernelsu.org/api/v1/modules/<id>/update.json

它包含当前稳定版本的 version、versionCode、zipUrl 以及 changelog URL,并在每次同步后更新,因此你无需自行维护文件。changelog URL(https://modules.kernelsu.org/api/v1/modules/<id>/changelog.md)以纯 Markdown 提供该版本的 Release 说明(KernelSU 会在更新前显示;Release 没有说明时为 (no release notes))。