CI/CD(一)—— 从零搭建 GitLab 全流程(Docker 部署 + 实战指南)
文章目录
- 前言
- 一、GitLab应用
- 1.1 为什么学习 GitLab?
- 1.2 GitLab 是什么?
- 1.3 GitLab 的特点
- 1.5 GitLab 与 SVN 的对比
- 二、通过 Docker 部署本地 GitLab 服务
- 2.1 安装 Docker(CentOS 系列示例)
- 2.2 拉取 GitLab 镜像
- 2.3 处理 22 端口冲突(宿主 SSH 改口)
- 2.4 启动 GitLab 容器
- 2.5 首次访问与基础概念
- 三、在 GitLab 中创建组织与项目
- 3.1 创建群组(devops)
- 3.2 创建用户并加入群组
- 3.3 创建项目(myweb)与授权
- 四、使用新账户登录并初始化仓库
- 4.1 首次登录与密码修改
- 4.2 对于没有创建过 git 版本库的主机
- 4.3 对于已有本地仓库的主机
- 4.3.1 HTTP 方式推送
- 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 模式,是现代团队开发的更优选择。
参考阅读:
- GitLab 官方文档
- GitLab CI/CD 配置指南
- Git 与 SVN 区别详解
二、通过 Docker 部署本地 GitLab 服务
2.1 安装 Docker(CentOS 系列示例)
确保虚拟机拥有至少 4G 内存,并安装 Docker:
# 安装依赖与 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 服务:
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service

2.2 拉取 GitLab 镜像
可以选择中文社区版镜像或官方社区版镜像:
# 中文社区版(带中文支持)
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:
vim /etc/ssh/sshd_config
# 将端口改为:
Port 2222systemctl restart sshd
如果你更倾向于不改宿主口,也可将容器的 22 端口映射到宿主的非 22 端口,例如
-p 2222:22。本文采用“宿主改 2222 + 容器仍映射 22:22”的方式,保持一致性最简单。
2.4 启动 GitLab 容器
方案 A:使用中文社区版镜像
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:使用官方社区版镜像
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
检查运行状态:
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、克隆远程项目到本地:
cd /opt
git clone http://<服务器IP地址>/devops/myweb.git

2、进入项目目录并创建README文件:
cd myweb
ls -A myweb/ # 目录中仅显示 .git,说明当前项目是一个 Git 仓库,但还没有其他文件
touch README.md # 创建项目说明文件
3、配置当前用户身份信息(用户名和邮箱)
git config user.name "yjs"
git config user.email "yjs@yjs.com"
git config --list

4、提交文件到本地仓库:
git add README.md # 添加到暂存区
git commit -m "add README" # 提交到本地仓库,-m指定提交说明

5、推送到远程仓库:
git push -u origin master # -u设置默认上游分支,后续可直接用git push
执行时需输入用户名
yjs和密码root@123。

6、验证结果
-
在浏览器中打开远程仓库,检查是否有 README.md 文件和提交记录。

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

4.3 对于已有本地仓库的主机
4.3.1 HTTP 方式推送
1、进入本地项目目录,关联远程仓库:
cd /opt/myweb/
git remote add origin http://<服务器IP地址>/devops/myweb.git
2、查看远程仓库配置:
git remote # 输出应显示origin
3、推送所有分支和标签到远程:
git push -u origin --all # 推送所有分支
git push -u origin --tags # 推送所有标签
#刷新页面即可看到上传的代码和对应的 tag 标记

4.3.2 SSH 免密推送
1、本地生成SSH密钥:
ssh-keygen -t rsa -C "yjs@yjs.com" -b 4096 # 一路回车使用默认配置
2、查看公钥内容:
cat ~/.ssh/id_rsa.pub
3、在GitLab页面配置公钥:
- 点击右上角用户头像→【设置】→【SSH密钥】。
- 复制公钥内容到文本框,点击【增加密钥】。

4、切换远程仓库为SSH协议:
git remote remove origin # 删除原有HTTP协议配置
git remote add origin git@<服务器IP地址>:devops/myweb.git # 添加SSH协议地址
git remote show origin # 查看当前的 remote 方式

5、测试免密推送:
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遇到任何问题,欢迎在评论区讨论。
