4、代码仓库管理:GitLab、GitHub、Gitee的选型对比与自建方案

说到代码仓库,这几乎是每个嵌入式团队绕不开的第一个基础设施。我见过不少团队,一开始随便选一个平台用着,等到CI/CD跑起来、权限管控出问题、或者代码被误删的时候,才后悔当初没好好选型。

今天我就把这三个主流平台——GitLab、GitHub、Gitee,掰开揉碎了讲清楚。顺便聊聊自建方案,毕竟嵌入式项目经常涉及核心固件,代码放哪、怎么放,真得慎重。

4.1 三巨头的基本定位

先给个直观的对比,你心里有个谱:

维度 GitHub GitLab Gitee
定位 全球最大的开源社区 企业级DevOps平台 国内开源与私有仓库
私有仓库 免费(有限协作人数) 免费(不限) 免费(不限)
CI/CD集成 GitHub Actions(强) 内置CI/CD(极强) Gitee Go(中等)
自建部署 不支持(仅SaaS) 支持(社区版免费) 支持(企业版收费)
国内访问速度 慢(需代理) 自建后取决于服务器

说白了,选哪个取决于你的团队规模、合规要求、以及CI/CD的深度需求。我个人习惯是:开源项目放GitHub,企业内部核心固件用自建GitLab,国内小团队图省事就用Gitee

4.2 GitHub:开源首选,但嵌入式团队要注意什么

GitHub的生态确实好,Actions市场里有一大堆现成的嵌入式CI模板。比如编译ARM Cortex-M固件、跑QEMU模拟测试、甚至烧录到开发板,都能找到现成的workflow。

但我在项目中遇到过一个问题:嵌入式项目经常有大文件,比如编译器工具链、SDK包、或者编译产物。GitHub对单个文件有100MB的限制,而且仓库总大小建议不超过1GB。你想想看,一个完整的STM32CubeIDE工程加上SDK,很容易就超了。

避坑指南: 我曾经把一个带SDK的嵌入式仓库推到GitHub,结果push到一半卡住了。后来只能用Git LFS(大文件存储)来管理,但LFS的免费额度只有1GB存储和1GB带宽/月。团队人多一点,一个月就用完了。

所以我的建议是:GitHub适合放源码和配置文件,工具链和SDK用外部存储或镜像站。Actions里可以写一个step,先下载工具链再编译。

# .github/workflows/build.yml 片段
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 下载ARM GCC工具链
        run: |
          wget -q https://developer.arm.com/.../gcc-arm-none-eabi.tar.bz2
          tar -xjf gcc-arm-none-eabi.tar.bz2
          echo "$PWD/gcc-arm-none-eabi/bin" >> $GITHUB_PATH
      - name: 编译固件
        run: make -j$(nproc)

4.3 GitLab:自建方案的王牌

如果你问我嵌入式团队最应该用什么,我会说自建GitLab。原因很简单:代码不出公司,CI/CD完全可控

GitLab的CI/CD是原生集成的,不需要像GitHub那样依赖第三方服务。你只需要在仓库根目录放一个.gitlab-ci.yml,就能定义完整的流水线。而且它支持Runner部署在本地服务器上,编译嵌入式固件时可以直接挂载JTAG调试器,实现自动化烧录和测试。

我个人的经验: 在GitLab里配置一个“固件发布”流水线,每次打tag时自动编译、生成hex文件、然后通过SCP传到内网的固件服务器。测试人员直接下载烧录,省去了手动编译的麻烦。

自建GitLab的硬件要求其实不高:4核CPU、8GB内存、100GB SSD,就能支撑一个20人左右的团队。我建议用Docker部署,升级和维护都方便。

# docker-compose.yml 简化版
version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    hostname: gitlab.yourcompany.com
    ports:
      - "80:80"
      - "443:443"
      - "22:22"
    volumes:
      - ./config:/etc/gitlab
      - ./logs:/var/log/gitlab
      - ./data:/var/opt/gitlab
小技巧: 嵌入式团队经常需要管理多个芯片厂商的SDK。我建议在GitLab里建一个“工具链”组,把编译好的工具链做成Docker镜像,放在私有Registry里。CI/CD流水线直接拉取镜像编译,既快又统一。

4.4 Gitee:国内团队的轻量选择

Gitee(码云)在国内的访问速度确实快,而且对中文支持好。如果你团队不大、没有严格的合规要求、也不想折腾自建,Gitee是个省心的选择。

但说实话,Gitee的CI/CD能力(Gitee Go)相比GitLab和GitHub还有差距。它的流水线配置不够灵活,支持的Runner类型也少。我在项目中试过用它跑嵌入式编译,结果发现免费版的构建时长有限,而且不能自定义Runner的硬件环境。

另外要注意一点:Gitee的企业版才支持自建部署,而且价格不便宜。如果你有自建需求,不如直接上GitLab社区版,功能更全还免费。

4.5 自建方案的核心考量

如果你决定自建,我建议你重点考虑这几个点:

  • 存储与备份:嵌入式仓库经常有二进制文件,建议用对象存储(如MinIO)做Git LFS后端,每天自动备份到异地。
  • 权限管控:不同芯片项目组之间要隔离,GitLab的Group + Subgroup + Project权限模型很合适。
  • CI/CD Runner:嵌入式编译需要特定硬件(比如ARM交叉编译器),建议用Docker Runner + 自定义镜像,或者直接用Shell Runner挂载物理机。
  • 网络与安全:内网部署的话,要配置好HTTPS证书和LDAP/OAuth认证。我见过团队直接用HTTP,结果被中间人攻击,代码泄露了。
我曾经踩过的坑: 自建GitLab时忘了配置SMTP邮件服务,结果代码评审的提醒邮件全发不出去。团队成员不知道有新的MR要审核,拖了两天才合并。嗯,从那以后我每次部署都会先测试邮件功能。

4.6 选型决策树

最后给你一个简单的决策思路:

  1. 团队小于10人,项目开源或非核心 → GitHub(免费,生态好)
  2. 团队10-50人,需要私有部署和强CI/CD → 自建GitLab(社区版)
  3. 团队在国内,不想折腾服务器,合规要求低 → Gitee(企业版)
  4. 团队有核心固件,需要离线开发和审计 → 自建GitLab + 内网Runner

说白了,没有完美的平台,只有最适合你团队的选择。我个人的建议是:如果你有精力,优先自建GitLab。虽然初期搭建要花点时间,但后续的灵活性和可控性,绝对值得。

下一章我会讲怎么在GitLab里配置嵌入式CI/CD流水线,包括多架构编译、固件签名、以及自动化测试。到时候咱们再细聊。