GitLab 部署
GitLab概述
众所周知,提供Git项目仓库托管服务的是业界有名的GitHub,但是你要将代码上传到GitHub里,而且要将项目设置为私有那就得收费。而GitLab就是为了提供免费的项目仓库托管服务而诞生(社区版免费,企业版需要订阅)。
GitLab是利用Ruby on Rails
语言编写的 一个开源的版本管理系统
,后来一部分用Go语言重写,它能实现一个自托管的Git项目仓库
,可通过Web界面
进行访问公开
的或者私人
项目。与 Github 类似,GitLab 能够浏览源代码,管理缺陷和注释。
可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊 天程序(Wall)进行交流。 它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查 找。
官网:https://about.gitlab.com/
国内镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
GitLab安装
GitLab提供了两种方式安装:
- 使用官方打包好的rpm包,该方式简单快捷,也不容易出问题
- 手动安装,把代码下载下来,然后安装各种环境,例如:数据库、nginx、编译环境等,一步一步安装起来就很麻烦也费时间,还容易出问题
环境规划
主机名 | IP地址 | 说明 |
---|---|---|
git01-21 | 10.4.7.21 | Gitlab |
git02-22 | 10.4.7.22 | Git客户端 |
操作系统:centos7.4
内存:实验环境至少 2G,生产建议 4G 以上
磁盘:至少 50G,根据生产实际仓库大小进行配置
安全:关闭防火墙、selinux
1.安装GitLab依赖包
[root@git01-21 ~]# yum install -y curl policycoreutils openssh-server \
openssh-clients policycoreutils-python
特别是:如果不安装依赖包的话,在使用rpm安装github会报错
2.获取Gitlab安装包并安装
//1.通过wget下载gitlab rpm安装包
[root@git01-21 ~]# mkdir /opt/src && cd /opt/src
[root@Git src]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm
//2.下载完成后,使用rpm安装
[root@Git src]# rpm -ivh gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm
3.配置GitLab
Gitlab的默认配置文件路径为:/etc/gitlab/gitlab.rb
[root@git01-21 ~]# vim /etc/gitlab/gitlab.rb
# 对外公开访问地址(IP/域名)
external_url 'http://10.4.7.21'
# 数据目录
git_data_dirs({
"default" => {
"path" => "/data/gitlab/data"
}
})
创建数据目录
[root@git01-21 ~]# mkdir -p /data/gitlab/data
4.重新配置gitlab
// 修改完主配置文件后,使用 gitlab-ctl reconfigure 重新配置 gitlab
[root@git01-21 ~]# gitlab-ctl reconfigure
需等待数分钟才能完成
GitLab 主要目录:
/data/gitlab/data/repositories # 仓库存储目录
/opt/gitlab # GitLab应用代码和相应的依赖程序
/var/opt/gitlab # gitlab-ctl reconfigure 命令编译后的应用数据和配置文件,不需要人为修改配置
/etc/gitlab # 配置文件目录
/var/log/gitlab # 此目录下存放了GitLab各个组件产生的日志
/var/opt/gitlab/backups/ # 备份文件生成的目录
每次修改了GitLab的主配置文件,都需要执行gitlab-ctl reconfigure
5.启动GitLab
// 重新配置执行成功后,就可以启动 Gitlab,
[root@git01-21 ~]# gitlab-ctl start
ok: run: gitaly: (pid 2919) 189s
ok: run: gitlab-monitor: (pid 2935) 189s
ok: run: gitlab-workhorse: (pid 2905) 190s
ok: run: logrotate: (pid 2611) 221s
ok: run: nginx: (pid 2591) 227s
ok: run: node-exporter: (pid 2756) 213s
ok: run: postgres-exporter: (pid 2966) 188s
ok: run: postgresql: (pid 2355) 268s
ok: run: prometheus: (pid 2952) 188s
ok: run: redis: (pid 2295) 274s
ok: run: redis-exporter: (pid 2788) 209s
ok: run: sidekiq: (pid 2558) 235s
ok: run: unicorn: (pid 2520) 237s
// 查看各组件状态
[root@git01-21 ~]# gitlab-ctl status
GitLab 由主要由以下服务构成,他们共同承担了 Gitlab 的运作需要:
- Nginx:静态web服务器。
- gitlab-shell:用于处理Git命令和修改
- authorized keys 列表。
- gitlab-workhorse: 轻量级的反向代理服务器。
- logrotate:日志文件管理工具。
- postgresql:数据库。
- redis:缓存数据库。
- sidekiq:用于在后台执行队列任务(异步执行)。
- unicorn:An HTTP server for Rack applications,GitLab Rails 应用是托管在这个服务器上面的。
- prometheus:监控软件
- redis-exporter:redis监控
- node-exporter:节点系统监控
- postgres-exporter:postgres 数据库监控
6.GitLab 常用命令
启动所有 gitlab 组件: gitlab-ctl start
停止所有 gitlab 组件: gitlab-ctl stop
停止 postgresql 组件: gitlab-ctl stop postgresql
停止相关数据连接服务 gitlab-ctl stop unicorn gitlab-ctl stop sidekiq
重启所有 gitlab 组件: gitlab-ctl restart
重启 gitlab-workhorse 组件: gitlab-ctl restart gitlab-workhorse
查看服务状态 gitlab-ctl status
查看日志 sudo gitlab-ctl tail
检查 redis 的日志 sudo gitlab-ctl tail redis
GitLab访问
1.浏览器输入:http://10.4.7.21,访问GitLab的web界面
2.首次登陆需要我们设置root用户密码(长度要求8位以上)
3.重新设置用户的密码后,即可使用root用户及刚刚设置的密码登录GitLab
4.登录后的页面如下,至此完成了GitLab的安装
GitLab关闭用户注册
我们Gitlab系统是企业内部私有代码仓库,所有用户
都是由管理员创建
,并不需要注册功能
,因此我们需要关闭此功能。
1.使用root
登录GitLab
,点击页面最上方的Admin area
2.进入管理员区域页面
,点击页面左侧菜单栏最下方的Settings
3.进入Settings
页面后,下拉页面找到Sign-up Restrictions
选项
4.取消Sign-up enabled
选项前面的勾选后,下拉到页面的最下方,点击Save
按钮完成配置。退回到系统的登录页面,发现已经没有用户注册功能。
GitLab仓库管理
GitLab 是通过组(group)的概念来统一管理仓库(project)和用户(user),通过创建组,在组下再创建仓库,再将用户加入到组,从而实现用户与仓库的权限管理。
创建组
1.在管理员页面点击页面顶部的Admin area
按钮,进入管理员区域
2.在页面右侧点击绿色的New group
按钮,进入创建组页面
3.在创建组页面中,组路径和组名称为必填项,而且此两处内容最好一致
组可见级别:
1、visibility Level:选择谁可以访问该组:我们默认选择 private 即可,
2、Private:只有授权的用户才可以看到
3、Internal:只要是登录 gitlab 的用户就可以看到
4、Public:只要可以访问 gitlab web 页面的人就可以看到
4.点击页面最下的create group
按钮,完成组的创建,进入组管理页面
在此页面我们可为组添加用户。
创建用户
1.在管理员页面点击页面顶部的Admin area
按钮,进入管理员区域
2.在页面右侧点击绿色的New user
按钮,进入创建用户页面
3.在创建用户页面,输入用户名昵称、用户名、电子邮件、选择用户级别
个性化设置(这里就保留为空了):
4.点击页面最下部的create user
按钮,完成用户创建,进入用户管理页面,点击页面右上页的 Edit 按钮,为用户设置初始密码
5.在Password选项中,填写设置用户的密码,点击页面最下的Save changes
按钮,完成密码设置
在此页面也可同时修改用户注册信息。
用户授权
用户创建完成后,我们就需要对用户进行授权,从而使用户可以管理仓库,有两种方式,
- 方法一:将用户加入到组,这样用户可以管理组内的仓库,
- 方法二:直接授权用户管理仓库。
通常我们采用的方式方法二
将用户加入相应的组
,并赋予不同的角色。 GitLab 中用户的角色是系统定义好的,不能更改。这一点可能不符合我们正常的思维习惯。下面我们将刚创建的Jason
用户添加到我们的development
组,将赋予developer权限。
1.在管理员页面点击页面顶部的Admin area
按钮,进入管理员区域
2.点击用户组下面的development
组,进入组管理界面
3.选择我们刚创建的Jason
用户,选择developer角色
,然后添加到组
注:关于每一种角色对应的权限,可参见官方文档相关内容:
https://docs.gitlab.com/ee/user/permissions.html
GitLab创建仓库
在GitLab中,你可以创建仓库用来存储你的程序代码、作为一个问题跟踪器、用 于代码协作、用于持续集成中的构建、测试和部署等。
1.在管理员区域点击New project
按钮,或者点击导航栏中的项
2.进入到新建 project 页面
3.默认创建的是空仓库,需要执行一些命令初始化仓库
4.我们将sky-demo仓库
加入到development组
后,组内的成员即可以看到该仓库,我们使用 Jason
用户登录,即可看到该仓库。
配置SSH KEY
前面已经在GitLab创建了仓库,并且授权用户可以使用仓库,所有的操作都是在 WEB 页面进行,下在介绍如何使用客户端来连接的GitLab仓库。
我的development
组的sky-demo
仓库是私有的,只有授权的用户才可以访问到该仓库,那么只要将客户端的用户与我们 GitLab的用户绑定,客户端即可访问到 GitLab上的仓库,建议使用SSH方式实现客户端与 Gitlab 用户的绑定。
now,现在要实现git02-22
这个客户端能够从development
组的sky-demo
仓库拉取或者提交代码,具体配置如下:
1.在git02-22
客户端生成 ssh 密钥对(windows客户端下只能使用rsa加密方式)
// 客户端生成基于rsa加密方式的密钥
[root@git02-22 ~]# ssh-keygen -t rsa
// 客户端已经生成了公钥和私钥
[root@git02-22 ~]# ll ~/.ssh/
total 8
-rw------- 1 root root 1766 Mar 7 22:59 id_rsa
-rw-r--r-- 1 root root 395 Mar 7 22:59 id_rsa.pub
2.将git02-22
客户端与GitLab的Jason
用户绑定,复制git02-22
客户端的公钥,在GitLab主页面点击用户设置
3.进入到用户设置页面,点击左侧菜单栏的SSH Keys
4.进入到SSH Keys
管理页面
此处只能添加公钥
,如果添加私钥系统将报错,此外一个公钥
在整个GitLab系统中只能添加一次,但是一个GitLab用户可以添加多个公钥
。
设置分支保护
在实际使用过程中,我们通常会保持master
分支稳定,用于生产环境的版本发布,只有授权的用户才可以向master
合并代码。要实现此功能,我们需要将master
设置为保护分支,并授权什么用户可以向master
用户推送代码。
我们的Jason
用户下面有个sky-demo
仓库,但是它是普通用户,而我又把git02-22
的key添加到Jason
用户,就会导致一个问题,GitLab上默认不允许普通用户提交代码到仓库的Master分支,所以我们需要通过分支保护功能
给Jason
用户授权,给予能提交代码到仓库的Master分支
1.在设置分支保护之前,我们必须要手动初始化一下sky-demo
仓库,添加一个文件。
如果仓库为空,则无法设置分支受保护
2.新增文件名README.md
,最后提交文件
3.在GitLab上设置分支保护,使用 root 用户点击demo仓库页面左下角的Settings
4.进入设置页面,选择设置菜单栏下面的Repository
选项
5.进入repository
设置页面
6.展开Protected Branches
仓库操作
我们刚才在Json用户
添加了git02-22
的公钥,那么git02-22
就能访问Json用户
用户所属组下的所有仓库,我们也创建了一个名为:sky-demo的仓库,让我们拉取该仓库并创建文件在推送到仓库吧
1.创建/data/git_repo目录,在该目录下拉取仓库,创建文件并提交到master分支
[root@git02-22 ~]# mkdir -p /data/git_repo && cd /data/git_repo
[root@git02-22 git_repo]# git clone git@10.4.7.21:development/sky-demo.git
[root@git02-22 git_repo]# cd sky-demo
[root@git02-22 sky-demo]# git config --global user.email "jasondev@163.com"
[root@git02-22 sky-demo]# git config --global user.name "xmh"
[root@git02-22 sky-demo]# echo "123" >index.html
[root@git02-22 sky-demo]# git add .
[root@git02-22 sky-demo]# git commit -m "first"
// 将代码提交到master分支
[root@git02-22 sky-demo]# git push -u origin master
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 268 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@10.4.7.21:development/sky-demo.git
743b351..c5c4f70 master -> master
Branch master set up to track remote branch master from origin.
2.登录到GitHub界面的sky-demo
仓库,可以看到刚才提交的代码
GitLab恢复/备份/升级
对gitlab
进行备份
将会创建一个包含所有库和附件的归档文件。对备份的恢复只能恢复到与备份时的gitlab
相同的版本。将gitlab
迁移到另一台服务器上的最佳方法就是通过备份和还原
。gitlab
提供了一个简单的命令行来备份整个 gitlab,并且能灵活的满足需求。
备份GitLab
GitLab备份文件将保存在配置文件中定义的backup_path
中 , 文件名为TIMESTAMP_gitlab_backup.tar
,TIMESTAMP
为备份时的时间戳。 TIMESTAMP的格式为: EPOCH_YYYY_MM_DD_Gitlab-version
。
1.自动备份
默认的存放备份文件目录为:/var/opt/gitlab/backups/
,如果自定义备份目录需要赋予目录 git权限,具体操作如下:
// 1.创建存放备份文件的目录,并授权git
[root@git01-21 ~]# mkdir /data/backup/gitlab -p
[root@git01-21 ~]# chown -R git.git /data/backup/gitlab
// 2.GitLan配置文件中加入
[root@git01-21 ~]# vim /etc/gitlab/gitlab.rb
gitlab_rails['backup_path'] = '/data/backup/gitlab' # 存放备份文件的路径
gitlab_rails['backup_keep_time'] = 604800 # 备份保留的时间(以秒为单位,这个是七天默认值)
// 3.重载gitlab配置
[root@git01-21 ~]# gitlab-ctl reconfigure
2.手动备份
1.命令行方式为GitLab仓库生成一次备份
备份文件会放到配置文件中指定的备份目录
/data/backup/gitlab
[root@git01-21 ~]# gitlab-rake gitlab:backup:create
// 在指定的目录中生成了对应的备份文件
[root@git01-21 ~]# ll /data/backup/gitlab
total 72
-rw------- 1 git git 71680 Mar 8 00:06 1583597167_2020_03_08_10.2.2_gitlab_backup.tar
2.添加到定时备份
通过在定时任务里添加来实现定时备份,由于代码是一个企业非常重要的资产,所以我们要重视 GitLab的备份工作。至少做到每天备份一次,平时要注意检查备份的完整性。 环境变量 CRON=1的作用是如果没有任何错误发生时,抑制备份脚本的所有进度输出
[root@git01-21 ~]# crontab -e
# Git lab backup
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
恢复GitLab
GitLab的恢复只能还原到与备份文件相同的gitlab版本的系统中,恢复时,停止连接到数据库的进程(也就是停止数据写入服务),但是保持 GitLab 是运行的。
// 1.关闭连接数据库进程
[root@git01-21 ~]# gitlab-ctl stop unicorn
ok: down: unicorn: 1s, normally up
[root@git01-21 ~]# gitlab-ctl stop sideki
// 2.接来下,进行恢复操作
[root@git01-21 ~]# cd /data/backup/gitlab/
[root@git01-21 ~]# gitlab-rake gitlab:backup:restore BACKUP=1583597167_2020_03_08_10.2.2
整个恢复执行过程中,我们可以看到基本是在删除表,创建表。
升级GitLab
1.首先,下载新版本的 RPM 包,可以通过官网或者清华镜像站获取。
2.其次关闭部分 gitlab 服务
$ gitlab-ctl stop unicorn
$ gitlab-ctl stop sidekiq
$ gitlab-ctl stop nginx
3.执行升级操作
$ rpm gitlab-ce-10.2.1-ce.0.el7.x86_64.rpm
4.重新配置 gitlab 重启 gitlab 服务
$ gitlab-ctl reconfigure
$ gitlab-ctl restart
注:升级操作不建议进行。如果确实需要,也可以采取在一台新的服务器上安装新版本 的 Gitlab,然后采用导入库的方式将旧系统的代码仓库导入到新 Gitlab 上。