news 2026/5/9 11:45:49

自建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/5/9 11:44:39

2025AI一键生成Mermaid流程图:让代码变图表的智能工具

在日常工作中&#xff0c;你是不是经常需要绘制流程图&#xff0c;但又觉得手写Mermaid代码太麻烦&#xff1f;或者对Mermaid语法不熟悉&#xff0c;不知道如何开始&#xff1f;其实&#xff0c;现在有了AI的帮助&#xff0c;这一切都变得简单了。你只需要用文字描述你的流程&a…

作者头像 李华
网站建设 2026/5/4 19:38:32

6、利用Ansible Container构建并部署NGINX容器

利用Ansible Container构建并部署NGINX容器 在容器化技术盛行的今天,Ansible Container为我们提供了一种高效、便捷的方式来构建和管理容器化应用。本文将详细介绍如何使用Ansible Container来安装、运行、修改和推送NGINX角色,帮助你快速搭建一个功能完善的NGINX服务器容器…

作者头像 李华
网站建设 2026/5/4 15:29:27

8、使用Ansible Container构建MariaDB容器详细指南

使用Ansible Container构建MariaDB容器详细指南 1. 初始化MariaDB项目和角色 在对支持容器的角色结构有了一定了解后,我们可以通过初始化一个新的Ansible Container项目来启动MariaDB容器。以下是具体步骤: 1. 在Vagrant主机的新目录中,使用 ansible-container init 命…

作者头像 李华
网站建设 2026/4/30 18:06:12

36、UUCP 系统配置、安全防护与协议详解

UUCP 系统配置、安全防护与协议详解 一、UUCP 系统配置 1.1 文件转发设置 在 UUCP 系统中,文件转发设置十分重要。例如,有如下配置: # pablo system pablo ... forward uchile #################### # uchile system uchile ... forward-to pablo这里 uchile 的 for…

作者头像 李华
网站建设 2026/5/4 11:59:45

24、使用 Azure Application Insights 监控应用程序

使用 Azure Application Insights 监控应用程序 在开发和部署应用程序到云端后,对其进行监控和诊断是至关重要的。Azure Application Insights 服务为维护应用程序提供了一套完整的工具集,支持多种语言和平台的 SDK,具备警报功能、查询语言,还能与许多原生 Azure 服务集成…

作者头像 李华
网站建设 2026/5/3 22:15:17

5、Java 中的类型转换与强制类型转换

Java 中的类型转换与强制类型转换 在 Java 编程中,类型转换和强制类型转换是非常重要的概念。了解何时以及如何进行类型转换和强制类型转换,对于编写高效、健壮的 Java 代码至关重要。本文将详细介绍 Java 中的类型转换和强制类型转换,包括显式和隐式类型更改、基本类型和对…

作者头像 李华