# Gitea Runner 基础设施规范

## 目标

把 CI runner 从“文档里假定存在”收敛为“可安装、可启动、可验证、可排障”的正式基础设施。

当前已确认的问题不是单个 workflow 命令，而是 runner 基础设施缺少可观测、可管理、可验证的落地形态，导致：

- workflow 可以触发
- run 可以入队
- job 长时间停留在 `Waiting to run`
- 无法快速确认 runner 是否在线、注册、可消费队列

---

## 正式约定

### 安装目录

统一约定 runner 安装根目录：

```text
C:\xiaoxia-ci\act_runner\
```

目录结构：

```text
C:\xiaoxia-ci\act_runner\
├── act_runner.exe
├── config.yaml
├── .runner
├── data\
├── work\
├── logs\
└── scripts\
    ├── install-runner.ps1
    ├── start-runner.ps1
    ├── stop-runner.ps1
    └── check-runner.ps1
```

### 启动方式

统一使用 **Windows 计划任务或服务化方式** 启动，禁止依赖临时终端手工常驻。

最低要求：
- 开机自动启动
- 失败可重启
- 有固定工作目录
- 有固定日志目录

### 日志目录

```text
C:\xiaoxia-ci\act_runner\logs\
```

至少保留：
- `runner.stdout.log`
- `runner.stderr.log`
- `runner.health.log`

### 工作目录

```text
C:\xiaoxia-ci\act_runner\work\
```

不得把 runner 工作目录放在随机用户临时目录。

---

## 配置要求

### config.yaml 最低要求

应明确：
- Gitea 实例地址
- runner 名称
- labels
- workdir
- 日志输出位置
- 容器 / shell 执行策略

示例字段（示意，不代表最终 token）：

```yaml
instance:
  url: https://api.xiaoxiajianji.com/git
  token: CHANGE_ME

runner:
  name: xiaoxia-windows-runner
  labels:
    - windows
    - local
    - xiaoxia-ci
  workdir: C:\xiaoxia-ci\act_runner\work
```

---

## 健康检查标准

必须能通过固定命令验证以下事实：

1. runner 进程存在
2. runner 配置文件存在
3. runner 工作目录存在
4. runner 最近日志有心跳/拉取任务痕迹
5. Gitea 新 run 不再长期停留在 `Waiting to run`

推荐检查命令：

```powershell
powershell -ExecutionPolicy Bypass -File C:\xiaoxia-ci\act_runner\scripts\check-runner.ps1
```

---

## 与仓库文档的关系

以下历史说法在 runner 正式落地前，不能再当作既成事实：

- `docs/CI-CD.md` 中“act_runner 已注册并持续运行”
- `docs/PHASE7-PROGRESS.md` 中“Gitea Runner 已运行”

以后必须改成：
- 已验证 runner 基础设施状态
- 已验证 runner 当前在线
- 已验证 runner 可消费指定 run

也就是：
**状态必须来自检查，不来自假设。**

---

## 验收标准

runner 基础设施完成的标准：

- [ ] `act_runner.exe` 有固定安装目录
- [ ] `config.yaml` 有固定路径
- [ ] 有固定启动脚本
- [ ] 有固定停止脚本
- [ ] 有固定健康检查脚本
- [ ] 开机自动启动机制已配置
- [ ] 日志目录固定
- [ ] 新 run 可以被稳定消费
- [ ] 文档中的 runner 状态表述与现实一致

---

## 当前结论

本专项当前真正缺的不是另一条 workflow patch，
而是 **runner 作为基础设施的正式纳管**。

并且根据现有仓库中的路径约定（如 `xiaoxia-server:/var/lib/xiaoxia-ci/xiaoxia-saas.git`），
runner / Gitea 的真实宿主很可能在服务器侧而非当前本机。

因此正式治理必须先回答一个基础问题：
**runner 到底运行在哪台机器上，并把这个事实写进文档和检查脚本。**
