GitLab FAQ
内容:基础、高级、架构、Runner、CI/CD、运维、安全合规等
GitLab 是一个 基于 Git 的代码托管 + DevOps 平台,集成 代码管理、CI/CD、Issue、WIKI、自动化、安全扫描、部署 等功能。
与 GitHub 区别:
| 项目 | GitLab | GitHub |
|---|---|---|
| 部署方式 | 支持自建(开源版) | 主要 SaaS |
| CI | 内置 GitLab CI | 需要 GitHub Actions |
| 权限 & 项目管理 | 更企业化 | 更开发者社区化 |
| DevOps 集成 | One-Stop 方案 | 需要整合其他工具 |
CE(Community Edition):开源、免费,满足中小团队
EE(Enterprise Edition):闭源,提供高级功能,如:
- 高级权限与审计日志
- 合规治理
- 安全扫描、SAST、DAST
- 集群架构、Geo 复制
- Gitaly:Git 存储读写服务
- PostgreSQL:数据库
- Redis:缓存与队列
- Sidekiq:后台任务
- Puma:HTTP 请求处理
- Nginx:反向代理
- GitLab Shell:处理 SSH
- Prometheus + Grafana:监控
- Runner:执行 CI/CD
- Guest
- Reporter
- Developer
- Maintainer
- Owner(Group)
用于保护重要分支(如 master、main、release)
限制:
- 谁可以 push?
- 谁可以合并?
- 谁可以做 force-push(通常禁止)
- Merge commit
- Squash merge
- Rebase and merge
CI/CD 由 .gitlab-ci.yml 驱动
核心概念:
- Pipeline:整个流水线
- Stage:阶段
- Job:任务
- Runner:执行器
- Artifacts:产物
- Cache:缓存
- Variables:变量
- Environment:环境(如 dev/test/prod)
| Runner 类型 | 特点 |
|---|---|
| shared runner | 整个 GitLab 共用 |
| group runner | 某个 group 使用 |
| project runner | 某个项目使用 |
| specific runner | 单 Runner 绑定项目 |
| autoscaling runner | 自动创建 VM / K8S Pod |
| Executor | 描述 |
|---|---|
| shell | 在宿主机执行 |
| docker | 最常用,隔离好 |
| docker+machine | 自动扩容 |
| kubernetes | 企业级常用 |
| ssh | 远程执行 |
| virtualbox | 已不常用 |
最标准简答:
stages:
- build
- test
- deploy
variables: {}
build_job:
stage: build
script:
- make build
| 项目 | Artifacts | Cache |
|---|---|---|
| 目的 | 传递文件到下一 Job | 加速/缓存依赖 |
| 生命周期 | Pipeline 结束后可下载 | 在 Runner 存活期间 |
| 使用场景 | build -> test -> deploy | node_modules、.m2、pip cache |
使用 artifacts:
build:
stage: build
artifacts:
paths:
- dist/
通过:
- environment
- deploy 阶段
- k8s 集成
- 或调用外部脚本
GitLab 提供的自动化 CI/CD 模板(自动 build -> test -> deploy -> monitor)
依赖:
- K8s 集群
- Helm
- Docker Registry
六、GitLab 容器 Registry
推送流程:
docker login registry.gitlab.com
docker build -t registry.gitlab.com/group/project/app:tag .
docker push registry.gitlab.com/group/project/app:tag
自建版需开启:
registry['enable'] = true
使用 $CI_REGISTRY_USER、$CI_REGISTRY_PASSWORD 自动登录。
- CI/CD Variables
- Masked(隐藏)
- Protected(仅可在 protected 分支使用)
- 强制 MR Review
- Protected variables
- 防止 force push
- GitLab secret detection(EE)
gitlab-backup create
- 备份:数据 + 配置
- 可以 rsync Git 存储
- 支持对象存储(MinIO/S3)
注意:
- 升级路径不能跨太大版本
- 查看 release notes
- 备份
- Zero downtime 依赖 EE
- Gitaly 与 Git 存储独立
- Sidekiq 分离
- Redis 集群
- PostgreSQL 外置 + HA
- 使用对象存储(MinIO / S3)
常见原因:
- Runner 没 tag,job 需要 tag
- Runner offline
- Runner 没有匹配 executor
- 并发数太小
- job 限制 only/except 规则
- 并行 job
- 使用 cache
- 使用 artifacts 传递产物
- 只构建 changed 路径(rules)
- 使用 Docker 缓存层
通过 environment:
deploy_dev:
stage: deploy
environment:
name: dev
script: ./scripts/deploy-dev.sh
rules:
- if: '$CI_COMMIT_TAG'
when: always
- Monorepo 使用 rules: changes
- 每个目录对应一组 job
- 减少不必要构建
标准答案:
build:
stage: build
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- 需要 K8S
- 两套 service / deployment
- GitLab CI 调 Helm 切换版本
核心区别总结:
| 对比项 | GitLab CI | Jenkins |
|---|---|---|
| 配置方式 | YAML(代码即流程) | Web UI / Jenkinsfile |
| 依赖 | GitLab 内置 | 独立平台 |
| 插件 | 少,但稳定 | 插件生态大但易出问题 |
| 使用场景 | 中小团队、K8S 场景强 | 企业级、大规模插件扩展 |
| 架构 | 更轻量 | 更灵活、但要维护 |
- 原生支持
- Auto DevOps
- Review Apps
- Canary / Blue-Green
- 容器化构建更快更稳定