Files
wushenghuaandCodex 87def9b8a6
Plainleaf 自动发布 / release (push) Successful in 3m34s
ci: 启用 main 分支自动发布
Co-Authored-By: Codex <noreply@anthropic.com>
2026-08-13 12:19:33 +08:00
..
2026-08-13 12:19:33 +08:00

Plainleaf 专用 Gitea Actions Runner

此 Runner 只注册到 wushenghua/plainleaf 仓库,只提供 plainleaf-release 标签。它不提供 ubuntu-latest 标签,因此不会执行仓库继承的 SilverBullet 通用 CI。

Runner 使用固定版本 gitea/runner:3.1.0-dind-rootless 和独立的 Docker 数据卷:

  • 不挂载 /var/run/docker.sock
  • 看不到 NAS 上的 Gitea、MySQL 或其他容器
  • 任务容器禁止 privileged 模式和任意 volume 挂载
  • 同时只执行一个任务,最多使用 3 核 CPU、8 GB 内存
  • 不挂载 Plainleaf 的 /data 或 Markdown 目录
  • 只将 NAS 内网 Gitea Registry 192.168.31.68:8092 标记为 HTTP Registry

外层 rootless DinD 需要 privileged: true 才能创建用户命名空间和内部 Docker 守护进程。由于极空间没有 rootlesskit AppArmor profile,Runner 单独使用 apparmor=unconfined;它只挂载 Runner 自身的目录和命名卷,不挂载任何业务数据。 镜像登录和推送直接走 NAS 内网 Registry,避免大镜像经过公网 FRP;Gitea 中的包 仍可由 NAS 更新服务通过 gitea.aichickenfarm.cn 的 HTTPS 地址拉取。

一次性注册

注册令牌从仓库 设置 -> Actions -> Runners 获取。令牌只通过终端标准输入传给 一次性注册容器,不写入 Compose 或 Git。注册完成后,凭据保存在 data/.runner。

注册标签必须严格使用:

plainleaf-release:docker://docker.gitea.com/runner-images:ubuntu-latest

启动前应确认 data 目录由 Runner 的 UID/GID 1000:1000 持有。Runner 无需开放 任何端口,只主动连接 https://gitea.aichickenfarm.cn/ 拉取任务。

将本目录放到 NAS 的 Plainleaf Runner 专用目录后,在可见 SSH 终端运行:

sudo ./install-runner.sh

脚本先空载启动 Runner 并验证内部 rootless Docker,验证成功后才静默读取一次注册 令牌。令牌不会写入文件、Compose 或 Git,注册凭据只保存在 NAS 的 data/.runner 中。如果空载验证失败,令牌不会被使用;脚本只停止 plainleaf_actions_runner,不会操作其他容器。

Actions Secrets

仓库需要两个 Secret:

  • REGISTRY_TOKEN:wushenghua 用户的 write:package 令牌
  • NAS_DEPLOY_KEY:Plainleaf 专用 SSH 私钥,只对应 NAS 上的 forced-command 公钥

工作流不会输出 Secret。镜像推送完成后,它使用固定 SSH host key 触发 NAS 上的 plainleaf-update.service;该服务只拉取并重建 Plainleaf,失败时自动回滚。

当前发布工作流会在代码推送到 main 分支时自动运行。Gitea Actions 页面仍保留 手动触发入口,用于发布失败后的重试。