在这里插入图片描述

前言:为什么要自建GitLab?

在数字化时代,代码是企业最核心的资产之一。GitLab 作为一个完整的 DevOps 平台,提供了从项目管理、代码仓库、CI/CD 到安全扫描的全套解决方案。自建 GitLab 可以让你:

  • 🔒 完全掌控数据:代码不出内网,保障知识产权
  • 🎯 深度定制:根据团队需求定制工作流程
  • 💰 成本可控:一次投入,长期使用,无用户数限制
  • 🔗 无缝集成:与内部系统(LDAP、监控等)深度集成

下面让我们开始 GitLab 的搭建之旅!

一、Docker部署GitLab服务器

环境准备

  • 服务器要求:最低 2核CPU,4GB内存(推荐4核8GB)
  • 操作系统Ubuntu 20.04/22.04 LTSCentOS 7+
  • 已安装 DockerDocker Compose

步骤1:创建部署目录结构

mkdir -p gitlab-docker/{config,logs,data}
cd gitlab-docker

步骤2:创建Docker Compose文件

创建 docker-compose.yml 文件:

version: '3.8'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'  # 使用社区版
    container_name: 'gitlab'
    restart: always
    hostname: 'gitlab.your-company.com'  # 重要:改为你的域名
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # 外部访问URL
        external_url 'http://gitlab.your-company.com'
        
        # 邮箱配置(可选,但推荐)
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
        gitlab_rails['smtp_port'] = 587
        gitlab_rails['smtp_user_name'] = "gitlab@your-company.com"
        gitlab_rails['smtp_password'] = "your-password"
        gitlab_rails['smtp_domain'] = "your-company.com"
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['gitlab_email_from'] = "gitlab@your-company.com"
        
        # 防止与宿主机SSH端口冲突
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        
        # 开启监控(可选)
        prometheus['enable'] = true
        grafana['enable'] = true
        
    ports:
      - '80:80'
      - '443:443'
      - '2222:22'   # SSH端口映射到2222,避免冲突
    volumes:
      - './config:/etc/gitlab'
      - './logs:/var/log/gitlab'
      - './data:/var/opt/gitlab'
    shm_size: '256m'
    networks:
      - gitlab-net

networks:
  gitlab-net:
    driver: bridge

⚠️ 重要配置说明:

  • SSH端口冲突:将容器 SSH 端口映射到 2222 ,避免与宿主机 22 端口冲突
  • 域名配置hostnameexternal_url 需要保持一致
  • 数据持久化:通过 volumes 挂载确保数据安全

步骤3:启动GitLab服务

# 启动服务
docker-compose up -d

# 查看启动日志
docker logs -f gitlab

# 查看服务状态
docker-compose ps

首次启动需要 3-5 分钟进行初始化,请耐心等待。

步骤4:获取初始密码并登录

# 进入容器查看初始root密码
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

访问你的 GitLab 地址(如 http://your-server-ip ):

  • 用户名root
  • 密码:上面获取的初始密码

⚠️ 安全提醒:首次登录后立即修改root密码!

步骤5:配置HTTPS(生产环境必需)

创建 nginx.conf 或使用 Let's Encrypt 自动证书:

# 在docker-compose.yml的GITLAB_OMNIBUS_CONFIG中添加:
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['admin@your-company.com']
letsencrypt['auto_renew'] = true
external_url 'https://gitlab.your-company.com'  # 改为https

然后重启服务:docker-compose restart

二、GitLab系统管理实战

1. 用户与权限管理

LDAP/AD集成配置

在企业环境中,推荐集成公司现有的 LDAP/Active Directory

# 在GITLAB_OMNIBUS_CONFIG中添加LDAP配置
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = {
  'main' => {
    'label' => 'Company AD',
    'host' => 'ldap.company.com',
    'port' => 636,
    'uid' => 'sAMAccountName',
    'bind_dn' => 'CN=gitlab,OU=Service Accounts,DC=company,DC=com',
    'password' => 'service-account-password',
    'encryption' => 'simple_tls',
    'verify_certificates' => true,
    'base' => 'OU=Users,DC=company,DC=com',
    'user_filter' => '(memberOf=CN=GitLab-Users,OU=Groups,DC=company,DC=com)'
  }
}

权限层级设计

合理的权限结构是团队协作的基础:

公司组织架构示例:
├── 技术中心 (Group)
│   ├── 前端团队 (Subgroup)
│   │   ├── web-app (Project) - Maintainer: 前端组长
│   │   └── component-lib (Project) - Maintainer: 架构师
│   ├── 后端团队 (Subgroup)  
│   │   ├── user-service (Project)
│   │   └── order-service (Project)
│   └── 基础设施 (Subgroup)
│       ├── k8s-configs (Project)
│       └── ci-cd-templates (Project)
└── 产品部门 (Group)
    ├── prd-documents (Project)
    └── ui-designs (Project)

权限级别说明

角色权限适用人群
Guest查看项目、提交Issue外包、产品经理
ReporterGuest权限 + 查看CI/CD测试人员
Developer代码推送、创建MR、运行流水线开发工程师
Maintainer项目管理、保护分支、环境配置技术负责人
Owner群组管理、权限分配部门总监

2. 项目结构与分支策略

推荐的分支模型

# 主分支 - 保护分支,对应生产环境
main/master

# 开发分支 - 功能集成,对应测试环境  
develop

# 功能分支 - 功能开发
feature/user-auth
feature/payment-integration

# 发布分支
release/1.2.0

# 热修复分支
hotfix/critical-bug

分支保护配置

保护关键分支是代码质量的重要保障:

  1. 进入项目设置 → Repository → Protected Branches

  2. 保护main分支:

    • 🚫 禁止直接推送
    • ✅ 允许Merge Request
    • 👥 需要代码审查(至少1人)
    • ✅ 需要CI流水线通过
    • 🚫 禁止合并后删除源分支
  3. CI/CD流水线管理
    创建共享CI模板
    infrastructure/ci-cd-templates 项目中创建模板:

# templates/backend-ci.yml
.backend-build: &backend-build
  stage: build
  image: maven:3.8-openjdk-11
  script:
    - mvn clean compile
    - mvn package -DskipTests
  artifacts:
    paths:
      - target/*.jar
    expire_in: 1 week

.backend-test: &backend-test  
  stage: test
  image: maven:3.8-openjdk-11
  script:
    - mvn test
    - mvn jacoco:report
  artifacts:
    reports:
      junit: target/surefire-reports/*.xml
    paths:
      - target/site/jacoco/
    expire_in: 1 week

项目CI配置示例

# .gitlab-ci.yml
include:
  - project: 'infrastructure/ci-cd-templates'
    file: 
      - '/templates/backend-ci.yml'
      - '/templates/security-scan.yml'

stages:
  - test
  - build
  - security-scan
  - deploy

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"

unit-test:
  <<: *backend-test
  only:
    - merge_requests
    - develop
    - main

build-artifact:
  <<: *backend-build
  only:
    - develop
    - main

sonarqube-check:
  stage: security-scan
  image: sonarsource/sonar-scanner-cli:latest
  script:
    - sonar-scanner
  only:
    - merge_requests
    - develop

deploy-to-test:
  stage: deploy
  script:
    - ./deploy.sh test
  environment:
    name: test
    url: https://test.your-company.com
  only:
    - develop

deploy-to-prod:
  stage: deploy  
  script:
    - ./deploy.sh prod
  environment:
    name: production
    url: https://your-company.com
  when: manual  # 手动触发部署
  only:
    - main

三、团队开发工作流实战

1. 标准开发流程

功能开发示例

# 1. 克隆项目
git clone https://gitlab.your-company.com/tech-center/backend/user-service.git
cd user-service

# 2. 拉取最新代码并创建功能分支
git checkout develop
git pull origin develop
git checkout -b feature/user-profile-optimization

# 3. 开发并提交代码
git add .
git commit -m "feat: 优化用户详情页查询性能

- 添加数据库索引
- 实现查询缓存
- 优化API响应结构"

# 4. 推送到远程仓库
git push origin feature/user-profile-optimization

提交信息规范
使用约定式提交,让提交历史更清晰:

feat: 新增微信支付集成
fix: 修复订单金额计算错误
docs: 更新API接口文档
style: 调整代码格式,无功能变化
refactor: 重构用户认证模块
test: 添加支付服务单元测试
chore: 更新Spring Boot版本到2.7.0

2. Merge Request流程

创建高质量的Merge Request

  1. 填写清晰的MR描述:
## 功能描述
优化用户详情页查询性能,响应时间从 500ms 降低到 50ms

## 变更内容
- ✅ 添加用户表的查询索引
- ✅ 实现Redis缓存用户信息
- ✅ 优化API响应数据结构
- ✅ 添加性能测试用例

## 测试验证
- [x] 单元测试通过
- [x] 集成测试通过  
- [x] 性能测试:查询性能提升10倍

## 相关Issue
Closes #123, #124
  1. 指派评审人:选择相关技术负责人

  2. 设置里程碑:关联项目迭代计划

  3. 添加标签:如 feature, performance, backend

代码审查清单
审查者需要检查:

  • 代码质量:符合编码规范,逻辑清晰
  • 功能正确:实现需求,无逻辑错误
  • 测试覆盖:有对应的单元测试和集成测试
  • 安全考虑:无安全漏洞,输入验证完善
  • 性能影响:不影响现有功能性能
  • 文档更新:API文档、README同步更新

3. Issue与项目管理

创建规范的 Issue 模板
在项目设置中创建 .gitlab/issue_templates/feature_request.md

## 功能描述
[清晰描述需求功能]

## 业务价值
[为什么需要这个功能,解决什么问题]

## 功能详情
### 用户故事
作为一名[角色],我希望[完成什么],以便[达到什么价值]

### 验收标准
- [ ] 场景1:当[条件],应该[结果]
- [ ] 场景2:当[条件],应该[结果]

## 技术考虑
- [ ] 前端修改
- [ ] 后端修改  
- [ ] 数据库变更
- [ ] API接口变更

## 参考资料
- 设计稿链接:
- 相关文档:

四、系统维护与监控

1. 备份策略

配置自动备份

# 在宿主机创建备份脚本
vim /opt/scripts/gitlab-backup.sh

#!/bin/bash
# GitLab自动备份脚本
BACKUP_DIR="/data/gitlab/backups"
LOG_FILE="/var/log/gitlab-backup.log"

echo "$(date): Starting GitLab backup" >> $LOG_FILE
docker exec gitlab gitlab-backup create >> $LOG_FILE 2>&1

# 清理30天前的备份
find $BACKUP_DIR -name "*gitlab_backup.tar" -mtime +30 -delete

echo "$(date): Backup completed" >> $LOG_FILE
bash
# 添加定时任务(每天凌晨2点执行)
crontab -e
0 2 * * * /bin/bash /opt/scripts/gitlab-backup.sh

恢复演练
定期进行恢复演练,确保备份可用:

# 停止相关服务
docker-compose stop

# 恢复备份(需要先确保版本一致)
docker exec -it gitlab gitlab-backup restore BACKUP=timestamp_of_backup

# 重启服务
docker-compose start

2. 系统监控

健康状态检查

# 查看GitLab服务状态
docker exec gitlab gitlab-ctl status

# 检查服务日志
docker logs --tail 100 gitlab

# 监控资源使用
docker stats gitlab

性能优化配置

# 在GITLAB_OMNIBUS_CONFIG中添加性能调优
unicorn['worker_processes'] = 4
sidekiq['concurrency'] = 10
postgresql['shared_buffers'] = "256MB"
postgresql['max_connections'] = 200

3. 升级与维护

GitLab版本升级

# 1. 备份当前数据
docker exec gitlab gitlab-backup create

# 2. 停止当前服务
docker-compose down

# 3. 更新镜像版本
sed -i 's/gitlab-ce:.*/gitlab-ce:latest/' docker-compose.yml

# 4. 重新启动
docker-compose up -d

# 5. 检查升级状态
docker exec gitlab gitlab-rake gitlab:env:info

五、安全最佳实践

1. 账户安全

# 强制双因素认证
gitlab_rails['gitlab_require_two_factor_authentication'] = true
gitlab_rails['gitlab_two_factor_remember_me'] = 168  # 7天免登录

# 密码复杂度要求
gitlab_rails['password_authentication_enabled'] = true
gitlab_rails['password_compLEXity'] = true

2. 网络安全

# 在docker-compose.yml中限制网络访问
services:
  web:
    networks:
      gitlab-net:
        aliases:
          - gitlab
    # 只暴露必要端口
    ports:
      - '80:80'
      - '443:443'
      - '2222:22'

3. 定期安全扫描

CI 流水线中集成安全扫描:

security-scan:
  stage: security-scan
  image: 
    name: trivy:latest
    entrypoint: [""]
  script:
    - trivy fs --exit-code 1 .
  allow_failure: false
  only:
    - merge_requests

总结

通过本文的完整指南,你已经掌握了:

  • ✅ GitLab Docker化部署 - 快速搭建生产环境
  • ✅ 企业级权限管理 - LDAP集成和精细权限控制
  • ✅ DevOps工作流 - 从代码提交到自动化部署
  • ✅ 团队协作规范 - MR流程和代码审查
  • ✅ 系统维护监控 - 备份、升级和性能优化

自建 GitLab 不仅是一个技术决策,更是团队研发效能的基石。正确的部署和管理能够为团队提供稳定高效的研发平台,加速产品交付。

立即行动,按照本文指南搭建你的企业级 GitLab ,开启高效的 DevOps 之旅!

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐