一. 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
[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-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 按钮完成配置。退回到系统的登录页面,发现已经没有用户注册功能。
①. 以管理员登录
②. 修改系统设置
注意:不勾选的是Sign-up Restrictions,而不是Sign-in Restrictions,否者会无法登录
③. 最终结果
2. 自定义专属首页
①. 修改系统设置
②. 最终结果
3. 创建用户、用户组和项目
GitLab 是通过组(group)的概念来统一管理仓库(project)和用户(user),通过创建组,在组下再创建仓库,再将用户加入到组,从而实现用户与仓库的权限管理。
①. 创建用户组
在管理员页面点击页面顶部的 Admin area 按钮,进入管理员区域,在页面右侧点击绿色的 New group 按钮,进入创建组页面。在创建组页面中,组路径和组名称为必填项,而且此两处内容好一致:
注:visibility Level:选择谁可以访问该组:我们默认选择 private 即可
Private:只有授权的用户才可以看到
Internal:只要是登录 gitlab 的用户就可以看到
Public:只要可以访问 gitlab web 页面的人就可以看到
点击页面下的 create group 按钮,完成组的创建,进入组管理页面
②. 创建新用户
在管理员页面点击页面顶部的 Admin area 按钮,进入管理员区域,在页面右侧点击绿色的 New user 按钮,进入创建用户页面:在创建用户页面,输入用户名昵称、用户名、电子邮件、选择用户级别。点击页面下部的 create user 按钮,完成用户创建,进入用户管理页面,点击页面右上页的 Edit 按钮,为用户设置初始密码,在此页面也可同时修改用户注册信息。
③. 添加用户到组
用户创建完成后,需要对用户进行授权,从而使用户可以管理仓库,有两种方式,一是将用户加入到组,这样用户可以管理组内的仓库,二是直接授权用户管理仓库。通常我们采用的方式是将用户加入相应的组,并赋予不同的角色。GitLab 中用户的角色是系统定义好的,不能更改。
注:关于每一种角色对应的权限,可参见官方文档相关内容:https://docs.gitlab.com/ee/user/permissions.html
下面我们将刚创建的 learn_gitlab 用户添加到我们的 group01 组,将赋予 guest权限,在管理员区域,点击 oldboy 组,进入组管理页面:选择我们刚创建的 learn_gitlab 用户,选择 guest 角色,然后添加到组。
④. 创建项目
在 GitLab 中,可以创建 project 用来存储你的程序代码、作为一个问题跟踪器、用于代码协作、用于持续集成中的构建、测试和部署等。
在管理员区域点击 New project 按钮,或者点击导航栏中的 选择 New project 选项,进入到新建 project 页面,选择仓库所属的组,输入仓库名称、仓库描述,选择可见级别,即可完成仓库创建。进入仓库主页面:页面左侧部分为仓库操作相关菜单栏,右侧空仓库下显示如何在命令行连接该仓库,非空时显示仓库内容。
将 git_test 仓库加入到group01 组后,组内的成员即可以看到该仓库,我们使用learn_gitlab用户登录,即可看到该仓库。
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上的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仓库中看到推上来的内容
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配置公钥
③. 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 dev
Switched 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在看到我们推送上来的分支
6. 分支目录保护
在实际使用过程中,我们通常会保持 master 分支稳定,用于生产环境的版本发布,只有授权的用户才可以向 master 合并代码。要实现此功能,我们需要将 master设置为保护分支,并授权什么用户可以向 master 用户推送代码.
使用 root 用户点击 git_test 仓库页面左下角的 Settings,设置完成后,在仓库分支页面,可看到 master 分支后面出现一个绿色的 protected 标记。
高版本的gitlab默认master受保护
六. 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 上