|
| 1 | +# 多组织共享 Runner 使用说明 |
| 2 | + |
| 3 | +本文档用于指导在同一台主机上部署两套(或多套)GitHub Actions Runner,并通过 `runner-wrapper` 实现: |
| 4 | + |
| 5 | +- 同板卡任务串行(避免硬件冲突) |
| 6 | +- 异板卡任务并行(提升吞吐) |
| 7 | +- 支持网页手动 `Cancel` 后的安全恢复 |
| 8 | + |
| 9 | +--- |
| 10 | + |
| 11 | +## 1. 适用场景 |
| 12 | + |
| 13 | +- 多个组织(或多个账号)共享同一块测试板卡。 |
| 14 | +- 需要保证同一资源标签(如 `roc-rk3568-pc`)不会并发操作硬件。 |
| 15 | +- 允许不同硬件标签(如 `roc-rk3568-pc` 与 `phytiumpi`)并行执行。 |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +## 2. 前置条件 |
| 20 | + |
| 21 | +- 同一台 Linux 主机(锁基于本机文件锁,跨主机不生效)。 |
| 22 | +- 已安装并可用: |
| 23 | + - `docker` / `docker compose` |
| 24 | + - `bash` |
| 25 | +- 两套有效的 GitHub 凭据(组织或账号均可)。 |
| 26 | + |
| 27 | +> 注意:不要提交 `.env*`(含 PAT)到仓库。 |
| 28 | +
|
| 29 | +--- |
| 30 | + |
| 31 | +## 3. 环境变量准备 |
| 32 | + |
| 33 | +为每个组织(或账号)准备独立 env 文件,例如: |
| 34 | + |
| 35 | +- `.env.orgA` |
| 36 | +- `.env.orgB` |
| 37 | + |
| 38 | +示例(两份都类似): |
| 39 | + |
| 40 | +```env |
| 41 | +ORG=your-org-or-user |
| 42 | +REPO=test-runner |
| 43 | +GH_PAT=ghp_xxx |
| 44 | +
|
| 45 | +RUNNER_RESOURCE_ID_PHYTIUMPI=board-phytiumpi |
| 46 | +RUNNER_RESOURCE_ID_ROC_RK3568_PC=board-roc-rk3568-pc |
| 47 | +RUNNER_LOCK_HOST_PATH=/tmp/github-runner-locks |
| 48 | +RUNNER_LOCK_DIR=/tmp/github-runner-locks |
| 49 | +``` |
| 50 | + |
| 51 | +关键要求: |
| 52 | + |
| 53 | +- 两套配置的 `RUNNER_RESOURCE_ID_*` 必须一致(同板卡共享同一锁)。 |
| 54 | +- 两套配置的 `RUNNER_LOCK_HOST_PATH` 必须一致(指向同一宿主机目录)。 |
| 55 | + |
| 56 | +--- |
| 57 | + |
| 58 | +## 4. 初次部署 |
| 59 | + |
| 60 | +在仓库根目录执行: |
| 61 | + |
| 62 | +```bash |
| 63 | +ENV_FILE=.env.orgA ./runner.sh init -n 2 |
| 64 | +ENV_FILE=.env.orgB ./runner.sh init -n 2 |
| 65 | +``` |
| 66 | + |
| 67 | +检查状态: |
| 68 | + |
| 69 | +```bash |
| 70 | +ENV_FILE=.env.orgA ./runner.sh ps |
| 71 | +ENV_FILE=.env.orgB ./runner.sh ps |
| 72 | +``` |
| 73 | + |
| 74 | +预期:两套都出现 `runner-roc-rk3568-pc`、`runner-phytiumpi` 且 `online`。 |
| 75 | + |
| 76 | +--- |
| 77 | + |
| 78 | +## 5. 日常更新(脚本/配置改动后) |
| 79 | + |
| 80 | +当修改了 `runner.sh` 或 `.env` 后: |
| 81 | + |
| 82 | +```bash |
| 83 | +ENV_FILE=.env.orgA ./runner.sh compose |
| 84 | +ENV_FILE=.env.orgB ./runner.sh compose |
| 85 | +docker compose -f docker-compose.<orgA>.<repo>.yml up -d --force-recreate |
| 86 | +docker compose -f docker-compose.<orgB>.<repo>.yml up -d --force-recreate |
| 87 | +``` |
| 88 | + |
| 89 | +如果修改了镜像内依赖(例如 Dockerfile),再执行: |
| 90 | + |
| 91 | +```bash |
| 92 | +ENV_FILE=.env.orgA ./runner.sh image |
| 93 | +``` |
| 94 | + |
| 95 | +> 当前实现已把 `./runner-wrapper` 目录只读挂载进板卡容器,`pre/post` 脚本改动通常不需要重建镜像,只需 `compose + force-recreate`。 |
| 96 | +
|
| 97 | +--- |
| 98 | + |
| 99 | +## 6. 验证方法 |
| 100 | + |
| 101 | +### 6.1 同板卡串行验证(应串行) |
| 102 | + |
| 103 | +两边同时触发: |
| 104 | + |
| 105 | +```yaml |
| 106 | +runs-on: [self-hosted, linux, roc-rk3568-pc] |
| 107 | +``` |
| 108 | +
|
| 109 | +步骤里包含: |
| 110 | +
|
| 111 | +```yaml |
| 112 | +- run: echo "START $(date -Iseconds)" |
| 113 | +- run: sleep 120 |
| 114 | +- run: echo "END $(date -Iseconds)" |
| 115 | +``` |
| 116 | +
|
| 117 | +预期: |
| 118 | +
|
| 119 | +- 一个先 Running,另一个先 Waiting; |
| 120 | +- 前者结束后后者开始; |
| 121 | +- 两个 `sleep 120` 时间段不重叠。 |
| 122 | + |
| 123 | +### 6.2 异板卡并行验证(应并行) |
| 124 | + |
| 125 | +- 任务 A:`roc-rk3568-pc` |
| 126 | +- 任务 B:`phytiumpi` |
| 127 | + |
| 128 | +预期:两者可同时 Running,执行时间有重叠。 |
| 129 | + |
| 130 | +--- |
| 131 | + |
| 132 | +## 7. Cancel 场景说明 |
| 133 | + |
| 134 | +允许在网页点 `Cancel`,但建议遵循: |
| 135 | + |
| 136 | +- 重要验证尽量让任务自然结束; |
| 137 | +- 若中途取消后出现异常(如等待异常、状态不同步),执行一次清场: |
| 138 | + |
| 139 | +```bash |
| 140 | +sudo rm -f /tmp/github-runner-locks/*.holder /tmp/github-runner-locks/*.release |
| 141 | +sudo chmod 1777 /tmp/github-runner-locks |
| 142 | +sudo find /tmp/github-runner-locks -maxdepth 1 -type f -name 'board-*' -exec chmod 666 {} \; |
| 143 | +docker restart <orgA-roc-container> |
| 144 | +docker restart <orgB-roc-container> |
| 145 | +``` |
| 146 | + |
| 147 | +当前锁实现已包含: |
| 148 | + |
| 149 | +- 按 `RUNNER_NAME + GITHUB_RUN_ID + GITHUB_RUN_ATTEMPT` 生成唯一 release 文件; |
| 150 | +- 防止旧任务 post-hook 误释放新任务锁(cancel 竞态保护)。 |
| 151 | + |
| 152 | +--- |
| 153 | + |
| 154 | +## 8. 常见问题 |
| 155 | + |
| 156 | +### 8.1 一直 `Waiting for a runner to pick up this job...` |
| 157 | + |
| 158 | +优先检查: |
| 159 | + |
| 160 | +- 该组织/仓库下 runner 是否 `online` |
| 161 | +- 标签是否精确匹配(`self-hosted, linux, roc-rk3568-pc`) |
| 162 | +- Runner group 是否授权目标仓库 |
| 163 | + |
| 164 | +### 8.2 Runner 全部 `offline` |
| 165 | + |
| 166 | +常见原因是代理配置错误(例如容器内 `127.0.0.1:7890` 不可达)。 |
| 167 | + |
| 168 | +当前脚本已改为:仅当显式设置 `HTTP_PROXY/HTTPS_PROXY/NO_PROXY` 时才注入代理变量。 |
| 169 | + |
| 170 | +### 8.3 明明改了脚本,但容器没生效 |
| 171 | + |
| 172 | +执行: |
| 173 | + |
| 174 | +```bash |
| 175 | +ENV_FILE=.env.<org> ./runner.sh compose |
| 176 | +docker compose -f docker-compose.<org>.<repo>.yml up -d --force-recreate |
| 177 | +``` |
| 178 | + |
| 179 | +并在容器内检查脚本关键字是否存在。 |
| 180 | + |
0 commit comments