用自己的 Forgejo Runner 在 Codeberg 上跑 CI/CD
为什么自己跑 CI/CD?
用过 Codeberg 的朋友应该都知道,它是目前 GitHub 之外一个很不错的替代选择。平台开源、注重隐私,还由非营利组织维护。不过因为资源有限,Codeberg 提供的共享 runner 经常要排队,速度和稳定性都不太理想。
那怎么办?自己架一个 Forgejo runner 就行了。好处是 runner 是主动往外连 Codeberg 的,所以不管你用 VPS、家里服务器还是笔记本,都能直接跑,不用折腾端口映射。
先搞懂架构
简单来说,Forgejo runner 就是一个干活的,它负责接收 Codeberg 发来的任务,然后执行。考虑到安全,我们不会让 runner 直接碰主机上的 Docker,而是用 Docker-in-Docker(DinD)把它隔离开。这样 runner 自己起容器跑任务,不会影响主机环境。
用 Docker Compose 部署
整个部署只需要两个容器:
version: '3.8'
services:
docker-in-docker:
image: docker:dind
container_name: 'docker_dind'
privileged: 'true'
command: ['dockerd', '-H', 'tcp://0.0.0.0:2375', '--tls=false']
restart: 'unless-stopped'
runner:
image: 'data.forgejo.org/forgejo/runner:12'
links:
- docker-in-docker
depends_on:
docker-in-docker:
condition: service_started
container_name: 'runner'
environment:
DOCKER_HOST: tcp://docker-in-docker:2375
user: 1001:1001
volumes:
- ./data:/data
restart: 'unless-stopped'
command: 'forgejo-runner daemon --config runner-config.yml'
一个容器提供隔离的 Docker 环境,另一个就是实际跑任务的 runner。
准备系统环境
先建好目录结构,建议把配置放在 /opt/forgejo-runner:
cd /opt/forgejo-runner
mkdir -p data/.cache
chown -R 1001:1001 data
chmod 775 data/.cache
chmod g+s data/.cache
然后生成默认配置文件:
sudo sh -c 'docker run --rm data.forgejo.org/forgejo/runner:12 forgejo-runner generate-config > data/runner-config.yml'
在 Codeberg 上注册 runner
登录 Codeberg,进入账号或组织设置,找到 Actions → Runners,点击“Create new runner”。给 runner 起个名字,填上描述。
系统会生成 UUID 和 Token,记得马上抄下来,这两个信息之后不会再显示。
Codeberg 还会直接给你一段 YAML 配置代码,直接复制就行。
配置 Labels 和并发数
打开 runner-config.yml,主要做两件事:
1. 填认证信息
把 Codeberg 给的 UUID 和 Token 填到 server 部分。
2. 设置 Labels
Labels 决定 workflow 怎么找到你的 runner,格式是 [Workflow Label]:[Method]://[环境]。
比如:
labels:
- 'ubuntu-latest:docker://node:20-bookworm'
- 'ubuntu-22.04:docker://node:20-bookworm'
- 'ubuntu-24.04:docker://node:22-bookworm'
当 workflow 写 runs-on: ubuntu-latest 时,Codeberg 就会把任务分配给这个 runner。
可选:调整并发
默认 runner 一次只能跑一个任务。如果你机器配置不错,可以把 capacity 改成 4,让它同时处理多个任务。
启动运行
配置好后,直接启动:
docker-compose up -d
用日志查看是否连接成功:
docker-compose logs -f runner
看到 runner 注册成功的提示,就说明一切正常了。之后你仓库里的 workflow,只要指定了你的 Labels,就会跑到你自己的 runner 上执行。
自己跑的好处
- 任务直接执行,不用排队
- 完全控制运行环境和依赖
- 省钱,还能减轻 Codeberg 的负担
- 日志和数据留在自己手上,更放心
- 可以根据需求随时扩容
总结
自己搭 Forgejo runner 其实挺简单的,花一个下午就能搞定,而且效果立竿见影。如果你已经在用 Codeberg,这几乎是下一步的自然选择。如果还在 GitHub 纠结要不要换,CI/CD 的速度和稳定性往往是决定因素,而现在你完全可以自己掌控。