CICD(一)—— 从零搭建 GitLab 全流程(Docker 部署 + 实战指南)

文章目录

  • 前言
  • 一、GitLab应用
    • [1.1 为什么学习 GitLab?](#1.1 为什么学习 GitLab?)
    • [1.2 GitLab 是什么?](#1.2 GitLab 是什么?)
    • [1.3 GitLab 的特点](#1.3 GitLab 的特点)
    • [1.5 GitLab 与 SVN 的对比](#1.5 GitLab 与 SVN 的对比)
  • [二、通过 Docker 部署本地 GitLab 服务](#二、通过 Docker 部署本地 GitLab 服务)
    • [2.1 安装 Docker(CentOS 系列示例)](#2.1 安装 Docker(CentOS 系列示例))
    • [2.2 拉取 GitLab 镜像](#2.2 拉取 GitLab 镜像)
    • [2.3 处理 22 端口冲突(宿主 SSH 改口)](#2.3 处理 22 端口冲突(宿主 SSH 改口))
    • [2.4 启动 GitLab 容器](#2.4 启动 GitLab 容器)
    • [2.5 首次访问与基础概念](#2.5 首次访问与基础概念)
  • [三、在 GitLab 中创建组织与项目](#三、在 GitLab 中创建组织与项目)
    • [3.1 创建群组(devops)](#3.1 创建群组(devops))
    • [3.2 创建用户并加入群组](#3.2 创建用户并加入群组)
    • [3.3 创建项目(myweb)与授权](#3.3 创建项目(myweb)与授权)
  • 四、使用新账户登录并初始化仓库
    • [4.1 首次登录与密码修改](#4.1 首次登录与密码修改)
    • [4.2 对于没有创建过 git 版本库的主机](#4.2 对于没有创建过 git 版本库的主机)
    • [4.3 对于已有本地仓库的主机](#4.3 对于已有本地仓库的主机)
      • [4.3.1 HTTP 方式推送](#4.3.1 HTTP 方式推送)
      • [4.3.2 SSH 免密推送](#4.3.2 SSH 免密推送)
  • 五、常见问题与发布前检查清单
  • 总结

前言

在团队协作、代码托管与 CI/CD(持续集成/持续交付)一体化上,GitLab 提供开箱即用的完整方案。本文面向初学与落地实践者,手把手演示如何在 Linux 服务器上通过 Docker 部署 GitLab,并完成从创建群组与项目成员管理、仓库推送(HTTP/SSH的完整流程)。文末已附常见问题,帮助你避坑提效。


一、GitLab应用

1.1 为什么学习 GitLab?

学习 GitLab 的意义不仅在于掌握一个代码托管工具,更在于深入理解现代开发流程的自动化与协作机制。

1、提升团队协作效率 :GitLab 支持多人协作、分支管理与代码审查,帮助团队在分布式环境下高效开发。

2、自动化构建与部署 :借助 GitLab CI/CD,可以实现从代码提交到部署上线的全流程自动化,大幅减少人工操作与错误。

3、符合 DevOps 思维 :GitLab 是一体化 DevOps 平台,涵盖开发、测试、交付与运维环节,符合现代持续交付理念。

4、提高安全与可控性:通过自部署与权限管理,团队可以完全掌控代码与数据,确保系统安全与合规。


1.2 GitLab 是什么?

GitLab 是一个基于 Git 的开源 DevOps 平台,提供完整的 代码管理、CI/CD、项目管理、代码审查 等功能。它不仅仅是一个类似 GitHub 的代码托管服务,更是一个可完全自部署的企业级 DevOps 平台。

核心功能包括:

  • Git 仓库管理:基于 Git 的版本控制与分支协作。
  • CI/CD 自动化 :通过 .gitlab-ci.yml 文件配置构建、测试、部署流程。
  • 项目与任务管理:支持看板、里程碑、问题追踪。
  • 安全与权限控制:可细化到用户级、项目级的权限配置。
  • 容器与云平台集成:内置容器注册表,支持与 Kubernetes 集成。

1.3 GitLab 的特点

1、开源可自部署

GitLab 提供自部署选项,可完全运行在本地服务器或私有云中,适合注重安全与数据主权的企业。

2、完整 DevOps 生命周期支持

从代码编写到部署监控,GitLab 覆盖软件生命周期的每个阶段,是真正的一体化 DevOps 平台。

3、灵活的 CI/CD 配置

通过 .gitlab-ci.yml 文件,可自由定义构建与部署流程,满足多样化项目需求。

4、高可定制性

支持自定义工作流、权限模型、UI 界面,灵活适配企业级开发环境。

5、多版本选择

提供社区版(CE)与企业版(EE),满足个人开发者到大型组织的不同使用场景。


1.5 GitLab 与 SVN 的对比

对比维度 GitLab(Git) SVN(Subversion)
版本控制方式 分布式版本控制,每个开发者都有完整仓库,可脱机操作 集中式版本控制,依赖中央服务器
协作模式 分支开发 + 合并请求,支持多人协作与代码审查 集中式协作,冲突处理频繁
CI/CD 支持 原生内置 CI/CD,自动化程度高 需依赖第三方插件或工具
分支管理 创建、合并、切换高效灵活 分支管理复杂且性能低
自部署与安全 完全可自部署,权限控制细致 可自部署但配置复杂,权限简单
学习曲线 学习曲线稍陡,但功能强大 上手快,功能相对有限

结论

GitLab 在分布式协作、自动化构建与部署、灵活分支管理等方面,均优于传统的 SVN 模式,是现代团队开发的更优选择。


参考阅读


二、通过 Docker 部署本地 GitLab 服务

2.1 安装 Docker(CentOS 系列示例)

确保虚拟机拥有至少 4G 内存,并安装 Docker:

bash 复制代码
# 安装依赖与 Docker CE 源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io

# 配置镜像加速器与基础参数
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": { "max-size": "100m" }
}
EOF
# 备选镜像(可选,按需加入上方数组):
# "https://6ijb8ubo.mirror.aliyuncs.com",
# "https://hub.littlediary.cn/"

启动 Docker 服务:

bash 复制代码
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service

2.2 拉取 GitLab 镜像

可以选择中文社区版镜像或官方社区版镜像:

bash 复制代码
# 中文社区版(带中文支持)
docker pull twang2218/gitlab-ce-zh
# - twang2218:镜像的维护者(仓库用户)。
# - gitlab-ce-zh:镜像名称,表示带中文支持的 GitLab 社区版。
    
# 官方社区版(备选)
docker pull gitlab/gitlab-ce:latest

若不指定标签,默认拉取 latest。生产中建议固定版本标签,版本切换遵循官方升级路径。

2.3 处理 22 端口冲突(宿主 SSH 改口)

GitLab 容器默认会占用 22 端口(容器内 SSH),避免与宿主机 SSH 冲突,建议先把宿主机 SSH 改到 2222

bash 复制代码
vim /etc/ssh/sshd_config
# 将端口改为:
Port 2222

systemctl restart sshd

如果你更倾向于不改宿主口,也可将容器的 22 端口映射到宿主的非 22 端口,例如 -p 2222:22。本文采用"宿主改 2222 + 容器仍映射 22:22"的方式,保持一致性最简单。

2.4 启动 GitLab 容器

方案 A:使用中文社区版镜像

bash 复制代码
docker run -d \
  -h gitlab \                         # 指定容器主机名
  -p 443:443 -p 80:80 -p 22:22 \
  --name gitlab \
  --restart always \
  -v /srv/gitlab/config:/etc/gitlab \        # 挂载gitlab的配置文件
  -v /srv/gitlab/logs:/var/log/gitlab \      # 挂载gitlab的日志文件
  -v /srv/gitlab/data:/var/opt/gitlab \      # 挂载gitlab的数据
  twang2218/gitlab-ce-zh:latest
======================================================================================
docker run -d \
-h gitlab \
-p 443:443 -p 80:80 -p 22:22 \
--name gitlab \
--restart always \
-v /srv/gitlab/config:/etc/gitlab \
-v /srv/gitlab/logs:/var/log/gitlab \
-v /srv/gitlab/data:/var/opt/gitlab \
twang2218/gitlab-ce-zh:latest

方案 B:使用官方社区版镜像

bash 复制代码
docker run -d \
  --hostname gitlab \
  -p 443:443 -p 80:80 -p 22:22 \
  --name gitlab \
  --restart always \
  -v /srv/gitlab/config:/etc/gitlab \
  -v /srv/gitlab/logs:/var/log/gitlab \
  -v /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

检查运行状态:

bash 复制代码
docker ps -a
# 看到 STATUS 为 (healthy) 后再访问 Web 界面

GitLab 首次启动资源占用较高,初始化需要数分钟,待容器健康检查通过再访问。

2.5 首次访问与基础概念

浏览器访问 http://<服务器IP>,初次会要求为 root 设置密码;登录完成后点击顶部【扳手】进入"管理区域"。常用概念:群组(Group)项目(Project)成员(Member)

gitlab 中重要的概念:

  • 群组(Group):对应一个开发团队,比如开发部组、测试部组、运维部组等。
  • 项目(Groject):对应软件项目,比如开发部开发的每一个软件项目。
  • 成员(Member):对应用户,用于将用户加入到组中,比如可将几个程序员加入到某一个软件项目组中,各自完成不同的功能模块的代码并上传,来共同完成整个软件项目。

三、在 GitLab 中创建组织与项目

3.1 创建群组(devops)

1、点击【新建群组】。

2、【群组路径】【群组名称】【描述】均填写 devops

3、【可见等级】设为公开 ,其余默认,点击【创建群组】。

3.2 创建用户并加入群组

1、进入"管理区域"→【新建用户】:

  • 姓名:yjs
  • 用户名:yjs
  • 邮箱:yjs@yjs.com(密码暂不设,先创建用户)


2、创建后点右上角【编辑】,设置密码,例如 abc@1234

3、把用户加入 devops 群组,角色选主程序员 (Maintainer)。

3.3 创建项目(myweb)与授权

创建项目 myweb,授权 yjs 是项目的主程序员,使其具有上传代码的权限:

1、管理区域→【新建项目】;

2、项目路径选择群组 devops

3、项目名称与描述均设为 myweb

4、可见等级设为公开 →【创建项目】;

5、项目设置→【成员】:添加 yjs主程序员

添加单个成员到项目中

1、点击左边菜单【设置】->【成员】进入"项目成员"

2、【添加成员】中的【选择要邀请的成员】选择yjs

3、【选择角色权限】选择 主程序员

4、点击 【添加到项目】
通过在群组中添加成员,加入到项目中

1、点击页面上方的【群组】->【您的群组】选择 devops

2、点击左边菜单【成员】

3、【添加成员到 devops】选择 yjs,主程序员

4、点击 【添加到群组】


四、使用新账户登录并初始化仓库

4.1 首次登录与密码修改

退出 root,使用 yjs/abc@1234 登录,首次登录系统会强制修改密码(例如改为 root@123)后再登录。

4.2 对于没有创建过 git 版本库的主机

1、克隆远程项目到本地:

bash 复制代码
cd /opt
git clone http://<服务器IP地址>/devops/myweb.git

2、进入项目目录并创建README文件:

bash 复制代码
cd myweb
ls -A myweb/     # 目录中仅显示 .git,说明当前项目是一个 Git 仓库,但还没有其他文件
touch README.md  # 创建项目说明文件

3、配置当前用户身份信息(用户名和邮箱)

bash 复制代码
git config user.name "yjs"
git config user.email "yjs@yjs.com"
git config --list

4、提交文件到本地仓库:

bash 复制代码
git add README.md  # 添加到暂存区
git commit -m "add README"  # 提交到本地仓库,-m指定提交说明

5、推送到远程仓库:

bash 复制代码
git push -u origin master  # -u设置默认上游分支,后续可直接用git push

执行时需输入用户名yjs和密码root@123

6、验证结果

  • 在浏览器中打开远程仓库,检查是否有 README.md 文件和提交记录。

  • 运行以下命令查看提交历史:git log --oneline

4.3 对于已有本地仓库的主机

4.3.1 HTTP 方式推送

1、进入本地项目目录,关联远程仓库:

bash 复制代码
cd /opt/myweb/
git remote add origin http://<服务器IP地址>/devops/myweb.git

2、查看远程仓库配置:

bash 复制代码
git remote  # 输出应显示origin

3、推送所有分支和标签到远程:

bash 复制代码
git push -u origin --all  # 推送所有分支
git push -u origin --tags  # 推送所有标签
#刷新页面即可看到上传的代码和对应的 tag 标记

4.3.2 SSH 免密推送

1、本地生成SSH密钥:

bash 复制代码
ssh-keygen -t rsa -C "yjs@yjs.com" -b 4096  # 一路回车使用默认配置

2、查看公钥内容:

bash 复制代码
cat ~/.ssh/id_rsa.pub

3、在GitLab页面配置公钥:

  • 点击右上角用户头像→【设置】→【SSH密钥】。
  • 复制公钥内容到文本框,点击【增加密钥】。

4、切换远程仓库为SSH协议:

bash 复制代码
git remote remove origin  # 删除原有HTTP协议配置
git remote add origin git@<服务器IP地址>:devops/myweb.git  # 添加SSH协议地址
git remote show origin # 查看当前的 remote 方式

5、测试免密推送:

bash 复制代码
echo '<h3>new line</h3>' >> index.html  # 修改文件
git add .  # 添加所有修改到暂存区
git commit -m "modify index third"  # 提交到本地仓库
git push  # 免密推送到远程(无需输入用户名密码)
git push --tags   #将所有本地的 Git 标签(Tags)推送到远程仓库
#刷新页面即可看到上传的代码和对应的 tag 标记  

五、常见问题与发布前检查清单

1、容器健康检查迟迟不变为 healthy :耐心等待数分钟;机器规格建议 ≥4GB 内存;观察 docker logs -f gitlab

2、22 端口冲突 :按文中方式改宿主 SSH 为 2222,或将容器 22 改映射到宿主 2222。两种选一种保持一致。

3、推送失败 :确认是否已设置 remote origin;HTTP 方式需账户口令,SSH 方式需添加公钥并使用 git@<IP>:group/project.git

4、.gitignore 不生效 :对已跟踪文件需先 git rm --cached <file> 再提交。


总结

本文从GitLab的基础认知出发,详细讲解了通过Docker部署本地GitLab服务的全流程,包括环境准备、容器配置、用户与项目管理,以及代码提交的两种方式(HTTP与SSH),帮助读者建立对版本控制工具的系统认知。

读者可以据此快速完成 GitLab 的落地部署,并将项目开发流程顺畅迁移到 Git/GitLab 的现代协作范式中。如果在部署GitLab遇到任何问题,欢迎在评论区讨论。

相关推荐
鼓掌MVP7 小时前
CI/CD:现代软件开发的持续交付之道
ci/cd
Test-Sunny7 小时前
MLOps 的CI/CD VS DevOps 的CI/CD
运维·ci/cd·devops
摇滚侠19 小时前
VScode 提交代码 Git
git
YuforiaCode21 小时前
移除原有 Git 仓库关联,在IDEA中重新初始化 Git 并推送到新仓库(详细图解、包含相关问题的解决办法)
git
UIUV21 小时前
Git程序员入门笔记:从零开始掌握分布式版本控制
git
星光不问赶路人21 小时前
彻底清理 Git 分支:从查看到批量删除无效分支的全流程指南
git·github
如果是君1 天前
【git使用】ubuntu下利用git工具提交一个工程
linux·git·ubuntu
一念一花一世界1 天前
Arbess从入门到实战(16) - 使用Arbess+Gitee实现K8s自动化部署
ci/cd·云原生·容器·kubernetes·tiklab
吃鱼吃鱼吃不动了1 天前
常用的 git 命令
git