news 2026/3/7 23:46:42

自建GitLab与CI/CD实战:团队协作完整方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自建GitLab与CI/CD实战:团队协作完整方案

本文详解如何自建GitLab代码仓库,配置CI/CD自动化流水线,打造完整的团队协作开发环境。

前言

代码托管平台的选择:

  • GitHub:开源首选,但私有仓库有限制
  • Gitee:国内快,但有审查
  • 自建GitLab:完全自主,功能强大

对于企业或有隐私需求的团队,自建GitLab是最好的选择:

  • 代码完全在自己手里
  • 无限私有仓库
  • 内置CI/CD
  • 功能比GitHub还全

今天来搭建一套完整的GitLab + CI/CD环境。


一、GitLab部署

1.1 服务器要求

配置最低推荐
CPU2核4核+
内存4GB8GB+
磁盘50GB100GB+ SSD

注意:GitLab比较吃资源,4GB内存勉强能跑,8GB以上才流畅。

1.2 Docker Compose部署

# docker-compose.ymlversion:'3.8'services:gitlab:image:gitlab/gitlab-ce:latestcontainer_name:gitlabrestart:alwayshostname:'gitlab.example.com'environment:GITLAB_OMNIBUS_CONFIG:|external_url 'http://gitlab.example.com' gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 邮件配置(可选) gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.example.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "gitlab@example.com" gitlab_rails['smtp_password'] = "password" gitlab_rails['smtp_domain'] = "example.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'ports:-'80:80'-'443:443'-'2222:22'volumes:-'./gitlab/config:/etc/gitlab'-'./gitlab/logs:/var/log/gitlab'-'./gitlab/data:/var/opt/gitlab'shm_size:'256m'
# 启动docker compose up -d# 等待启动完成(第一次需要几分钟)docker logs -f gitlab# 获取初始root密码dockerexec-it gitlabgrep'Password:'/etc/gitlab/initial_root_password

1.3 初始配置

1. 访问 http://服务器IP 2. 用户名:root 3. 密码:上一步获取的初始密码 4. 登录后修改密码 建议配置: - Admin Area → Settings → Sign-up restrictions → 关闭注册 - Admin Area → Settings → Visibility → 设置默认私有

1.4 创建用户和项目

1. Admin Area → Users → New User 2. 创建项目组:Groups → New Group 3. 创建项目:Projects → New Project 4. 添加SSH Key:User Settings → SSH Keys

二、GitLab Runner配置

2.1 Runner是什么

Runner是执行CI/CD任务的执行器,可以部署在:

  • GitLab服务器本机
  • 单独的服务器(推荐)
  • 开发者本地

2.2 安装Runner

# Docker方式安装docker run -d --name gitlab-runner --restart always\-v /var/run/docker.sock:/var/run/docker.sock\-v gitlab-runner-config:/etc/gitlab-runner\gitlab/gitlab-runner:latest

2.3 注册Runner

# 获取注册Token# GitLab → Admin Area → Runners → 复制Token# 注册Runnerdockerexec-it gitlab-runner gitlab-runner register
Enter the GitLab instance URL: http://gitlab.example.com Enter the registration token: [粘贴Token] Enter a description: my-runner Enter tags: docker,build Enter an executor: docker Enter the default Docker image: docker:latest

2.4 Runner配置优化

# 编辑配置dockerexec-it gitlab-runnernano/etc/gitlab-runner/config.toml
[[runners]] name = "my-runner" url = "http://gitlab.example.com" token = "xxx" executor = "docker" [runners.docker] tls_verify = false image = "docker:latest" privileged = true # 允许Docker in Docker disable_cache = false volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]

三、CI/CD流水线配置

3.1 基本概念

# .gitlab-ci.yml 结构stages:# 阶段定义-build-test-deployvariables:# 全局变量APP_NAME:"my-app"job_name:# 任务定义stage:build# 所属阶段script:# 执行脚本-echo "Building..."only:# 触发条件-main

3.2 Java项目示例

# .gitlab-ci.ymlstages:-build-test-package-deployvariables:MAVEN_OPTS:"-Dmaven.repo.local=.m2/repository"cache:paths:-.m2/repository/build:stage:buildimage:maven:3.8-jdk-11script:-mvn compileonly:-main-developtest:stage:testimage:maven:3.8-jdk-11script:-mvn testonly:-main-developpackage:stage:packageimage:maven:3.8-jdk-11script:-mvn package-DskipTestsartifacts:paths:-target/*.jarexpire_in:1 weekonly:-maindeploy:stage:deployimage:docker:latestservices:-docker:dindscript:-docker build-t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .-docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHAonly:-main

3.3 Node.js项目示例

# .gitlab-ci.ymlstages:-install-test-build-deploycache:paths:-node_modules/install:stage:installimage:node:18script:-npm ciartifacts:paths:-node_modules/expire_in:1 hourtest:stage:testimage:node:18script:-npm run testdependencies:-installbuild:stage:buildimage:node:18script:-npm run buildartifacts:paths:-dist/expire_in:1 weekdependencies:-installonly:-maindeploy:stage:deployimage:alpine:latestscript:-apk add rsync openssh-client-rsync-avz--delete dist/ user@server:/var/www/app/only:-mainwhen:manual# 手动触发

3.4 Docker镜像构建

# .gitlab-ci.ymlbuild-image:stage:packageimage:docker:latestservices:-docker:dindvariables:DOCKER_TLS_CERTDIR:""before_script:-docker login-u $CI_REGISTRY_USER-p $CI_REGISTRY_PASSWORD $CI_REGISTRYscript:-docker build-t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .-docker build-t $CI_REGISTRY_IMAGE:latest .-docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-docker push $CI_REGISTRY_IMAGE:latestonly:-main

四、分支策略与代码审查

4.1 Git Flow分支模型

main ──●───────────●───────────●──→ 生产环境 ↑ ↑ ↑ release ──●───────────●───────────●──→ 预发布 ↑ ↑ develop ──●───●───●───●───●───●───●──→ 开发主线 ↑ ↑ ↑ feature ──●───● ●───● ●───●───→ 功能分支

4.2 分支保护

Settings → Repository → Protected Branches main分支: - Allowed to merge: Maintainers - Allowed to push: No one - Require approval: 1人以上

4.3 Merge Request模板

<!-- .gitlab/merge_request_templates/default.md --> ## 变更描述 <!-- 描述这个MR做了什么 --> ## 变更类型 - [ ] 新功能 - [ ] Bug修复 - [ ] 重构 - [ ] 文档更新 ## 测试说明 <!-- 如何测试这个变更 --> ## Checklist - [ ] 代码已自测 - [ ] 更新了相关文档 - [ ] 添加了必要的测试

五、团队远程协作

5.1 场景挑战

团队分布: - 开发A:公司内网 - 开发B:家里远程 - 开发C:出差酒店 - GitLab:公司内网服务器 问题:开发B、C无法访问公司内网的GitLab

5.2 解决方案

方案1:GitLab暴露公网

❌ 风险高,容易被攻击 ❌ 需要公网IP和域名

方案2:VPN接入

⚠️ 需要VPN服务器 ⚠️ 配置复杂

方案3:组网软件(推荐)

使用组网软件(如星空组网)将团队成员和GitLab服务器组成虚拟局域网:

┌──────────────┐ │ GitLab │ │ 10.10.0.1 │←─┐ └──────────────┘ │ │ 虚拟局域网 ┌──────────────┐ │ │ 开发A │←─┤ │ 10.10.0.2 │ │ └──────────────┘ │ │ ┌──────────────┐ │ │ 开发B │←─┤ │ 10.10.0.3 │ │ └──────────────┘ │ │ ┌──────────────┐ │ │ 开发C │←─┘ │ 10.10.0.4 │ └──────────────┘

配置步骤:

# 1. GitLab服务器安装组网客户端# 2. 所有开发者电脑安装组网客户端# 3. 登录同一账号# 4. 修改git remote地址为组网IP# 原地址gitremote set-url origin http://192.168.1.100/group/project.git# 改为组网IPgitremote set-url origin http://10.10.0.1/group/project.git

效果:

  • 任何地点都能访问GitLab
  • 不需要公网暴露
  • 加密传输,安全
  • 配置简单,一次设置

5.3 SSH配置

# ~/.ssh/configHost gitlab HostName10.10.0.1# 组网IPPort2222UsergitIdentityFile ~/.ssh/gitlab_key
# 克隆使用gitclone gitlab:group/project.git

六、备份与恢复

6.1 备份配置

# 手动备份dockerexec-t gitlab gitlab-backup create# 备份文件位置./gitlab/data/backups/# 定时备份(crontab)03* * * dockerexec-t gitlab gitlab-backup createCRON=1

6.2 恢复

# 停止相关服务dockerexec-it gitlab gitlab-ctl stop puma dockerexec-it gitlab gitlab-ctl stop sidekiq# 恢复备份(BACKUP为备份时间戳)dockerexec-it gitlab gitlab-backup restoreBACKUP=11493107454_2018_04_25_10.6.4-ce# 重启docker restart gitlab

6.3 异地备份

# 备份到远程服务器(通过组网)rsync-avz ./gitlab/data/backups/ user@10.10.0.5:/backup/gitlab/

七、常见问题

7.1 内存不足

# 减少Sidekiq并发gitlab_rails['sidekiq_concurrency']=5# 减少Puma workerspuma['worker_processes']=2# 禁用Prometheus(省内存)prometheus_monitoring['enable']=false

7.2 克隆速度慢

# 启用Git LFS存储大文件gitlfsinstallgitlfs track"*.psd"gitlfs track"*.zip"

7.3 502错误

# 通常是启动未完成或内存不足# 查看日志docker logs gitlab# 重启docker restart gitlab

八、总结

GitLab + CI/CD搭建要点:

  1. 服务器配置:至少8GB内存
  2. Docker部署:最简单的部署方式
  3. Runner配置:单独部署,避免资源竞争
  4. CI/CD流水线:按项目类型配置
  5. 分支保护:main分支必须通过MR
  6. 远程协作:组网软件打通网络
  7. 定期备份:数据无价

我的团队配置:

- GitLab服务器:公司内网,8GB内存 - Runner:单独一台4GB服务器 - 远程访问:星空组网 - 备份:每天自动备份,rsync到另一台机器

自建GitLab虽然需要维护,但完全掌控数据的感觉真的很好。


参考资料

  1. GitLab官方文档:https://docs.gitlab.com/
  2. GitLab CI/CD文档:https://docs.gitlab.com/ee/ci/
  3. GitLab Docker安装:https://docs.gitlab.com/ee/install/docker.html

💡建议:先在测试服务器上搭建,熟悉流程后再部署到生产环境。数据迁移GitLab有完善的备份恢复机制。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/5 21:30:17

Docker 网络管理深度解析与实践指南

1. 容器网络管理的必要性与核心挑战 在容器化技术体系中&#xff0c;网络管理是维持系统稳定性与安全性的基石。默认情况下&#xff0c;Docker 容器与宿主机、以及容器之间处于高度隔离的状态。这种隔离性虽然保障了安全性&#xff0c;但在实际应用场景中&#xff0c;孤立的容器…

作者头像 李华
网站建设 2026/3/6 18:13:26

37、函数式输入输出与Actor模型:实现安全高效编程

函数式输入输出与Actor模型:实现安全高效编程 函数式输入输出的栈安全处理 在函数式编程里,使用IO类型处理输入输出是常见操作。不过,有些IO方法在使用栈时和递归方法类似,像 repeat 方法,若重复次数过多,就会导致栈溢出。具体溢出的“过多”数值,取决于栈大小以及方…

作者头像 李华
网站建设 2026/3/3 14:24:41

PhantomCaptcha鱼叉攻击的技术机理与防御策略研究

一、引言2025年10月8日&#xff0c;网络安全公司SentinelOne披露了一起针对乌克兰人道主义援助组织及地方政府机构的高精度鱼叉式网络钓鱼行动&#xff0c;代号“PhantomCaptcha”。该行动在单日内完成部署、投递与初步感染&#xff0c;目标涵盖国际红十字会、挪威难民理事会、…

作者头像 李华
网站建设 2026/3/6 18:22:23

跨境语音钓鱼犯罪的组织形态与综合治理路径研究

摘要近年来&#xff0c;以东南亚国家为据点、针对韩国等高收入经济体实施大规模电信诈骗的“企业化”语音钓鱼团伙日益猖獗。2025年10月&#xff0c;韩国首尔东部地方法院对一个以柬埔寨为基地的语音钓鱼组织成员作出一审判决&#xff0c;主犯获刑6年&#xff0c;其余成员判处3…

作者头像 李华
网站建设 2026/3/3 17:21:43

18、探索Azure事件网格与存储服务的使用

探索Azure事件网格与存储服务的使用 1. 本地测试Azure事件网格与Azure函数 在本地测试Azure事件网格和Azure函数,目前有两种方法: - 捕获并重新发送事件到应用程序。 - 使用ngrok(可从https://ngrok.com/ 获取)将请求转发到本地计算机。 选择哪种方法取决于个人能力,…

作者头像 李华
网站建设 2026/3/5 1:30:23

26、Azure SQL与Azure Data Lake:功能、安全与性能优化全解析

Azure SQL与Azure Data Lake:功能、安全与性能优化全解析 1. Azure SQL 入门 在完成 Azure SQL 数据库的配置并感到满意后,点击“创建”按钮,即可启动资源预配过程。完成后,可以通过“概述”页面访问基本信息。接下来,让我们深入了解 Azure SQL 的各项功能,以便更好地使…

作者头像 李华