GitLab — 是一个开源的 DevOps 平台,将 Git 仓库、内置 CI/CD、容器注册表和安全工具整合到一个统一的应用程序中。由 Sid Sijbrandij 和 Dmitriy Zaporozhets 于 2011 年创立,该平台提供云服务 (GitLab.com) 和自管理版本 (Self-Managed) 供企业环境使用。根据 GitLab, 2024 的数据,该平台拥有超过 3000 万注册用户。
要点
GitLab — 是一个采用 MIT 许可证的完整开源 DevOps 平台。与 GitHub 通过集成连接不同服务不同,GitLab 为整个开发生命周期提供单一工具:从代码管理和代码审查到 CI/CD、监控、安全和部署。该平台不需要第三方服务来处理大多数 DevOps 任务。
GitLab 的历史始于 2011 年,当时是乌克兰开发者的一个内部项目。第一个公开版本于 2011 年 9 月发布,2015 年 GitLab 成为 GitLab.com 上的第一个项目,推出了云托管服务。2017 年,GitLab 经历了一个痛苦但具有示范意义的迁移过程——将整个基础设施从 Azure 迁移到 Google Cloud,整个过程在线直播并记录在一系列文章中。
GitLab 的架构由三个主要组件组成:GitLab Rails(基于 Ruby on Rails 的 Web 应用程序)、GitLab Shell(通过 SSH 处理 Git 操作)和 Gitaly(用于访问 Git 数据的 gRPC 服务器)。CI/CD 通过 GitLab Runner 提供——这是一个独立的应用程序,安装在构建服务器上,在隔离的环境(Docker、Kubernetes、VirtualBox)中执行任务。
GitLab CI/CD — 是一个内置的持续集成和交付系统,是该平台的关键优势。与 GitHub Actions 不同,GitLab CI/CD 从一开始就内置于架构中,无需单独配置:每个项目在仓库根目录添加 .gitlab-ci.yml 文件后会自动获得 CI/CD 功能。
流水线 (pipeline) 由按顺序或并行执行的阶段 (stages) 组成:build → test → deploy。每个阶段包含一个或多个在运行器上执行的任务。如果某个阶段中的任务失败,则整个阶段被标记为失败,后续阶段默认不会执行。以下是移动项目的流水线示例:
# .gitlab-ci.yml
stages:
- build
- test
- deploy
build-android:
stage: build
image: openjdk:17-jdk
script:
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/
unit-tests:
stage: test
script:
- ./gradlew testDebugUnitTest
deploy-firebase:
stage: deploy
script:
- firebase appdistribution:distribute app.apk
GitLab Runner 支持多种执行器 (executor):Docker(推荐)、Kubernetes、SSH、VirtualBox 和 Parallels。最流行的选择是 Docker 执行器,它在单独的容器中运行每个任务。运行器可以注册为特定于某个项目,或作为整个组的共享运行器。GitLab.com 提供免费的共享运行器,每月限制 2000 分钟。
GitLab CI/CD 支持手动触发 (when: manual)、延迟触发 (when: delayed)、并行执行 (parallel: 5)、矩阵 (matrix)、动态流水线 (child pipelines) 和多级流水线 (parent-child)。这允许构建复杂场景:例如,为单仓库中的每个模块动态生成流水线,或为不同 Android 架构 (arm64, x86_64) 运行并行构建。
GitLab 和 GitHub — 是 Git 平台市场上的两个主要竞争对手,但它们的理念和架构有着根本的不同。GitHub 侧重于开放社区、集成生态系统和社交功能(fork、star)。GitLab 专注于完整的 DevOps 生命周期,并提供开箱即用的所有工具:从规划到监控。
主要的架构差异:GitLab — 是一个单一的整体应用程序,开发者可以完整安装。所有功能(CI/CD、Container Registry、Security Scanning、Pages)都是内置的,安装后即可使用。GitHub 是一个带有 API 的平台,大多数功能通过集成第三方服务实现:Travis CI、CircleCI、Jenkins、SonarQube。下表比较了关键特性:
| 标准 | GitLab | GitHub |
|---|---|---|
| CI/CD | 内置,YAML 在 .gitlab-ci.yml 中 | Actions,YAML 在 .github/workflows 中 |
| 自托管 | 免费 (Community Edition) | 付费 (Enterprise Server) |
| 许可证 | MIT(开源代码) | 专有 |
| 注册表 | Container + Dependency Proxy | Packages(容器 + 包) |
| 安全 | SAST、DAST、Fuzzing、Container Scanning | Dependabot + CodeQL(有限) |
在 GitLab 和 GitHub 之间的选择取决于团队的需求。如果优先考虑快速部署、零配置和开放社区——选择 GitHub。如果需要完全控制基础设施、自托管和内置安全性——GitLab 更可取。根据 Stack Overflow (2024) 的调查,90% 的开发者使用 GitHub,33% 使用 GitLab(通常两者同时使用)。
自管理 GitLab(原名为 On-Premises)允许将平台安装在自己的服务器上,并完全控制数据、基础设施和正常运行时间。这对于有合规要求的组织尤其重要:金融领域、政府机构、医疗机构,这些机构的数据不能存储在第三方服务器上。
GitLab 安装支持 Ubuntu、Debian、CentOS 和通过 Docker。官方 Omnibus 软件包包含所有组件:Web 服务器 (NGINX)、数据库 (PostgreSQL)、缓存 (Redis)、Git 处理器 (Gitaly) 和后台进程。最低要求:4 GB RAM 和 2 CPU,适用于最多 100 人的团队。对于高负载的大型安装,建议将组件分离到不同的服务器上。
# 通过 Omnibus 在 Ubuntu 上安装 GitLab CE
curl -LO https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh
sudo bash script.deb.sh
# 安装软件包
sudo EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-ce
# 查看状态
sudo gitlab-ctl status
sudo gitlab-ctl tail
自管理 GitLab 没有 CI/CD 分钟数限制——所有运行器都属于组织,其性能仅受自身硬件限制。此外,还提供区域的 Geo 复制、审计日志、IP 封锁以及与企业的 LDAP/SAML 提供商集成。GitLab 每月(22 日)发布更新,包含新功能和安全修复。
GitLab 的安全性 内置于平台层面,包括在流水线每个阶段运行的多个扫描器。SAST(静态应用程序安全测试)在不执行应用程序的情况下分析源代码中的漏洞,支持超过 15 种语言,包括 Java、Kotlin、Swift、Python 和 JavaScript。DAST(动态应用程序安全测试)从内部测试正在运行的 Web 应用程序的漏洞。
其他工具:Container Scanning 检查 Docker 镜像基础层中的漏洞;Dependency Scanning 分析项目依赖项并警告已知的 CVE;Secret Detection 查找意外提交的 API 密钥、密码和令牌;Fuzz Testing 使用无效数据执行自动测试以发现不明显的错误。所有扫描结果显示在统一的 Security Dashboard 中。
GitLab 还提供 Compliance——用于满足法规要求的工具。Compliance Dashboard 显示所有项目的合规状态,Audit Events 记录管理员和开发者的每个操作,Compliance Frameworks 允许对特定项目组强制执行配置策略。这使得 GitLab 成为企业环境中有严格安全要求的热门选择。
GitLab Container Registry — 是一个内置的 Docker 注册表,与 CI/CD 集成。在流水线中构建 Docker 镜像后,可以立即将其发布到 Registry,使用环境变量 CI_REGISTRY 和 CI_REGISTRY_USER。Registry 支持拉取缓存、标记、清理策略和直接在注册表中进行漏洞扫描。
Dependency Proxy — 是一种从外部注册表(Docker Hub、Quay、GCR)缓存容器和镜像的机制。当流水线请求镜像 ubuntu:latest 时,GitLab 首先检查其缓存——如果镜像已下载,则不会重新下载。这减少了对外部注册表的负载,加速了流水线,并防止了 Docker Hub 的速率限制。
对于移动开发者,GitLab 提供 GitLab Pages 用于托管文档和测试报告。运行测试后,可以将构建产物(HTML 报告、截图、日志)发布为 Pages,并获取链接发送给 QA 团队。这比将报告上传到云存储更方便,因为所有内容都托管在同一个 GitLab 项目内。
GitLab API(REST 和 GraphQL)提供对平台所有资源的访问:项目、用户、流水线、合并请求、注册表。API 用于自动化:从模板创建项目、指定审查者、获取流水线状态。Webhooks 允许在事件发生时向外部系统发送 HTTP 通知:推送、合并、创建问题。Webhooks 可与 Mattermost、Slack、Telegram 和内部监控系统集成。
GitLab Pages 自动从仓库发布静态网站。对于移动项目,Pages 便于托管 API 文档、测试覆盖率报告和 lint 分析结果。发布在成功流水线后自动进行——只需在 .gitlab-ci.yml 中指定一个 deploy 步骤并发布到 Pages。结果可在 https://namespace.gitlab.io/project-name 访问。
常见问题
GitLab — 是一个用于存储代码和自动化构建的程序。开发者上传代码,GitLab 自行测试、构建应用程序并将其发送到服务器。
GitLab CE (Community Edition) 是完全免费且开源的。GitLab EE (Enterprise Edition) 有付费套餐,每位用户每月 19 美元起,提供额外的安全功能。
Runner — 是执行任务 (jobs) 的代理。流水线 — 是在 .gitlab-ci.yml 中描述的任务序列。Runner 在服务器上实际执行代码,而流水线定义执行什么以及以什么顺序执行。
可以,GitLab 提供内置的从 GitHub、Bitbucket 和其他平台的导入器。导入操作可迁移代码、提交、分支、问题、Wiki 和合并请求,并最大程度地保留历史记录。
对于 iOS,需要 macOS 运行器(物理 Mac 或云端 Mac)。流水线包括安装 Xcode、运行 xcodebuild 进行构建、执行测试以及导出 .ipa 文件用于 TestFlight。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。