60 lines
2.7 KiB
Markdown
60 lines
2.7 KiB
Markdown
# 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`。
|
||
|
||
注册标签必须严格使用:
|
||
|
||
```text
|
||
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 终端运行:
|
||
|
||
```bash
|
||
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,失败时自动回滚。
|
||
|
||
首次安装和验收完成前,发布工作流只允许在 Gitea Actions 页面手动触发。确认
|
||
Runner、Registry、NAS 更新服务和回滚流程均正常后,再启用指定分支的 `push`
|
||
触发。
|