
# 一、Gitlab基础
# 1.1 Gitlab简介
GitLab 官网 (opens new window) GitLab 中文官网 (opens new window)
极狐GitLab,代码管理私服,项目管理和代码管理平台。
功能使用与Gitee、GitHub一致,且额外增加了群组进行代码分组管理。
GitLab 是一个利用Ruby on Rails开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。GitLab的功能与Github相似,包括源代码浏览、缺陷管理和注释等。
此外,GitLab还提供了强大的团队管理功能,可以方便地管理团队成员对仓库的访问权限。
它的用户界面设计使得浏览提交的版本变得非常容易,并且提供了一个文件历史库,方便用户查看文件的修改历史。
GitLab的这些特性使得它成为了许多公司进行版本管理的首选工具。无论是代码托管、版本控制,还是团队协作,GitLab都提供了一站式的解决方案,满足了软件开发过程中的各种需求。
# 1.2 GitLab角色
GitLab的权限管理主要是通过用户角色和访问级别来实现的。
在GitLab中,每个用户都有一个角色,每个项目都有一组访问级别。
用户的角色决定了他们在GitLab中可以执行的操作,而访问级别则决定了用户可以访问哪些项目。
GitLab定义了以下几个角色:
GitLab官方文档关于 Permissions (opens new window) 有一个很详细的说明。
Guest - 访客
只能查看项目和下载代码,不能对代码进行修改。
Reporter - 报告者
可以克隆代码,不能提交,一般负责提交
issue等;测试员、产品经理、项目主管(PM) 可以赋予这个权限。
Developer - 开发人员
可以克隆代码、提交、推送和创建合并请求;
研发工程师(RD)可以赋予这个权限。
Master - 主程序员
可以创建项目、添加 tag、保护分支、添加项目成员、编辑项目;
核心
RD负责人可以赋予这个权限。Owner - 所有者
这是最高的权限级别,可以设置项目访问权限、删除项目、迁移项目、管理组成员;
开发组
Leader可以赋予这个权限。
在项目中,你可以为每个成员分配一个访问级别。访问级别决定了成员可以在项目中执行的操作。例如,一个Developer级别的成员可以推送代码和创建合并请求,但不能管理项目的设置。
此外,GitLab还支持创建用户组和子组,这使得权限管理更加灵活和方便。你可以为整个组或子组分配一个访问级别,所有的成员将继承这个访问级别。
# 二、GitLab安装
# 2.1 Docker安装
官方下载镜像:https://gitlab.cn/install (opens new window)
本人使用的是GitLab中文版,即汉化的GitLab:twang2218/gitlab-ce-zh
GitLab对资源的要求不低,官推最低配置双核|4G运存。
# 1 下载gitlab中文版
docker pull twang2218/gitlab-ce-zh:11.1.4
# 2 编写docker-compose.yml
mkdir -p /usr/local/docker/gitlab
cd /usr/local/docker/gitlab
vi docker-compose.yml
2
3
docker-compose.yml
version: '3'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh:11.1.4'
restart: always
hostname: 'gitlab.example.com'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8085
ports:
- '8085:8085'
- '2222:22'
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 如果你的服务器有域名,将上面的 gitlab.example.com 替换为实际域名;若无则修改为IP地址。
# 登录
启动 GitLab 后,第一次访问时,会要求设置 root 用户的密码,密码不得小于8位。
设置好后,就可以登录使用了。
尽量不要使用root用户,新建一个用户,授权管理员进行操作。然后再进行编辑,设置密码。
# 三、GitLab操作用户
# 3.1 用户注册
如果我们不是GitLab的用户,可以通过以下两种方式成为GitLab的用户:
- 通过指定的页面去注册;
- 让GitLab的管理员去添加;
# 3.2 创建用户组
在GitLab中,用户可以创建用户组来管理一组用户。要创建一个用户组,你需要在GitLab的导航菜单中选择"Groups",然后点击"New group"按钮。在创建用户组的页面中,你需要提供一个组名和描述,然后点击"Create group"按钮。
参数说明:
Visibility Level(可见性级别):在GitLab中,可见性级别决定了用户组和工程对谁可见。有三种级别:
- Private:只有该用户组的成员可以看到用户组下的所有工程。
- Internal:用户组下的Internal工程对所有已经登录的用户可见,无论他们是否是该用户组的成员。
- Public:用户组和Public工程对所有人可见,无论他们是否登录
Allowed to Create Projects(是否允许创建工程):这个设置决定了用户组的成员是否可以在用户组下创建新的工程。
Role-Based Access Control(基于角色的访问控制):GitLab通过引入角色来管理用户权限,如Guest、Developer、Maintainer等。每个角色都有一组预定义的权限,这些权限决定了用户在用户组和工程中可以执行的操作。
Two-Factor Authentication(双因素认证):GitLab支持双因素认证,这是一种安全特性,要求用户在登录时提供两种形式的身份验证。一种形式通常是密码,另一种形式可以是通过手机应用生成的一次性密码。这增加了账户的安全性,因为攻击者需要同时获取这两种形式的身份验证才能登录账户。
# 3.3 为用户组添加用户
创建完用户组后,你可以将用户添加到这个组中。
要添加用户,你需要在用户组的页面中选择"Members",然后点击"Invite member"按钮。
在邀请成员的页面中,你需要输入用户的用户名或电子邮件地址,然后选择一个访问级别,最后点击"Invite"按钮。
# 3.4 为工程添加访问权限
在GitLab中,你可以为工程添加访问权限来控制用户对工程的访问。
要添加访问权限,你需要在工程的页面中选择"Settings",然后选择"Members"。
在成员页面中,你可以看到当前工程的所有成员和他们的访问级别。你可以点击"Invite member"按钮来添加新的成员,或者点击已有成员旁边的"Edit access"按钮来修改他们的访问级别。
# 四、GitLab迁移
# 1、直接迁移数据卷
# 核心思路
直接在旧服务器上停止旧容器,然后将整个GitLab数据目录(通常是 config, data, logs 三个文件夹)打包,传输到新服务器相同路径下解压,然后在新服务器上启动一个挂载这些目录的、版本相同的GitLab容器。
这种方法简单,省去了备份恢复的漫长过程,但风险稍高。首先,前提条件是新旧服务的版本必须一致。其次如果新旧服务器系统环境有差异,都可能会遇到问题。
# 具体步骤
- 镜像:
twang2218/gitlab-ce-zh:11.1.4(中文版,版本11.1.4) - 容器名:
gitlab_gitlab_1 - 端口映射:Web端口是
8085,SSH端口是2222 - 状态:运行正常(healthy)
# 1、新服务部署
新服务器,部署与旧服务器一模一样配置的gitlab服务。
启动成功后登录测试。
# 2、旧服务器备份
- 进入旧容器
docker exec -it gitlab_gitlab_1 /bin/bash
- 执行全量备份
# 创建备份(会在 /var/opt/gitlab/backups/ 生成 .tar 文件)
gitlab-rake gitlab:backup:create
2
- 查看备份文件名
# 列出备份文件,记住文件名中的时间戳部分
ls -la /var/opt/gitlab/backups/
2
会看到类似
1788935894_2026_09_09_11.1.4_gitlab_backup.tar的文件,记下1788935894_2026_09_09_11.1.4这串时间戳。
- 退出容器
exit
- 在宿主机挂载目录找到该文件
# 拷贝备份文件到当前目录
/data/backups/1788935894_2026_09_09_11.1.4_gitlab_backup.tar
2
- 拷贝关键配置文件到宿主机
# 拷贝 gitlab.rb 和 gitlab-secrets.json(极其重要!)
/config/gitlab.rb
/config/gitlab-secrets.json
2
3
将上述3个文件传输到新服务器
可通过XFTP进行中转传输。
# 3、新服务器恢复
- 将备份文件拷贝到新容器,放置在同样的挂载目录位置。
# 将备份文件拷贝到容器内的备份目录
/data/backups/
# 将2个配置文件拷贝到容器内
/config
2
3
4
5
- 重启服务
docker restart gitlab_gitlab_1
等待3分钟左右,等gitlab所有服务均启动成功后再操作。
- 进入新容器
docker exec -it gitlab_gitlab_1 /bin/bash
- 停止相关服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
2
- 执行恢复命令
# BACKUP=后面只填时间戳部分(即文件名中 _gitlab_backup.tar 前面的部分)
gitlab-rake gitlab:backup:restore BACKUP=1691154832_2023_08_04_11.1.4
2
恢复过程中会提示
yes/no,输入yes确认。
- 重新配置并重启
# 重新加载配置
gitlab-ctl reconfigure
# 启动所有服务
gitlab-ctl start
2
3
4
5
- 退出容器
exit
- 重启容器(确保所有服务正常)
docker restart gitlab_gitlab_1
等待 2-3 分钟,访问 http://新服务器IP:8085。
# 4、检查
- 登录:用旧服务器的管理员账号登录。
- 项目:所有项目、仓库、分支、提交记录是否完整。
- 用户:用户列表和权限是否正常。
# 五、Gitlab的code review
在GitLab中,代码审查主要通过合并请求(Merge Request)来进行。以下是它的详细步骤:
创建新的分支:首先,你需要为你的修改创建一个新的分支。这可以通过Git命令来完成,例如:
git checkout -b my-feature-branch1这将会创建一个名为
my-feature-branch的新分支,并切换到这个分支。进行修改:然后,你可以在这个分支上进行修改。你可以修改代码、添加新的文件或删除不需要的文件。当你对修改满意时,你可以提交这些修改,例如:
git add . git commit -m "Add my new feature"1
2推送分支:提交完修改后,你需要将这个分支推送到GitLab,例如:
git push origin my-feature-branch1这将会将
my-feature-branch分支推送到GitLab。创建合并请求:推送完分支后,你需要在GitLab上创建一个合并请求。你可以在GitLab的页面上找到你的项目,然后点击"Merge Requests",然后点击"New Merge Request"。在创建合并请求的页面中,你需要选择你刚刚推送的分支作为源分支,选择你想要合并的分支(通常是
master或main)作为目标分支,然后填写合并请求的标题和描述,最后点击"Submit merge request"。进行代码审查:创建完合并请求后,你的团队成员就可以对你的修改进行审查了。他们可以在合并请求的页面中查看你的修改,提出评论和建议。你可以回应他们的评论,进行必要的修改,并更新你的合并请求。
合并修改:当所有的审查者都满意你的修改时,你或者有权限的人可以点击"Merge"按钮来合并你的修改。这将会将你的修改合并到目标分支,并关闭合并请求。
在实际操作中,你可能还需要根据你的具体需求和团队的工作流程进行一些额外的步骤,例如进行持续集成/持续部署(CI/CD)、进行代码质量检查等。
# 六、团队知识管理
# 是什么
团队知识管理是指在团队中收集、组织、共享和利用知识的过程。
在GitLab中,团队知识管理主要通过Wiki、Issues和Merge Requests等功能来实现。
# 为什么
团队知识管理对于任何团队来说都是非常重要的,尤其是对于软件开发团队。
通过有效的知识管理,团队可以更好地共享信息,提高工作效率,减少重复工作,提高问题解决的速度,以及更好地协作。
在GitLab中,团队知识管理可以帮助团队成员更好地理解项目的背景和目标,更有效地协作,以及更容易地找到和利用已有的知识。
# 怎么做
在GitLab中,可以通过以下方式进行团队知识管理:
- 使用Wiki:GitLab提供了一个内置的Wiki系统,你可以使用它来创建和分享文档。你可以在Wiki中记录项目的背景信息、设计决策、使用说明等。Wiki支持Markdown,所以你可以创建格式化的文档,并包含图片、链接和其他媒体。
- 使用Issues:你可以使用Issues来跟踪任务和问题。每个Issue都可以包含描述、评论和附件,所以你可以在其中记录和分享知识。你还可以使用标签来分类Issues,使得它们更容易被找到和理解。
- 使用Merge Requests:你可以使用Merge Requests来进行代码审查。在Merge Request的描述和评论中,你可以记录和分享关于代码的知识,例如为什么这样修改、如何测试等。
- 使用Snippets:你可以使用Snippets来分享代码片段。每个Snippet都可以包含描述和评论,所以你可以在其中记录和分享关于代码的知识。