gitlab的私有化部署
一.gitlab的概述
gitlab是一个基于git的集成化DevOps平台,提供了代码托管、项目管理、测试、持续集成/持续部署(CI/CD)、监控的软件开发全生命周期的管理功能。
gitlab核心定位为开源的分布式版本控制系统,支持自托管或 SaaS 服务,适用于个人开发到企业级应用。
gitlab基于Ruby on Rails构建,核心模块使用Go语言进行了重构。
gitlab提供了社区版(CE)和企业版(EE)两个版本,社区版提供了基础功能,是开源免费的。企业版需要付费但提供了高级功能。
二.gitlab的安装
1.docker-compose安装
docker-compose是gitlab官网推荐的一种安装方式。使用这种安装方式的先决条件是,服务器上必须先安装了docker环境和docker-compose。
部署gitlab的yml文件如下:
bash
version: '3.6'
services:
web:
image: 'gitlab-ce:18.1.2-ce.0'
restart: always
container_name: gitlab
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://xxx. xxx. xxx. xxx:8181'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
ports:
- '8181:80'
- '2222:22'
- '2443:443'
volumes:
- '/opt/gitlab/app/config/:/etc/gitlab/'
- '/opt/gitlab/app/logs/:/var/log/gitlab/'
- '/opt/gitlab/app/data/:/var/opt/gitlab/'
shm_size: '512m'
通过以上的yaml示例文件,我们需要注意以下的几个问题:
- 我们使用的docker镜像文件gitlab的版本为18.1.2的社区版。gitlab社区版是开源免费的,但只提供基础功能,适合于个人和小型公司。
- 我们通过环境变量设置了gitlab的external_url参数,该参数配置为服务器ip(域名也可以)加端口。external_url参数是我们访问gitlab的web服务的地址,它同时也是API访问端点,代码克隆,邮件通知的链接,用户头像和上传文件链接的基础地址。
- 环境变量gitlab_rails['gitlab_shell_ssh_port']用于设置gitlab的ssh端口,gitlab通过ssh来克隆、推送或拉取等git仓库的一系列操作。
- 如果服务器上的80、22、443的端口已被其他服务占用,我们可以通过端口映射,将gitlab容器的80、22、443这些端口映射到宿主机的其他端口上。例如以上示例中gitlab容器的22端口就映射到了宿主机的2222端口上。
- 通过宿主机的目录挂载来将gitlab的数据进行持久化。上例示例中在宿主机中创建了三个目录挂载到了gitlab容器的三个目录。
|-------------------------|------------------|------------------|
| 宿主机目录 | 容器目录 | 用途 |
| /opt/gitlab/app/config/ | /etc/gitlab/ | 存储极狐gitlab的 配置文件 |
| /opt/gitlab/app/logs/ | /var/log/gitlab/ | 存储gitlab的日志文件 |
| /opt/gitlab/app/data/ | /var/opt/gitlab/ | 存储gitlab应用程序数据 |
6.通过shm_size来显式地设置容器内/dev/shm共享内存区域的大小 。
我们通过docker-compose up --d命令启动gitlab服务后,需要等待一段时间,在浏览器中输入http://xxx.xxx.xxx.xxx:8181/users/sign_in的网址,可访问gitlab登录页面。

2.设置初始用户的密码
gitlab安装部署好,会默认给用户分配一个root账号,root账号的初始密码储存在容器/etc/gitlab/目录的initial_root_password文件中。initial_root_password文件中生成的密码是一个随机的字符串,不太方便记忆,我们可以给root账号设置一个自定义熟悉的密码。
1.进入容器。
bash
docker exec -it gitlab /bin/bash
- 启动gitlab的rails控制台。
bash
gitlab-rails console -e production
- 在rails控制台中逐行执行以下命令。
bash
user = User.find_by_username('root')
user.password = 'xxxxxx' #设置新密码
user.password_confirmation = 'xxxxxx' #确认密码
user.save! #保存更改(注意结尾感叹号)
exit #退出控制台
4.执行exit命令推出容器。
5.重启gitlab的服务。
其实给root账号设置自定义密码,也可以在安装部署gitlab的yml文件中,在环境变量中增加gitlab_rails['initial_root_password'] = "xxxxxx"这个配置项即可。
三.gitlab的配置
1.设置简体中文语言
gitlab默认是英文,我们可将其设置为简体中文。
(1).我们以root账号登录系统后,点击账户图标的下的"Preferences"菜单。

(2).在右侧的"Preferences"页面找到"Localization"下的"Language"下拉框,选择简体中文后,点击页面下方的"Save changes"按钮后,刷新页面即可切换成中文界面。

2.设置登录页的标题
gitlab登录页的标题默认为"GitLab Community Edition"。 Gitlab允许我们设置成自定义的标题。

(1). 我们以root账号登录系统后,点击左侧菜单下面的"管理员"按钮,进入管理区域的菜单。选择菜单"设置"-->"外观"


(2).在右侧的"管理区"/"外观"页面,我们找到"登录/注册页面"的这一项,在"Title"的文本框中输入自定义的标题即可。在本示例中,我们输入了"My GitLab"的这个自定义标题,然后点击"更新外观设置"的按钮保存即可。

我们退出登录后,再返回到了登录页面,会发现此时登录页面的标题变成了"My GitLab "。

3.添加用户
(1). 我们以root账号登录系统后,点击左侧菜单下面的"管理员"按钮后,这时左侧会出现"管理区域"的菜单,再选择"管理区域"的"用户"这个子菜单。

(2).点击"管理区"/"用户"页面右上角的"新用户"按钮,在"帐户"一栏,分别输入"名称"," 用户名"," 电子邮件",然后再点击"创建用户"的按钮,这样一个普通用户就创建好了。


(3).点击用户列表的"编辑"按钮后,在"密码"一栏中输入"密码"和"密码确认"后,点击"保存更改"的按钮,这样用户的密码就已经设置好了,我们就可以使用这个用户登录gitlab系统。用户第一次登录系统后,需要重置密码。

在本文中,我们会创建"user1","user2"两个用户。"user1"作为开发人员,专门负责提交代码到gitlab。"user2"作为管理人员,对"user1"提交的代码进行审核,审核通过后再把代码合并到主分支。
4.创建群组
(1).在左侧边栏的顶部,点击"创建新的+"按钮,再选择子菜单"新建群组"按钮。

或者选择左侧边栏的"群组"菜单后,再点击"新建群组"按钮。

此时右侧的主页面就跳到"创建新的群组"的页面。

(2).在"创建新的群组"的页面,我们可以手动创建一个新的群组,也可以选择从另一个实例导入。本例中选择手动创建一个新的群组。在创建群组的页面,我们输入群组名称,群组的可见性级别默认为"私有",点击页面最下方"创建群组"的按钮后,一个群主就创建好了。


(3).群组创建完成后,我们可以邀请用户加入群组。点击群组的名称"MyGroup",我们会进入群组的管理页面。

进入"MyGroup"群组页面后,我们选择左侧边栏的"管理"菜单下的"成员"子菜单。

再点页面右上角的"邀请成员"按钮,会弹出一个对话框。我们在对话框中选择gitlab中已经创建的用户(本文示例中是user1和user2两个用户)。我们选择user1用户,然后给他"开发人员"的角色,最后点击"邀请"的按钮,就把"user1"加入到了群组。然而user2用户,则给他"维护人员"的角色


5.创建项目
(1).在左侧边栏顶部,点击"创建新的+"按钮,再选择子菜单"新建项目/仓库"按钮,或者在左侧边栏"你的工作"菜单中选择"项目"的菜单后,再点击右边页面的"创建项目"的链接,这样我们就进入了"创建新项目"的页面。

(2).我们可以通过不同的选项来创建一个项目。我们可以创建一个空白项目,或者从内置或自定义模板创建项目,也可以通过"git push"将本地项目仓库添加到给gitLab。本文示例中,我们先创建一个空白项目。

(3).在"创建空白项目"的页面,我们需要输入合规的项目名称,项目的URL中可以选择我们创建的"mygroup"群组。选择这个群组后,群组中的用户对这个项目的权限,会自动继承我们在群组中对用户设置的权限。项目的可见性级别默认为"私有"。最后点击页面下方的"新建项目"的按钮后,这样一个项目就创建完成了。


四.gitlab的提交和合并
经过以上步骤三gitlab的配置后,我们已经创建了项目"MyProject",并创建了两个用户"user1","user2"。 "user1"和"user2"用户对 "MyProject" 项目分别拥有开发者和维护者角色的权限。这些角色权限都是从群组"MyGroup"继承而来。

1.提交请求
"user1"作为项目的开发者,他可以对"MyProject"项目创建一个分支,在这个分支上对文件进行修改。"user1"用户再对本次修改进行提交。
本文中我们以"user1"登录gitlab后,对"MyProject"项目创建一个"test"的分支。

我们进入"MyProject"项目的"test"的分支,对"README.md"文件进行修改,例如在文件中"MyProject"的标题后增加"test"的文本,然后点击页面右上方的"提交更改"按钮。

点击"提交更改"按钮后,页面会弹出一个窗体,要求填写提交的备注信息。填写提交备注信息后,点击窗体右下角的"提交更改"的按钮,这样就完成了对"README.md"文件的修改提交。

如果我们想把在"test"分支的修改提交合并到主分支上,那么我们就需要创建一个合并请求。



创建合并请求时,要选择好相应的"源分支"和"目标分支"。如果合并分支后不想删除"源分支",就需要把"合并选项"的"接受合并请求时删除源分支。"选项的勾选去掉。
2.合并请求
我们以"user2"账户登录gitlab后,进入"MyProject"项目的管理页面。点击左侧菜单的"合并请求",可以看见右侧的页面会出现"user1"账户提交的一个合并请求。

我们点击"this is a test"的链接,就会进入这个合并请求的管理页面。在管理页面中,点击"合并"的按钮。这样就会把"user1"用户在"test"分支上的修改合并主分支"main"上面了。

五.Idea配置gitlab
开发人员可能会使用Idea等工具进行java方面的开发工作,我们把Idea配置到gitlab服务器后,就可以直接通过Idea把修改的代码提交到gitlab服务器,同时也可以在Idea上直接拉取gitlab服务器上的最新代码。
1.创建GitLab仓库访问令牌
我们以"user1"账户登录gitlab系统后,进入"用户设置"模块。点击页面左侧边栏的"访问令牌"的菜单。

点击页面右"Add new token"按钮后,我们需要输入"令牌名称",设置"超期时间",设置"选择范围",本例中的"选择范围"选择的是"api"这个选项。最后点击"Create token"按钮,这样一个token就已经创建完成了。

对于创建好的token我们可以将其复制下来,以便在以下步骤中配置Idea的gitlab的插件时使用。

2.安装gitlab插件
我们打开Idea工具后,点击"File"-->"Settings",此时Idea会弹出一个"Settings"的窗体。

点击窗体左侧边栏的"Plugins"的菜单,然后选择窗体右侧 的"Marketplace",并搜索"gitlab"的插件,此时Idea会罗列出一系列和gitlab有关的插件。

本文中根据自身Idea的版本,选择了"GitLab Projects 2020"这个插件进行安装。选择好插件后,点击"Install"按钮,即可进行插件的安装。插件安装完成后,需要重启Idea。

3.配置gitlab插件
我们还是打开Idea的Settings的窗体,点击窗体左侧边栏的"Version Control"--> "GitLab"的菜单。

点击窗体右上的"Add New GitLab Server"按钮,会弹出一个窗体,我们需要依次输入gitlab服务的地址,ip和端口,访问令牌(步骤1创建的token),再选择Https协议,最后点击"OK"按钮,gitlan插件便已经设置完成。


4.代码提交合并
(1).拉取项目
我们在gitlab上获取到"MyProject"项目的地址。然后通过git的clone命令把gitlab上的"MyProject"项目克隆到本地目录。如果想使用图形界面来操作git的话,可以安装TortoiseGit软件。

在克隆"MyProject"项目时,git会让我们输入gitlab用户的账号和密码。输入完成后,点击"确定"按钮,就可以把"MyProject"项目克隆到本地。


(2).创建项目分支
我们使用Idea打开克隆的"MyProject"项目,创建一个"user1"分支。



在"user1"分支这个分支下,我们增加一个"demo"模块,并在这个模块增加一个"Demo"类,该类只输出一段文本。

(3).提交分支
如果我们把"Demo"类这段代码提交的话,需要先提交到git的本地仓库。


提交到本地仓库后,我们再把这次提交推送到gitlab上。


此时我们以"user1"登录gitlab后,gitlab会提示 "user1"这个分支推送了一个提交,问是否需要创建合并请求,将"user1"分支合并到"main"分支。

"MyProject"项目多了我们在Idea中创建的"user1"分支。

(4).提交合并请求
如果要把"user1"分支的提交合并到主分支"main"上,我们就需要创建一个合并请求。


(5).合并主分支
对于"user1"用户的合并请求,我们需要以"user2"的账户登录gitlab,来执行合并请求的操作。

"user2"在检查提交的代码无误后,点击合并请求页面的"合并"按钮来执行合并的操作,合并时默认是删除源分支的。

合并操作完成后,我们再来查看"main"分支,可以发现"user1"的提交的代码已经出现在了"main"分支中了。
