gitlab的私有化部署

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示例文件,我们需要注意以下的几个问题:

  1. 我们使用的docker镜像文件gitlab的版本为18.1.2的社区版。gitlab社区版是开源免费的,但只提供基础功能,适合于个人和小型公司。
  2. 我们通过环境变量设置了gitlab的external_url参数,该参数配置为服务器ip(域名也可以)加端口。external_url参数是我们访问gitlab的web服务的地址,它同时也是API访问端点,代码克隆,邮件通知的链接,用户头像和上传文件链接的基础地址。
  3. 环境变量gitlab_rails['gitlab_shell_ssh_port']用于设置gitlab的ssh端口,gitlab通过ssh来克隆、推送或拉取等git仓库的一系列操作。
  4. 如果服务器上的80、22、443的端口已被其他服务占用,我们可以通过端口映射,将gitlab容器的80、22、443这些端口映射到宿主机的其他端口上。例如以上示例中gitlab容器的22端口就映射到了宿主机的2222端口上。
  5. 通过宿主机的目录挂载来将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
  1. 启动gitlab的rails控制台。
bash 复制代码
gitlab-rails console -e production
  1. 在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"分支中了。