一. GitLab简介

     GitLab 是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。

     与 Github 类似,GitLab 能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,

便于日后有需要的时候进行查找   

• GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务

• GitLab基于Ruby语言编写,是乌克兰的程序猿研发的产品

常用的网站:

官网:https://about.gitlab.com/

国内镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/

二. GitLab部署

1. Gitlab安装

安装依赖

[root@m01 ~]# yum install curl policycoreutils openssh-server openssh-clients policycoreutils-python –y
#下载安装包
[root@m01 ~]# cd /server/tools/
[root@m01 tools]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.6.10-ce.0.el7.x86_64.rpm
# 安装gitlab
[root@m01 tools]# rpm -ivh gitlab-ce-11.6.10-ce.0.el7.x86_64.rpm
[root@m01 tools]# rpm -qa |grep gitlab
gitlab-ce-11.6.10-ce.0.el7.x86_64

2. Gitlab配置

    GitLab 的默认配置文件为于:/etc/gitlab/gitlab.rb,修改下图所示的 external_url为本机 IP 地址或者一个可以访问到本机的域名。

    修改完配置文件后,使用gitlab-ctl reconfigure重新配置gitlab

gitlab项目及团队管理 gitlab有项目管理功能吗_gitlab项目及团队管理

[root@m01 tools]# gitlab-ctl reconfigure
[root@m01 tools]# gitlab-ctl status
[root@m01 tools]# gitlab-ctl restart

说明:gitlab服务说明:

GitLab 由主要由以下服务构成,他们共同承担了 Gitlab 的运作需要

nginx                           web服务器

gitlab-workhorse         轻量级反向代理服务器

logrotate                     日志的分割处理

postgresql                  gitlab数据库

redis                           gitlab缓存

sidekiq                       gitlab任务队列

unicorn                      gitlab服务托管

3. 浏览器页面访问,首次登陆会要求更改root用户的密码,更改完密码之后,用root登录

http://10.0.0.61

gitlab项目及团队管理 gitlab有项目管理功能吗_gitlab项目及团队管理_02

 

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_03

三、gitlab常用命令

gitlab-ctl start: 启动全部服务

gitlab-ctl restart: 重启全部服务

gitlab-ctl stop:停止全部服务

gitlab-ctl reconfigure: 使配置文件生效(只要一修改配置文件就必须执行此命令)

gitlab-ctl show-config :验证配置文件

gitlab-ctl uninstall: 删除gitlab(保留数据)

gitlab-ctl cleanse: 删除所有数据,从新开始

gitlab-ctl tail <service name> 查看服务的日志

四、gitlab的目录

/var/opt/gitlab/git-data/repositories:            库默认存储目录

/opt/gitlab               应用代码和相应的依赖程序

/var/opt/gitlab gitlab-ctl reconfigure              命令编译后的应用数据和配置文件,不需要人为修改配置

/etc/gitlab               配置文件目录

/var/log/gitlab        此目录下存放了gitlab各个组件产生的日志

/var/opt/gitlab/backups/         备份文件生成的目录

五. GitLab配置

1. 关闭注册

• 目的:使系统更安全,员工账号由开发组长统一分配

  由于我们Gitlab系统是私有仓库,一般用户都是由管理员创建和分派的,所以我们需要关闭注册。使用 root 用户登录,点击页面上方的 Adminarea,进入管理员区域页面,点击页面左侧菜单栏下方的 Setting,进入 Settings 页面,下拉页面找到 Sign-up Restrictions 选项,取消 Sign-up enabled 选项前面的勾选,下拉到页面的下方,点击 Save 按钮完成配置。退回到系统的登录页面,发现已经没有用户注册功能。

①. 以管理员登录

gitlab项目及团队管理 gitlab有项目管理功能吗_配置文件_04

②. 修改系统设置

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_05

注意:不勾选的是Sign-up Restrictions,而不是Sign-in Restrictions,否者会无法登录

③. 最终结果

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_06

2. 自定义专属首页

①. 修改系统设置

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_07

gitlab项目及团队管理 gitlab有项目管理功能吗_git_08

②. 最终结果

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_09

3. 创建用户、用户组和项目

   GitLab 是通过组(group)的概念来统一管理仓库(project)和用户(user),通过创建组,在组下再创建仓库,再将用户加入到组,从而实现用户与仓库的权限管理。

gitlab项目及团队管理 gitlab有项目管理功能吗_git_10

①. 创建用户组

    在管理员页面点击页面顶部的 Admin area 按钮,进入管理员区域,在页面右侧点击绿色的 New group 按钮,进入创建组页面。在创建组页面中,组路径和组名称为必填项,而且此两处内容好一致:

    注:visibility Level:选择谁可以访问该组:我们默认选择 private 即可

          Private:只有授权的用户才可以看到

          Internal:只要是登录 gitlab 的用户就可以看到

          Public:只要可以访问 gitlab web 页面的人就可以看到

   点击页面下的 create group 按钮,完成组的创建,进入组管理页面

gitlab项目及团队管理 gitlab有项目管理功能吗_gitlab项目及团队管理_11

gitlab项目及团队管理 gitlab有项目管理功能吗_git_12

②. 创建新用户

      在管理员页面点击页面顶部的 Admin area 按钮,进入管理员区域,在页面右侧点击绿色的 New user 按钮,进入创建用户页面:在创建用户页面,输入用户名昵称、用户名、电子邮件、选择用户级别。点击页面下部的 create user 按钮,完成用户创建,进入用户管理页面,点击页面右上页的 Edit 按钮,为用户设置初始密码,在此页面也可同时修改用户注册信息。

gitlab项目及团队管理 gitlab有项目管理功能吗_配置文件_13

gitlab项目及团队管理 gitlab有项目管理功能吗_git_14

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_15

③. 添加用户到组

     用户创建完成后,需要对用户进行授权,从而使用户可以管理仓库,有两种方式,一是将用户加入到组,这样用户可以管理组内的仓库,二是直接授权用户管理仓库。通常我们采用的方式是将用户加入相应的组,并赋予不同的角色。GitLab 中用户的角色是系统定义好的,不能更改。

注:关于每一种角色对应的权限,可参见官方文档相关内容:https://docs.gitlab.com/ee/user/permissions.html

    下面我们将刚创建的 learn_gitlab 用户添加到我们的 group01 组,将赋予 guest权限,在管理员区域,点击 oldboy 组,进入组管理页面:选择我们刚创建的 learn_gitlab 用户,选择 guest 角色,然后添加到组。

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_16

gitlab项目及团队管理 gitlab有项目管理功能吗_gitlab项目及团队管理_17

gitlab项目及团队管理 gitlab有项目管理功能吗_配置文件_18

④. 创建项目

     在 GitLab 中,可以创建 project 用来存储你的程序代码、作为一个问题跟踪器、用于代码协作、用于持续集成中的构建、测试和部署等。

     在管理员区域点击 New project 按钮,或者点击导航栏中的 选择 New project 选项,进入到新建 project 页面,选择仓库所属的组,输入仓库名称、仓库描述,选择可见级别,即可完成仓库创建。进入仓库主页面:页面左侧部分为仓库操作相关菜单栏,右侧空仓库下显示如何在命令行连接该仓库,非空时显示仓库内容。

    将 git_test 仓库加入到group01 组后,组内的成员即可以看到该仓库,我们使用learn_gitlab用户登录,即可看到该仓库。

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_19

gitlab项目及团队管理 gitlab有项目管理功能吗_git_20

4. push项目

①. 客户端生成公钥

     在 GitLab 创建了仓库,并且授权用户可以使用仓库。使用客户端来连接创建的仓库。仓库是私有的,只有授权的用户才可以访问到该仓库,那么只要将客户端的用户与GitLab 的用户绑定,客户端即可访问到 GitLab 上的仓库,建议使用 SSH 方式实现客户端与 Gitlab 用户的绑定,具体配置如下:
    在客户端生成 ssh 密钥对(注 windows 客户端下只能使用 rsa 加密方式)

[root@m01 tools]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:gwBftc4O7xj0e5IhbEmoQ3/2HXW/+95msVA4X5QUiSQ root@m01

The key's randomart image is:

+---[RSA 2048]----+
| . ... E..oo+|
| o . . .. o.|
| o. . .. |
| . ...+ .o...|
| . o o+.S . .+..|
| o ..B=... . o.|
| . +.o++ . . +|
| ++.o o+|
| . oo =*|
+----[SHA256]-----+

[root@m01 tools]# ll /root/.ssh/id_rsa.pub

-rw-r--r-- 1 root root 390 Jun 21 13:15 /root/.ssh/id_rsa.pub

②. Gitlab配置公钥

     与 GitLab 的 root 用户绑定,复制用户的公钥,在 GitLab 主页面点击用户设置。此处只能添加公钥,如果添加私钥系统将报错,此外一个公钥在整个 GitLab 系统中只能添加一次,但是一个 GitLab 用户可以添加多个公钥。

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_21

gitlab项目及团队管理 gitlab有项目管理功能吗_配置文件_22

③. 添加远程仓库并推送数据

      将GitLab上的git_test仓库配置为m01上git_test仓库的远程仓库,再使用推送的功能进行推送。

[root@m01 git_test]# git remote add gitlab git@10.0.0.61:group01/git_test.git

[root@m01 git_test]# git remote

gitlab

#数据推送

[root@m01 git_test]# git push -u gitlab master

The authenticity of host '10.0.0.61 (10.0.0.61)' can't be established.
ECDSA key fingerprint is SHA256:0BO/nvgtYtJ/lws3jOlG9OkJ8Vw9m0glK5iIl3SjXtk.
ECDSA key fingerprint is MD5:4c:1a:42:4c:76:58:02:47:04:ff:40:8d:e5:26:6b:69.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.61' (ECDSA) to the list of known hosts.
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 299 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To git@10.0.0.61:group01/git_test.git
* [new branch] master -> master
Branch master set up to track remote branch master from gitlab.

推送完后可以在gitlab仓库中看到推上来的内容

gitlab项目及团队管理 gitlab有项目管理功能吗_git_23

5. clone项目&push分支

①. 客户端生成公钥

使用ssh-keygen -t rsa命令生成

[root@web01 ~]# ll /root/.ssh/id_rsa.pub
-rw-r--r-- 1 root root 392 Jun 11 22:57 /root/.ssh/id_rsa.pub

②, GitLab配置公钥

gitlab项目及团队管理 gitlab有项目管理功能吗_gitlab项目及团队管理_24

gitlab项目及团队管理 gitlab有项目管理功能吗_配置文件_25

③. clone项目

使用 git clone 命令克隆仓库到 web01本地

[root@web01 server]# mkdir git_data
[root@web01 server]# cd git_data/
[root@web01 git_data]# ll
total 0
[root@web01 git_data]# git clone git@10.0.0.61:group01/git_test.git
Cloning into 'git_test'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (5/5), done.[root@web01 git_data]# ll
total 0
drwxr-xr-x 3 root root 69 Jun 21 13:36 git_test
[root@web01 git_data]# ll git_test/
total 8
-rw-r--r-- 1 root root 12 Jun 21 13:36 test1.txt
-rw-r--r-- 1 root root  7 Jun 21 13:36 test2.txt
-rw-r--r-- 1 root root  0 Jun 21 13:36 test3.txt[root@web01 git_test]# git remote
origin

 已经将 GitLab 上的 git_test 仓库克隆到了 web01 本地,同时为本地仓库添加了一个指向 GitLab 上 git_test仓库的远程仓库

④. push分支

 web01 的 git_test上创建一个 dev 分支,并将 dev 分支,推送到 GitLab 上

[root@web01 git_test]# git branch dev
[root@web01 git_test]# git branch
  dev
* master
[root@web01 git_test]# git checkout devSwitched to branch 'dev'
[root@web01 git_test]# git status
# On branch dev
nothing to commit, working directory clean[root@web01 git_test]# touch dev.txt
[root@web01 git_test]# git add dev.txt
[root@web01 git_test]# git commit -m "add dev.txt on branch dev"
[dev 5c52ecf] add dev.txt on branch dev
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dev.txt[root@web01 git_test]# git push -u origin dev
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 297 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for dev, visit:
remote:   http://10.0.0.61/group01/git_test/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To git@10.0.0.61:group01/git_test.git
 * [new branch]      dev -> dev
Branch dev set up to track remote branch dev from origin.

完成后可以在gitlab在看到我们推送上来的分支

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_26

6. 分支目录保护

    在实际使用过程中,我们通常会保持 master 分支稳定,用于生产环境的版本发布,只有授权的用户才可以向 master 合并代码。要实现此功能,我们需要将 master设置为保护分支,并授权什么用户可以向 master 用户推送代码.

   使用 root 用户点击 git_test 仓库页面左下角的 Settings,设置完成后,在仓库分支页面,可看到 master 分支后面出现一个绿色的 protected 标记。

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_27

高版本的gitlab默认master受保护

gitlab项目及团队管理 gitlab有项目管理功能吗_gitlab项目及团队管理_28

gitlab项目及团队管理 gitlab有项目管理功能吗_推送_29

六. GitLab数据备份与恢复

1. 数据备份

     备份文件将保存在配置文件中定义的backup_path 中,文件名TIMESTAMP_gitlab_backup.tar,TIMESTAMP 为备份时的时间戳。TIMESTAMP 的格式为:EPOCH_YYYY_MM_DD_Gitlab-version。
默认的备份文件目录为:/var/opt/gitlab/backups,如果自定义备份目录需要赋予目录 git 权限,具体操作如下:

①. 修改配置文件
     在配置文件/etc/gitlab/gitlab.rb 最后处加入
gitlab_rails['backup_path'] = '/data/backup/gitlab'
gitlab_rails['backup_keep_time'] = 604800    #备份保留的时间(以秒为单位, 这个是七天默认值)
②. 对文件夹授权
[root@m01 ~]#  mkdir -p /data/backup/gitlab
[root@m01 ~]#  chown -R git.git /data/backup/gitlab
[root@m01 ~]# gitlab-ctl reconfigure
配置完后,使用 gitlab-ctl reconfigure重新加载配置文件
③. 手动进行第一次备份
使用命令gitlab-rake gitlab:backup:create进行备份
[root@m01 ~]# gitlab-rake gitlab:backup:create
Dumping database ... 
Dumping PostgreSQL database gitlabhq_production ... [DONE]
done
Dumping repositories ...
 * group01/git_test ... [DONE]
[SKIPPED] Wiki
done
Dumping uploads ... 
done
Dumping builds ... 
done
Dumping artifacts ... 
done
Dumping pages ... 
done
Dumping lfs objects ... 
done
Dumping container registry images ... 
[DISABLED]
Creating backup archive: 1592723065_2020_06_21_11.6.10_gitlab_backup.tar ... done
Uploading backup archive to remote storage  ... skipped
Deleting tmp directories ... done
done
done
done
done
done
done
done
Deleting old backups ... done. (0 removed)④. 查看备份结果
[root@m01 ~]# ll /data/backup/gitlab/
total 280
-rw------- 1 git git 286720 Jun 21 15:04 1592723065_2020_06_21_11.6.10_gitlab_backup.tar⑤.  Gitlab定时备份
通过在定时任务里添加:
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
实现定时备份,由于代码是一个企业非常重要的资产,所以我们要重视 GitLab的备份工作。至少做到每天备份一次,平时要注意检查备份的完整性。
环境变量 CRON=1 的作用是如果没有任何错误发生时, 抑制备份脚本的所有进度输出[root@m01 ~]# crontab -e
crontab: installing new crontab
[root@m01 ~]# crontab -l
#crond-id-0001:time sync by test
*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1
#crond-id-0002:backup gitlab data
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1

2. 数据恢复

    GitLab 的恢复只能还原到与备份文件相同的gitlab 版本的系统中,恢复时,停止连接到数据库的进程(也就是停止数据写入服务),但是保持 GitLab 是运行的

①. 停止数据写入服务

[root@m01 ~]# gitlab-ctl stop unicorn
ok: down: unicorn: 0s, normally up
[root@m01 ~]# gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up

②. 执行数据恢复

[root@m01 gitlab]# gitlab-rake gitlab:backup:restore BACKUP=1592723065_2020_06_21_11.6.10
[root@m01 gitlab]# ll
total 280
-rw------- 1 git git 286720 Jun 21 15:04 1592723065_2020_06_21_11.6.10_gitlab_backup.tar
drwx------ 7 git git    131 Jun 21 15:14 tmp
[root@m01 gitlab]# cd /tmp
[root@m01 tmp]# ll
total 0
drwx------ 2 git git 38 Jun 21 15:01 gitaly-ruby540531071③. 重启gitlab
gitlab-ctl restart
④. 查看恢复结果
[root@m01 ~]# ll /data/backup/gitlab/
total 280
-rw------- 1 git git 286720 Jun 21 15:04 1592723065_2020_06_21_11.6.10_gitlab_backup.tar
drwx------ 7 git git    131 Jun 21 15:14 tmp[root@m01 ~]# ll /data/backup/gitlab/tmp/
total 0
drwx------ 2 git git  6 Jun 21 15:14 artifacts.1592723666
drwx------ 2 git git  6 Jun 21 15:14 builds.1592723666
drwx------ 2 git git  6 Jun 21 15:14 lfs.1592723666
drwx------ 2 git git  6 Jun 21 15:14 pages.1592723666
drwx------ 4 git git 26 Jun 21 15:14 uploads.1592723666

3. 注意事项

• 如果需要升级Gitlab版本,备份数据建议从网络导入,以免备份的数据出现不兼容的情况

七、 Gitlab升级

首先,下载新版本的 RPM 包,可以通过官网或者清华镜像站获取。

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el8/gitlab-ce-13.0.6-ce.0.el8.x86_64.rpm
其次关闭部分 gitlab 服务
[root@m01 tools]# gitlab-ctl stop unicorn
ok: down: unicorn: 0s, normally up
[root@m01 tools]# gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up
[root@m01 tools]# gitlab-ctl stop nginx
ok: down: nginx: 1s, normally up
执行升级操作
rpm -Uvh gitlab-ce-13.0.6-ce.0.el8.x86_64.rpm
重新配置 gitlab
gitlab-ctl reconfigure
重启 gitlab 服务
gitlab-ctl restart

注:升级操作不建议进行。如果确实需要,也可以采取在一台新的服务器上安装新版本的 Gitlab,然后采用导入库的方式将旧系统的代码仓库导入到新 Gitlab 上