自建 Git 服务器省下的钱,够不够付你周末的加班费——一个 12 人团队从 GitHub 搬去 Gitea 又搬回来的完整账本

🔑 关键词:GitHub, Gitea, 自建Git服务器, GitHub Actions 免费额度, 代码托管对比

📖 摘要:12 人团队把 217 个仓库从 GitHub 迁到自建 Gitea,跑了 47 天又搬回来。文章把 CI 分钟数、LFS 额度、迁移坑、生态替代成本全部摊开算,最后给出什么情况下才值得自建的判断标准。

先说结论:我又搬回来了

图片

上个月我们把团队 217 个仓库从 GitHub 迁到自建的 Gitea,跑了 47 天,上周又全部迁回去了。来回折腾掉的时间,按我自己的时薪算大概值 6000 多块,还不算另外两个同事被我拉进来帮忙的三个晚上。这篇文章把账摊开算,顺便说说我为什么现在的结论是——大部分中小团队根本不该自建 Git 服务器。

先说为什么动这个念头吧。三个原因堆在一起:一是 CI 分钟数不够用,二是国内访问 GitHub 那个速度实在难受,三是老板在季度会上随口问了一句,我们的代码放在别人家里安不安全。第三个原因最虚,但它往往是真正推动项目立项的那个。

CI 分钟数是真疼,疼到我想自己买机器

图片

我们是一个 monorepo,pnpm 加 Node 20,单次完整流水线大概是:装依赖带缓存 1 分 20 秒,lint 40 秒,单测 2 分 10 秒,build 1 分 50 秒,加起来 6 分钟出头。听着不多对吧?但我们有三个平台的矩阵测试,windows runner 的计费倍率是 2 倍,macos 是 10 倍。一次 macos 的 build 跑 8 分钟,账上就按 80 分钟扣你。团队 12 个人,平均一天 push 15 次左右,月中不到 Free 档的 2000 分钟就见底了。

GitHub Team 是 4 美元一个人一个月,12 个人一年 576 美元,但 Team 的 Actions 额度也只有 3000 分钟,超了照样收钱:Linux 是 0.008 美元一分钟,Windows 0.016,macos 0.08,十倍差价是真的。我们有段时间每天看 Actions 账单跟看股票似的,涨一点心就揪一下。

图片

选 Gitea 而不是 GitLab,是因为我被 OOM 踢过一次

自建方案我选了 Gitea,不是 GitLab。原因很俗:GitLab CE 官方推荐 4 核 8G 起步,我在一台 2 核 4G 的轻量服务器上装过,puma 加 sidekiq 加 postgres 加 redis 一套拉起来,内存直接吃到 3.5G,跑了一晚上 OOM,把我 SSH 会话都踢了。Gitea 是 Go 写的单二进制,解压出来 110MB 左右,用 SQLite 当库跑起来常驻内存 200 多 MB,2 核 4G 的机器连 act_runner 一起塞得下,这点确实舒服。

act_runner 是 Gitea Actions 的执行器,yml 语法基本兼容 GitHub Actions,这是当初最吸引我的点。但兼容的是语法,不是生态。你写 uses 引一个官方 action,runner 还是得去 GitHub 上拉那个仓库,等于你自建了跑步机,跑步鞋还在别人家鞋柜里。我们后来把所有 action 换成本地 shell 脚本,或者干脆 vendor 到仓库里,光一个 checkout 的替代脚本就写了半天。

图片

迁移这件事,坑都在你没想到的地方

用 Gitea 的 migrate 接口从 GitHub 拉,代码、issue、PR、wiki 都能带过来,看着挺顺。但 fork 网络直接散了——原来 8 个仓库之间的 fork 关系全变成互不相干的独立仓库,团队的 PR 流程整个要重来一遍。还有 issue 和 PR 编号会重排,我们有几个仓库习惯在 commit message 里写 fix #123,迁过来之后 #123 指向了完全不相干的东西,查历史的时候一脸懵,最后一次是靠 grep 提交时间才找回来的。

更烦的是那些你平时根本注意不到的自动化。Dependabot 免费帮你提依赖升级 PR,CodeQL 公开仓库免费跑安全扫描,secret scanning 免费防你手滑提交 token,Codespaces 每个月白送 120 core-hours。这些在 Gitea 上都没有原生替代,得自己拼:Renovate 顶 Dependabot,Semgrep 或者 Trivy 顶 CodeQL,gitleaks 顶 secret scanning。都能拼,但拼完这三样我花了差不多三个周末,而且 Renovate 的配置复杂度大概是 Dependabot 的三倍,光那个 regex manager 我就调了一下午。

图片

几个维度横向摆一下,都是我亲自踩过的

  • CI 免费额度:GitHub Free 私有仓库 2000 分钟一个月,公开仓库不限;自建看你机器,我那台 2 核 4G 并行跑两个 job 就开始卡,编译一次排队等得心慌。
  • LFS:GitHub Free 给 1GB 存储加 1GB 月流量,超了 5 美元买 5GB 数据包;Gitea 本体支持 LFS,但得自己接 S3 或者本地盘,我那块 40GB 的盘装美术资源两周就满了。
  • 代码搜索:GitHub 能跨仓库搜还能搜符号;Gitea 的搜索靠数据库 LIKE,仓库一多慢得我想砸键盘。
  • 移动端:GitHub 有官方 App,躺床上都能 review 和 merge;Gitea 只能开浏览器,手机上看 diff 那叫一个痛苦。
  • 合规:这是自建唯一真赢的地方,数据物理上在你手里,审计能过,这条没什么好争的。

图片

我的独立观点:GitHub 的护城河从来不是 Git 托管

很多人算自建这笔账,只算服务器多少钱一个月,这是最大的误区。你自建省下的是钱,花掉的是人的注意力,而注意力对小团队来说是最贵的资源。一年 576 美元的 Team 费用折合人民币 4000 出头,摊到 12 个人头上一个月不到 30 块,你拿这个换回来的是 Dependabot、CodeQL、Codespaces、官方 App,还有一套不用你维护的 runner 集群。这笔账怎么算都划算。

当然有例外。第一,你的行业有硬性合规要求,代码不能出境或者不能放第三方,那没得选,自建是唯一解。第二,团队规模真的到了几百人,账单一年几万美元,自建的边际成本才开始摊薄,注意是边际成本,不是总成本。第三,你就是想折腾,想搞明白 CI 到底是怎么跑起来的——那祝你玩得开心,我玩过一轮了,现在只想安安稳稳点 merge 按钮。

🏷️ 标签: