−25%

Windows 按年付费,截至 10 月 31 日。 查看套餐

EQVPS
开始使用

在 VPS 上运行一个自托管的 GitHub Actions Runner

2026年7月27日 · 1 分钟阅读 · EQVPS Team

GitHub 托管的 runner 是个不错的默认。在一次构建想要它们没有的东西的那一刻,你就不再需要它们了——你的私有软件包仓库、一个你厌倦了每次运行都重装的特定工具链版本、你自己网络上的一个数据库,或只是对机器多一点掌控。那时,一台 VPS 上的自托管 runner 就值它的钱了。

本指南把一个 runner 正经跑起来:装好、注册、在 systemd 下活着,以及——人们弄错的部分——安全。我们从最后这个开始,因为它是咬人的那部分。

那一条安全规则

一个 GitHub Actions 工作流跑任意代码——工作流文件里的一切,以及那代码拉进来的一切。在你自己的仓库上那是你的代码,没问题。在一个公开仓库上,一个陌生人的 pull request 能在你的 runner 上跑他们的代码。那不是 bug;是 CI 就这么运作的。GitHub 自己的文档直白地说:别把自托管 runner 用在公开仓库上。

所以规则很简单、也不可商量:自托管 runner 是给私有仓库的。 如果你的仓库是公开的,用 GitHub 托管的 runner、往前走。下面的一切都假设一个私有仓库。

runner 需要机器提供什么

它取决于构建,你该按你的来配置、而不是照抄页面上的一个数字:

  • 一个典型的编译加测试任务 —— 2 核加 4-8 GB 就很舒服。Small($8,4 vCPU / 4 GB)或 Medium($12,6 vCPU / 6 GB)覆盖大多数这类。
  • 更重的构建 —— 大的原生编译、大的 Docker 镜像构建、吃内存的测试套件——想要更多余量。看一次真实运行(构建时开 htop)、按你实际看到的配置,而不是靠希望。

磁盘也要紧:构建缓存、Docker 层和克隆的仓库会累加。盯着它、及时清理。

1. 准备机器

给 runner 创建一个非 root 用户——反正 GitHub 的安装器拒绝以 root 跑,你也想要这样:

sudo adduser --disabled-password --gecos "" runner
sudo usermod -aG sudo runner   # 只在你的构建真的需要 sudo 时

装上你构建需要的一切——一个语言工具链、Docker、构建工具。比如,如果你的任务构建容器:

sudo apt update && sudo apt install -y docker.io
sudo usermod -aG docker runner

2. 下载并注册 runner

在 GitHub 上你的仓库(或组织)里,去 Settings → Actions → Runners → New self-hosted runner。GitHub 给你确切的下载命令和一个注册令牌(它是短期的——现拿现用)。以 runner 用户身份:

sudo -iu runner
mkdir actions-runner && cd actions-runner
# 用 GitHub 为你的 OS/arch 显示的确切 URL:
curl -o actions-runner-linux-x64.tar.gz -L "URL_FROM_GITHUB"
tar xzf actions-runner-linux-x64.tar.gz
./config.sh --url https://github.com/YOUR_ORG/YOUR_REPO --token YOUR_TOKEN

config.sh 问一个 runner 名字、标签和一个工作文件夹——起步用默认值就行。标签是你的工作流瞄准这个 runner 的方式(runs-on: self-hosted)。

3. 作为 systemd 服务来跑

runner 自带一个帮你安装 systemd 服务的辅助脚本——用它,好让 runner 熬过重启、失败时重启。仍然在 runner 用户的安装里,但服务命令需要 root:

sudo ./svc.sh install runner
sudo ./svc.sh start
sudo ./svc.sh status

那把 actions.runner.* 注册成一个以 runner 用户运行、开机启动的 systemd unit。日志进 journald:

sudo journalctl -u 'actions.runner.*' -f

回到 GitHub 的 Runners 页,你的 runner 现在显示 Idle——绿点。把一个工作流指向它:

jobs:
  build:
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v4
      - run: make test

推送,任务就在你的机器上跑。

4. 保持干净

一个自托管 runner 在任务之间复用它的文件系统——那是速度收益(热缓存),也是那把走火的枪(残留状态)。两个习惯让它健康:

  • 定期清理。 尤其是 Docker——docker system prune 放上 cron,否则磁盘会被死层悄悄填满。
  • 别在机器上存机密。 用 GitHub Actions secrets、按每次运行注入,而不是躺在 runner 家目录里的文件。如果 runner 被攻陷,磁盘上的任何东西都随它一起走。

如果你需要每个任务一个真正干净的环境,就把每个任务放进一个容器步骤里跑——runner 留着,任务的烂摊子不留。

什么时候该自托管,诚实地

当你需要把自己的工具链烤进去、访问私有网络资源、或对机器有掌控时自托管。当一个干净、一次性的环境和他们的分钟数适合你时,留在 GitHub 托管的 runner 上——那确实更简单,而简单值点东西。而且永远、在公开仓库上,别自托管。那一条不是偏好。

如果你需要的是一个私有仓库 runner:挑一个套餐——轻构建用 Small($8)、变重时用 Medium($12)——用 USDC 或 USDT 付款(无需 KYC、不用文件),你大约 60 秒就有 root。然后照着这一页往下做,几分钟后你就有一个在领任务的 runner 了。

查看套餐并订购 VPS →

常见问题

为什么跑我自己的 runner 而不是 GitHub 托管的?

三个真实理由:把你自己的依赖和工具链烤进去(不用每次运行都重装它们)、访问私有资源比如内部仓库或数据库、以及对机器的掌控——它的大小、它的缓存、它的网络。如果 GitHub 托管的分钟数和一个干净环境适合你,就留在上面。当你特别需要这三样之一时再自托管。

用一个自托管 runner 安全吗?

在私有仓库上,安全。在公开仓库上,不——永远别。一个工作流跑触发它的人的任意代码,在公开仓库上一个陌生人的 pull request 能在你的 runner 上跑他们的代码。GitHub 自己的文档也这么说。把自托管 runner 留给私有仓库,否则就接受你把机器交给了公网。

一个 runner 需要多少 CPU 和 RAM?

完全取决于你的构建。一个典型的编译加测试任务,2 核加 4-8 GB 就很舒服——这里的 Small 或 Medium。重的构建(大的原生编译、大的 Docker 镜像、吃内存的测试套件)想要更多,你该按你实际的任务配置,而不是猜。看一次真实运行你就知道了。

一个 runner 能处理多个仓库吗?

一个 runner 能注册到一个组织、被好几个仓库领用,默认一次一个任务。要更多并行,就跑更多 runner——每个是它自己的 systemd 服务。只要让它们全都在私有仓库上。

我需要给你们证件吗?

不用。邮箱注册、USDC 或 USDT 付款。不用文件,约一分钟拿到 root。

评论

暂无评论。来做第一个吧。

发表评论

评论在显示前会经过审核。