GitHub Actions 自建 Runner 实战:Orange Pi 5 Pro 搭建教程
GitHub Actions 的免费额度不够用?本文记录如何用一台 Orange Pi 5 Pro 搭建 GitHub Self-hosted Runner,把
go test、docker build、自动部署这些任务从 GitHub 云 Runner 迁移到自己的服务器上,并附上整个过程中踩过的坑。
需求背景
GitHub Actions 的免费额度用完,不想为此付费,于是想到:
利用自己的服务器(Orange Pi 5 Pro)运行 CI/CD,而不是使用 GitHub 提供的云 Runner。
最终选择的方案是 GitHub Self-hosted Runner——GitHub 的 Actions 任务不再跑在云端,而是下发到我们自己的机器上执行。
1 | GitHub Repository |
一、安装 Runner
服务器信息:
1 | Orange Pi 5 Pro |
创建目录并进入:
1 | mkdir -p /opt/actions-runner |
接下来从 GitHub 官方 Releases 页面下载对应版本的 Runner 压缩包。注意 Orange Pi 是 ARM 架构,一定要选择 Linux ARM64 的包(actions-runner-linux-arm64-x.x.x.tar.gz),不要下成 x64。
下载后解压:
1 | tar -xzf actions-runner-linux-arm64-*.tar.gz |
二、踩坑一:权限错误
执行 ./config.sh 时报错:
1 | touch: cannot touch '.env': Permission denied |
原因
之前可能是用 root 用户下载/解压的 Runner,导致 /opt/actions-runner 目录的 owner 是 root:
1 | /opt/actions-runner |
而现在用 orangepi 用户运行,自然没有写入权限。
解决
把目录所有权交给运行用户:
1 | sudo chown -R orangepi:orangepi /opt/actions-runner |
⚠️ 注意:配置和运行 Runner 时不要加 sudo。GitHub Runner 明确禁止以 root 运行,会直接报错:
1 | Must not run with sudo |
正确姿势是直接执行:
1 | ./config.sh |
三、注册 Runner
执行配置命令(url 换成自己的仓库,token 在 GitHub 仓库的 Settings → Actions → Runners → New self-hosted runner 页面获取):
1 | ./config.sh \ |
配置过程有几步交互式提问,很容易填错,逐个说明:
1. Runner Group:直接回车
1 | Enter the name of the runner group |
这里直接回车,使用默认的 Default 分组。
❌ 错误示范:输入了仓库名(比如 binbatlab),会报:
1 | Could not find any self-hosted runner group named "binbatlab" |
2. Runner Name:这里才填名字
1 | Enter the name of runner |
例如:
1 | DI-TING |
或者用机器名:
1 | orangepi5pro |
3. Labels:默认即可
默认标签是:
1 | self-hosted |
因为 Orange Pi 是 ARM64 架构,这些标签后面写 workflow 时会用到,先保留默认即可。
配置成功会看到:
1 | √ Runner successfully added |
四、启动测试
运行:
1 | ./run.sh |
看到以下输出说明 Runner 已经在线:
1 | √ Connected to GitHub |
Listening for Jobs 表示 Runner 已连上 GitHub,正在等待任务下发。
五、让 Runner 后台常驻:systemd
直接 ./run.sh 有两个问题:
- SSH 断开后进程退出
- 重启机器后 Runner 消失
所以要用 systemd 托管。GitHub 官方在解压目录里自带了脚本 svc.sh,推荐直接用:
1 | cd /opt/actions-runner |
查看状态:
1 | sudo ./svc.sh status |
这样以后 Orange Pi 一开机,systemd 就会自动拉起 Runner,完全不用管:
1 | Orange Pi 开机 |
六、踩坑二:多仓库问题
给另一个仓库配置时:
1 | ./config.sh \ |
报错:
1 | Cannot configure the runner because it is already configured |
原因
当前目录已经绑定到了 binbatlab/DI-TING。Runner 的配置保存在:
1 | /opt/actions-runner/.runner |
一个 Repository Runner 不能直接改绑另一个仓库。
方案 A:Organization Runner(推荐长期使用)
注册时 url 填组织而不是具体仓库:
1 | ./config.sh \ |
效果:组织下的所有仓库共享这一个 Runner:
1 | Bin-hy Organization |
方案 B:多个 Runner
复制多个目录,每个 Runner 绑定一个仓库:
1 | /opt/actions-runner-diting |
每个目录分别执行 config.sh 注册到各自的仓库。
七、修改工作流 YAML
以前用的是 GitHub 云 Runner:
1 | jobs: |
改成使用自己的 Orange Pi:
1 | jobs: |
更精准一点,用标签组合限定架构:
1 | jobs: |
⚠️ 特别注意:runs-on 匹配的是 label(标签),不是 Runner 名字。所以像下面这样写是无效的:
1 | jobs: |
八、最终架构
整套流程的目标架构:
1 | GitHub |
到目前为止已经完成:
✅ Orange Pi 上安装 Runner
✅ Runner 注册成功
✅ Runner 可以监听 Job
✅ systemd 后台常驻运行
✅ 掌握 YAML 修改方式
✅ 理解 Repository Runner 与 Organization Runner 的区别
下一步计划
- CI 自动测试:
1 | git push |
- CD 自动部署:
1 | git push |
- 与 Dokploy 集成:
1 | GitHub |
到这一步,一套完整的个人 DevOps 平台基本就成型了。

