Skip to content

Commit 882c033

Browse files
committed
feat: add x86_64 board runner
1 parent 490cfa7 commit 882c033

File tree

5 files changed

+68
-12
lines changed

5 files changed

+68
-12
lines changed

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ GH_PAT=
2424
# 多组织共享同一块板时显式设相同 ID:
2525
# RUNNER_RESOURCE_ID_PHYTIUMPI=board-phytiumpi
2626
# RUNNER_RESOURCE_ID_ROC_RK3568_PC=board-roc-rk3568-pc
27+
# RUNNER_RESOURCE_ID_X86_64=board-x86_64
2728
# RUNNER_LOCK_DIR=/tmp/github-runner-locks
2829
# RUNNER_LOCK_HOST_PATH=/tmp/github-runner-locks
2930

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ cp .env.example .env
5454
| `./runner.sh rm [runner-<id> ...] [-y]` | Unregister and remove containers; `-y` skips confirmation |
5555
| `./runner.sh purge [-y]` | Remove containers and generated files (`docker-compose.yml`, caches, etc.) |
5656

57-
> **Note**: The `init` command creates two hardware-based runners (phytiumpi and roc-rk3568-pc) by default. This behavior is not controlled by the `-n` parameter.
57+
> **Note**: The `init` command creates three hardware-based runners (phytiumpi, roc-rk3568-pc, and x86_64-pc) by default. This behavior is not controlled by the `-n` parameter.
5858
5959
## Configuration
6060

@@ -68,7 +68,7 @@ The default prefix automatically includes `ORG` (and `REPO` if set), formatted a
6868
name:label1[,label2];name2:label1
6969
```
7070

71-
Example: `phytiumpi:arm64,phytiumpi;roc-rk3568-pc:arm64,roc-rk3568-pc`
71+
Example: `phytiumpi:arm64,phytiumpi;roc-rk3568-pc:arm64,roc-rk3568-pc;x86_64-pc:x86_64`
7272

7373
Board instances will only use labels defined in `BOARD_RUNNERS` and will not append global `RUNNER_LABELS`.
7474

@@ -98,7 +98,7 @@ When multiple containers need to access the same physical hardware, concurrent j
9898

9999
### Configuration
100100

101-
When using environments generated by **runner.sh**, board runners have the wrapper enabled by default with the shared lock directory `/tmp/github-runner-locks` mounted. Board-level environment variables (e.g., `RUNNER_RESOURCE_ID_PHYTIUMPI`) take priority; otherwise, default values are used (phytiumpi: `board-phytiumpi`, roc-rk3568-pc: `board-roc-rk3568-pc`).
101+
When using environments generated by **runner.sh**, board runners have the wrapper enabled by default with the shared lock directory `/tmp/github-runner-locks` mounted. Board-level environment variables (e.g., `RUNNER_RESOURCE_ID_PHYTIUMPI`) take priority; otherwise, default values are used (phytiumpi: `board-phytiumpi`, roc-rk3568-pc: `board-roc-rk3568-pc`, x86_64-pc: `board-x86_64-pc`).
102102

103103
To **share the same board across multiple organizations**, simply set the same lock ID for that board in each `.env` file. This ensures that even if runner containers from both organizations receive jobs simultaneously, they will queue via file locks to avoid hardware conflicts.
104104

README_CN.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ cp .env.example .env
5454
| `./runner.sh rm [runner-<id> ...] [-y]` | 取消注册并删除容器;`-y` 跳过确认 |
5555
| `./runner.sh purge [-y]` | 删除容器并移除生成文件(`docker-compose.yml`、缓存等) |
5656

57-
> **注意**`init` 命令默认会创建两个基于硬件的 Runner(phytiumpiroc-rk3568-pc),此行为不受 `-n` 参数控制。
57+
> **注意**`init` 命令默认会创建三个基于硬件的 Runner(phytiumpiroc-rk3568-pc 和 x86_64),此行为不受 `-n` 参数控制。
5858
5959
## 配置说明
6060

@@ -68,7 +68,7 @@ cp .env.example .env
6868
name:label1[,label2];name2:label1
6969
```
7070

71-
示例:`phytiumpi:arm64,phytiumpi;roc-rk3568-pc:arm64,roc-rk3568-pc`
71+
示例:`phytiumpi:arm64,phytiumpi;roc-rk3568-pc:arm64,roc-rk3568-pc;x86_64:x86_64`
7272

7373
开发板实例将仅使用 `BOARD_RUNNERS` 中定义的标签,不会追加全局 `RUNNER_LABELS`
7474

@@ -98,7 +98,7 @@ name:label1[,label2];name2:label1
9898

9999
### 配置方法
100100

101-
使用 **runner.sh** 生成的环境,板子 runner 默认启用 wrapper 并挂载共享锁目录 `/tmp/github-runner-locks`。优先使用板子级环境变量(如 `RUNNER_RESOURCE_ID_PHYTIUMPI`),否则使用默认值(phytiumpi: `board-phytiumpi`,roc-rk3568-pc: `board-roc-rk3568-pc`)。
101+
使用 **runner.sh** 生成的环境,板子 runner 默认启用 wrapper 并挂载共享锁目录 `/tmp/github-runner-locks`。优先使用板子级环境变量(如 `RUNNER_RESOURCE_ID_PHYTIUMPI`),否则使用默认值(phytiumpi: `board-phytiumpi`,roc-rk3568-pc: `board-roc-rk3568-pc`,x86_64-pc: `board-x86_64-pc`)。
102102

103103
如果要在**多组织中共享同一块板时**,则只需要在各自的 `.env` 中为该板设置相同的锁 ID。这样,即使两个组织的 runner 容器同时收到 job,也会通过文件锁排队执行,避免硬件冲突。
104104

runner.sh

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ fi
3737
RUNNER_GROUP="${RUNNER_GROUP:-Default}"
3838
RUNNER_WORKDIR="${RUNNER_WORKDIR:-}"
3939
RUNNER_LABELS="${RUNNER_LABELS:-intel}"
40-
RUNNER_BOARD="2"
40+
RUNNER_BOARD="3"
4141
DISABLE_AUTO_UPDATE="${DISABLE_AUTO_UPDATE:-false}"
4242
# 板子级:未设置时用本板默认值(同类型板串行、不同类型板并行);多组织共享同一块板时显式设为相同 ID 即可
4343
RUNNER_RESOURCE_ID_PHYTIUMPI="${RUNNER_RESOURCE_ID_PHYTIUMPI:-}"
4444
RUNNER_RESOURCE_ID_ROC_RK3568_PC="${RUNNER_RESOURCE_ID_ROC_RK3568_PC:-}"
45+
RUNNER_RESOURCE_ID_X86_64_PC="${RUNNER_RESOURCE_ID_X86_64_PC:-}"
4546
RUNNER_LOCK_DIR="${RUNNER_LOCK_DIR:-/tmp/github-runner-locks}"
4647
RUNNER_LOCK_HOST_PATH="${RUNNER_LOCK_HOST_PATH:-/tmp/github-runner-locks}"
4748
# Compose 文件名:未显式设置时自动拼入 ORG/REPO,避免同一主机多组织时文件冲突
@@ -124,6 +125,7 @@ shell_usage() {
124125
printf " %-${KEYW}s %s\n" "RUNNER_CUSTOM_IMAGE" "Image tag used for auto-build (can override)"
125126
printf " %-${KEYW}s %s\n" "RUNNER_RESOURCE_ID_PHYTIUMPI" "Lock ID for phytiumpi board (default: board-phytiumpi); same ID = serial across runners"
126127
printf " %-${KEYW}s %s\n" "RUNNER_RESOURCE_ID_ROC_RK3568_PC" "Lock ID for roc-rk3568-pc board (default: board-roc-rk3568-pc); same ID = serial"
128+
printf " %-${KEYW}s %s\n" "RUNNER_RESOURCE_ID_X86_64_PC" "Lock ID for x86_64-pc board (default: board-x86_64-pc); same ID = serial"
127129
printf " %-${KEYW}s %s\n" "RUNNER_LOCK_DIR" "Lock dir in container (default /tmp/github-runner-locks)"
128130
printf " %-${KEYW}s %s\n" "RUNNER_LOCK_HOST_PATH" "Lock dir on host for bind mount (default /tmp/github-runner-locks)"
129131
echo
@@ -492,9 +494,11 @@ shell_generate_compose_file() {
492494
# 第一步:为两种板子 runner 类型定义资源 ID
493495
# ════════════════════════════════════════════════════════════════
494496
# 硬件板 phytiumpi - 总是启用文件锁
495-
local res_phytiumpi="${RUNNER_RESOURCE_ID_PHYTIUMPI:-}"
497+
local res_phytiumpi="${RUNNER_RESOURCE_ID_PHYTIUMPI:-board-phytiumpi}"
496498
# 硬件板 roc - 总是启用文件锁
497-
local res_roc="${RUNNER_RESOURCE_ID_ROC_RK3568_PC:-}"
499+
local res_roc="${RUNNER_RESOURCE_ID_ROC_RK3568_PC:-board-roc-rk3568-pc}"
500+
# 硬件板 x86_64 - 总是启用文件锁
501+
local res_x86_64="${RUNNER_RESOURCE_ID_X86_64_PC:-board-x86_64-pc}"
498502

499503
# ════════════════════════════════════════════════════════════════
500504
# 第二步:两种板子 runner 类型的 entrypoint 配置
@@ -504,9 +508,11 @@ shell_generate_compose_file() {
504508
# 普通 runner 始终使用 /home/runner/run.sh(不经过 runner-wrapper)
505509
local runner_entrypoint_phytiumpi="/home/runner/run.sh"
506510
local runner_entrypoint_roc="/home/runner/run.sh"
511+
local runner_entrypoint_x86_64="/home/runner/run.sh"
507512
# 若设置了资源 ID,则改用 runner-wrapper 来处理文件锁
508513
[[ -n "$res_phytiumpi" ]] && runner_entrypoint_phytiumpi="/home/runner/runner-wrapper/runner-wrapper.sh"
509514
[[ -n "$res_roc" ]] && runner_entrypoint_roc="/home/runner/runner-wrapper/runner-wrapper.sh"
515+
[[ -n "$res_x86_64" ]] && runner_entrypoint_x86_64="/home/runner/runner-wrapper/runner-wrapper.sh"
510516

511517
# ════════════════════════════════════════════════════════════════
512518
# 第三步:为两种板子 runner 类型准备额外的环境变量数组
@@ -520,10 +526,12 @@ shell_generate_compose_file() {
520526
# 原因:两种板子 runner 都可能需要文件锁机制
521527
local extra_env_phytiumpi=()
522528
local extra_env_roc=()
529+
local extra_env_x86_64=()
523530
local extra_proxy_env=()
524531
# 只有设置了相应的资源 ID,才为该类型 runner 添加锁相关环境变量
525532
[[ -n "$res_phytiumpi" ]] && extra_env_phytiumpi=(" RUNNER_RESOURCE_ID: \"$res_phytiumpi\"" " RUNNER_SCRIPT: \"/home/runner/run.sh\"" " RUNNER_LOCK_DIR: \"${RUNNER_LOCK_DIR:-/tmp/github-runner-locks}\"")
526533
[[ -n "$res_roc" ]] && extra_env_roc=(" RUNNER_RESOURCE_ID: \"$res_roc\"" " RUNNER_SCRIPT: \"/home/runner/run.sh\"" " RUNNER_LOCK_DIR: \"${RUNNER_LOCK_DIR:-/tmp/github-runner-locks}\"")
534+
[[ -n "$res_x86_64" ]] && extra_env_x86_64=(" RUNNER_RESOURCE_ID: \"$res_x86_64\"" " RUNNER_SCRIPT: \"/home/runner/run.sh\"" " RUNNER_LOCK_DIR: \"${RUNNER_LOCK_DIR:-/tmp/github-runner-locks}\"")
527535
[[ -n "${HTTP_PROXY:-}" ]] && extra_proxy_env+=(" HTTP_PROXY: \"${HTTP_PROXY}\"")
528536
[[ -n "${HTTPS_PROXY:-}" ]] && extra_proxy_env+=(" HTTPS_PROXY: \"${HTTPS_PROXY}\"")
529537
[[ -n "${NO_PROXY:-}" ]] && extra_proxy_env+=(" NO_PROXY: \"${NO_PROXY}\"")
@@ -536,9 +544,11 @@ shell_generate_compose_file() {
536544
# 原因:文件锁机制需要在主机和容器间共享锁文件
537545
local extra_vol_phytiumpi=""
538546
local extra_vol_roc=""
547+
local extra_vol_x86_64=""
539548
# 只有设置了相应的资源 ID,才为该类型 runner 挂载锁文件目录
540549
[[ -n "$res_phytiumpi" ]] && extra_vol_phytiumpi=" - ${RUNNER_LOCK_HOST_PATH:-/tmp/github-runner-locks}:${RUNNER_LOCK_DIR:-/tmp/github-runner-locks}"
541550
[[ -n "$res_roc" ]] && extra_vol_roc=" - ${RUNNER_LOCK_HOST_PATH:-/tmp/github-runner-locks}:${RUNNER_LOCK_DIR:-/tmp/github-runner-locks}"
551+
[[ -n "$res_x86_64" ]] && extra_vol_x86_64=" - ${RUNNER_LOCK_HOST_PATH:-/tmp/github-runner-locks}:${RUNNER_LOCK_DIR:-/tmp/github-runner-locks}"
542552

543553
# 使用 printf 输出文件头
544554
printf '%s\n' \
@@ -703,6 +713,43 @@ shell_generate_compose_file() {
703713
" - ${RUNNER_NAME_PREFIX}runner-roc-rk3568-pc-data:/home/runner" \
704714
" - ${RUNNER_NAME_PREFIX}runner-roc-rk3568-pc-udev-rules:/etc/udev/rules.d" \
705715
"" >> "${COMPOSE_FILE}"
716+
717+
# x86_64 板子配置
718+
printf '%s\n' \
719+
" ${RUNNER_NAME_PREFIX}runner-x86_64-pc:" \
720+
" <<: *runner_base" \
721+
" container_name: \"${RUNNER_NAME_PREFIX}runner-x86_64-pc\"" \
722+
" command: [\"${runner_entrypoint_x86_64}\"]" \
723+
" devices:" \
724+
" - /dev/loop-control:/dev/loop-control" \
725+
" - /dev/loop0:/dev/loop0" \
726+
" - /dev/loop1:/dev/loop1" \
727+
" - /dev/loop2:/dev/loop2" \
728+
" - /dev/loop3:/dev/loop3" \
729+
" - /dev/kvm:/dev/kvm" \
730+
" - /dev/ttyUSB4:/dev/ttyUSB4" \
731+
" - /dev/ttyUSB5:/dev/ttyUSB5" \
732+
" group_add:" \
733+
" - 993" \
734+
" - dialout" \
735+
" environment:" \
736+
" <<: *runner_env" \
737+
" RUNNER_NAME: \"${RUNNER_NAME_PREFIX}runner-x86_64-pc\"" \
738+
" RUNNER_LABELS: \"x86_64-pc\"" \
739+
" BOARD_POWER_ON: \"mbpoll -m rtu -a 1 -r 1 -t 0 -b 38400 -P none -v /dev/ttyUSB4 1\"" \
740+
" BOARD_POWER_OFF: \"mbpoll -m rtu -a 1 -r 1 -t 0 -b 38400 -P none -v /dev/ttyUSB4 0\"" \
741+
" BOARD_POWER_RESET: \"mbpoll -m rtu -a 1 -r 1 -t 0 -b 38400 -P none -v /dev/ttyUSB4 0 && sleep 2 && mbpoll -m rtu -a 1 -r 1 -t 0 -b 38400 -P none -v /dev/ttyUSB4 1\"" \
742+
" BOARD_COMM_UART_DEV: \"/dev/ttyUSB5\"" \
743+
" BOARD_COMM_UART_BAUD: \"115200\"" \
744+
" BIN_DIR: \"/home/runner/test/x86_64-pc\"" \
745+
"${extra_env_x86_64[@]}" \
746+
" volumes:" \
747+
" - /home/$(whoami)/test/x86_64-pc:/home/runner/tftp" \
748+
"$extra_vol_x86_64" \
749+
" - ./runner-wrapper:/home/runner/runner-wrapper:ro" \
750+
" - ${RUNNER_NAME_PREFIX}runner-x86_64-pc-data:/home/runner" \
751+
" - ${RUNNER_NAME_PREFIX}runner-x86_64-pc-udev-rules:/etc/udev/rules.d" \
752+
"" >> "${COMPOSE_FILE}"
706753
fi
707754

708755
# 生成 volumes
@@ -731,6 +778,13 @@ shell_generate_compose_file() {
731778
" name: ${RUNNER_NAME_PREFIX}runner-roc-rk3568-pc-data" \
732779
" ${RUNNER_NAME_PREFIX}runner-roc-rk3568-pc-udev-rules:" \
733780
" name: ${RUNNER_NAME_PREFIX}runner-roc-rk3568-pc-udev-rules" >> "${COMPOSE_FILE}"
781+
782+
# 为 x86_64 板子生成 volumes
783+
printf '%s\n' \
784+
" ${RUNNER_NAME_PREFIX}runner-x86_64-pc-data:" \
785+
" name: ${RUNNER_NAME_PREFIX}runner-x86_64-pc-data" \
786+
" ${RUNNER_NAME_PREFIX}runner-x86_64-pc-udev-rules:" \
787+
" name: ${RUNNER_NAME_PREFIX}runner-x86_64-pc-udev-rules" >> "${COMPOSE_FILE}"
734788
fi
735789
}
736790

verify-changes.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ cd "$(dirname "$0")"
77

88
echo "========== 1. 验证板子锁 ID(不回退到 RUNNER_RESOURCE_ID)=========="
99
export RUNNER_RESOURCE_ID=global-should-not-be-used
10-
unset RUNNER_RESOURCE_ID_PHYTIUMPI RUNNER_RESOURCE_ID_ROC_RK3568_PC
10+
unset RUNNER_RESOURCE_ID_PHYTIUMPI RUNNER_RESOURCE_ID_ROC_RK3568_PC RUNNER_RESOURCE_ID_X86_64
1111
# 加载 .env 会覆盖,所以这里直接按 runner.sh 逻辑算板子默认
1212
res_phytiumpi="${RUNNER_RESOURCE_ID_PHYTIUMPI:-board-phytiumpi}"
1313
res_roc="${RUNNER_RESOURCE_ID_ROC_RK3568_PC:-board-roc-rk3568-pc}"
14-
if [[ "$res_phytiumpi" == "board-phytiumpi" && "$res_roc" == "board-roc-rk3568-pc" ]]; then
14+
res_x86_64="${RUNNER_RESOURCE_ID_X86_64_PC:-board-x86_64-pc}"
15+
if [[ "$res_phytiumpi" == "board-phytiumpi" && "$res_roc" == "board-roc-rk3568-pc" && "$res_x86_64" == "board-x86_64-pc" ]]; then
1516
echo " [OK] 未设板子变量时使用 per-board 默认,未使用 global RUNNER_RESOURCE_ID"
1617
else
17-
echo " [FAIL] res_phytiumpi=$res_phytiumpi res_roc=$res_roc"
18+
echo " [FAIL] res_phytiumpi=$res_phytiumpi res_roc=$res_roc res_x86_64=$res_x86_64"
1819
exit 1
1920
fi
2021

0 commit comments

Comments
 (0)