Gitlab仓库管理系统-高可用部署
1、Gitlab介绍
GitLab是一个流行的版本控制系统平台,主要用于代码托管、测试和部署。
GitLab是基于Git的一个开源项目,它提供了一个用于仓库管理的Web服务。GitLab使用Ruby on Rails构建,并提供了诸如wiki和issue跟踪等功能。它允许用户通过Web界面访问公开或私有的项目,并能够管理团队对仓库的访问权限。此外,GitLab还支持持续集成(CI)和持续部署(CD),使其成为软件开发过程中的重要工具。
GitLab的主要特点包括:
- 版本控制:作为一个基于Git的平台,GitLab提供了强大的版本控制功能,允许用户创建分支、合并代码以及处理冲突。
- 代码审查:GitLab支持代码审查流程,团队成员可以对提交的代码进行评论和讨论。
- 项目管理:通过Issue和Merge Request等特性,GitLab帮助团队跟踪进度和管理任务。
- 持续集成/持续部署:GitLab CI/CD是其核心功能之一,支持自动化的构建、测试和部署流程。
- 自托管与云服务:GitLab可以自行在本地服务器上部署,也可以使用GitLab提供的云服务。
- 内置工具:GitLab提供了一系列的内置工具,如容器扫描、安全性报告、性能分析等,以增强开发流程的安全性和效率。
- 社区版和企业版:GitLab提供社区版(CE)和企业版(EE),社区版免费开放,而企业版提供了更多的高级功能。
2、GitLab与Git的关系,以及GitHub的区别和联系
GitLab是在Git的基础上搭建起来的,与GitHub有着相似的功能但也存在一些差异。
首先,Git是一个分布式版本控制系统,而GitLab和GitHub都是基于这个系统建立起来的平台。
GitLab的主要优点在于它的开源特性,允许用户在私有服务器上运行,这对于企业内部网络构建私有仓库非常有用。而GitHub虽然提供了类似的服务,但其核心是面向开源项目的托管平台,对于私有仓库则有一定的收费政策。
其次,GitLab提供了免费的无限私有存储库,适合企业、学校等内部网络搭建git私服。相比之下,GitHub的私有仓库需要付费。此外,GitLab还提供了企业版(GitLab EE),它包含了更高级的功能,如访问控制、安全性以及合规性等。
最后,GitHub因其较早成立,拥有更广泛的用户基础和社区支持。这使得GitHub在全球开发者中的知名度和使用率都较高。而GitLab虽然相对较新,但由于其开源和免费的特性,也逐渐获得了市场的认可。
3、搭建Gitlab
3.1、下载gitlab-ce的rpm软件包
wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ee/packages/el/7/gitlab-ee-16.10.0-ee.0.el7.x86_64.rpm
3.2、rpm安装gitlab
rpm -ivh gitlab-ee-16.10.0-ee.0.el7.x86_64.rpm
安装完成后截图如下:
3.3、创建gitlab存储目录
创建gitlab数据存储目录 mkdir -p /nfs/gitlab/gitdata 创建gitlab备份存储目录 mkdir -p /nfs/gitlab/backups
3.3、修改gitlab配置文件
vi /etc/gitlab/gitlab.rb
修改访问地址 external_url 'http://10.1.16.173' 修改GitLab服务器时区 gitlab_rails[‘time_zone’] = 'Asia/Shanghai' 修改数据存储目录 git_data_dirs({ "default" => { "path" => "/nfs/gitlab/gitdata" } }) 设置邮箱服务 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "emailsmtp02.mindray.com" gitlab_rails['smtp_port'] = 25 # gitlab_rails['smtp_user_name'] = "smtp user" # gitlab_rails['smtp_password'] = "smtp password" gitlab_rails['smtp_domain'] = "mindray.com" # gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = false gitlab_rails['smtp_pool'] = false gitlab_rails['smtp_openssl_verify_mode'] = 'none' 修改日志存放路径 gitlab_rails['log_directory'] = "/nfs/gitlab/log"
停止当前gitlab,重新加载配置
gitlab-ctl stop gitlab-ctl reconfigure gitlab-ctl start
重新加载后,会发现在/nfs/gitlab/gitdata目录下多出一个repositories目录
最后启动gitlab即可
gitlab-ctl restart
访问web系统
http://10.1.16.173
此时应该看到的是 GitLab 登录界面。在 GitLab 第一次初始化时,会自动生成一个管理员账户。其中,该账户的用户名为 root,密码在一个自动生成的文件 /etc/gitlab/initial_root_password 中(密码不会含空格),且会在 24 小时后自动被删除。
现在要做的是,先备份上述的文件 initial_root_password,然后登录管理员账户修改管理员密码。新密码长度不能小于 8 位。
[root@hqiotnfs01l ~]# cat /etc/gitlab/initial_root_password # WARNING: This value is valid only in the following conditions # 1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run). # 2. Password hasn't been changed manually, either via UI or via command line. # # If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password. Password: kCsRV6ijYc3X2RceyfdhZEB5E7OqXBjESLpQrCrpY/0=
修改密码
root
XXXXXXXX
3.4、gitlab相关命令
#启动服务 gitlab-ctl start #停止服务 gitlab-ctl stop #重启服务 gitlab-ctl restart #状态 gitlab-ctl status #监控 gitlab-ctl tailunicorn 监控unicorn日志 gitlab-ctl tail 查看Gitlab 安装包 rpm –qa | grep gitlab 删除gitlab rpm –e gitlab-ce 查看gitlab 进程 ps aux | grep gitlab 杀掉所有gitlab 进程 Kill –9 进程号 删除所有包含gitlab文件 find / -name | grep gitlab rm -rf
4、Gitlab管理员常用配置
gitlab设置中文
点击头像——偏好设置——本地化
选择 Chinese, Simplified - 简体中文
gitlab帐户和限制
管理中心——设置——通用——账户和限制
# 取消访问外网
取消勾选 启用 Gravatar
# 禁止用户创建群组和项目
默认项目限制,修改数字为 0
用户限制,全部取消勾选
gitlab取消注册功能
管理中心——设置——通用——注册限制
gitlab设置默认分支为master
管理中心——设置——仓库——默认分支
gitlab管理员创建群组及子群组
点击主页——群组——新建群组或者新建子群组
gitlab管理员授予群组用户权限
管理中心——群组——点击某一个群组——点击管理权限——添加用户——授予用户最大角色
5、Gitlab维护者配置
gitlab创建个人令牌
点击头像——偏好设置——访问令牌
选择群组,创建一个空项目
获取项目地址
VSCode关联项目地址,上传项目代码。
项目本地目录
我们在VSCode可以进行源代码的相关管理
在gitlab可以对源代码进行管理
6、Gitlab源代码迁移
在这里讲述一下,从Git仓库迁移到全新的gitlab平台的一个过程
# 旧项目,本地目录
E:\Git\C01.IOT.MANAGE.WEB
# 新项目,gitlab地址
http://10.1.16.173/pub/test.git
注意:新项目,一定是一个空白项目,并且不包含自述文件README.md
# 打开git bash命令行交互窗口
操作步骤如下:
克隆老项目的镜像(old.git为老项目的git地址)
git clone --mirror old.git
进入目录项
cd old.git
将老项目的地址替换成新项目(new.git为新项目的git地址)
git remote set-url --push origin new.git
将镜像推到远程
git push --mirror new.git
最后去gitlab上查看新项目的提交数据是否已更新
目前这个仓库的迁移是最方便简单的,有需要的同学可以试试!
可以看到旧代码已经全部迁移过来,包含所有分支,以及签入日志。
7、Gitlab远程定时备份与恢复
代码是公司的核心资产,如果只是单机运行,或者单机备份,一旦出现磁盘损坏,数据无法取出,将会是一次重大生产事故。在此,我们一定要做好gitlab的远程备份与恢复验证。
7.1、环境准备
# gitlab运行环境 10.1.16.173
# gitlab备份环境 10.1.16.174
7.2、本地备份
vi /etc/gitlab/gitlab.rb
### Backup Settings gitlab_rails['manage_backup_path'] = true # 开启备份 gitlab_rails['backup_path'] = "/nfs/gitlab/backups" # 备份目录 gitlab_rails['backup_archive_permissions'] = 0644 # 生成的备份文件权限 gitlab_rails['backup_keep_time'] = 604800 # 默认备份保留天数为7天
更改完成后重载配置文件 gitlab-ctl reconfigure 手动备份gitlab gitlab-rake gitlab:backup:create
查看备份目录:
这样我们完成了gitlab的本地备份。
7.3、定时备份
我们通过crontab完成定时备份与文件迁移
# 运行环境 10.1.16.173
创建备份脚本
vi /nfs/gitlab/gitlab_backup.sh
#!/bin/bash # gitlab 服务器备份路径 LocalBackDir=/nfs/gitlab/backups #修改配置文件后,自定义的备份路径 # 远程备份服务器 gitlab备份文件存放路径 RemoteBackDir=/nfs/gitlab/backups # 远程备份服务器 登录账户 RemoteUser=root # 远程备份服务器 IP地址 RemoteIP=10.1.16.174 #当前系统日期 DATE=`date +"%Y-%m-%d"` #Log存放路径 LogFile=/nfs/gitlab/log/$DATE.log #执行备份 gitlab-rake gitlab:backup:create # 查找 gitlab本地备份目录下 时间为60分钟之内的,并且后缀为.tar的gitlab备份文件 BACKUPFILE_SEND_TO_REMOTE=$(find $LocalBackDir -type f -mmin -60 -name '*.tar*') #新建日志文件 touch $LogFile #追加日志到日志文件 echo "Gitlab auto backup to remote server, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile echo "---------------------------------------------------------------------------" >> $LogFile # 输出日志,打印出每次scp的文件名 echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile #备份到远程服务器 scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP:$RemoteBackDir #追加日志到日志文件 echo "---------------------------------------------------------------------------" >> $LogFile #删除备份服务器上旧的备份文件 ssh $RemoteUser@$RemoteIP "/nfs/gitlab/gitlab_backup_remove.sh"
修改脚本权限
chmod 777 /nfs/gitlab/gitlab_backup.sh
# 备份环境 10.1.16.174
创建定时删除脚本
vi /nfs/gitlab/gitlab_backup_remove.sh
#!/bin/bash # 远程备份服务器 gitlab备份文件存放路径 GitlabBackDir=/nfs/gitlab/backups echo '查找远程备份路径下,超过3天且文件后缀为.tar 的 Gitlab备份文件 然后删除' find $GitlabBackDir -type f -mtime +3 -name '*.tar*' -exec rm {} \;
修改脚本权限
chmod 777 /nfs/gitlab/gitlab_backup.sh
# 运行环境 10.1.16.173
添加定时任务
crontab -e
每天23时执行脚本
0 23 * * * /nfs/gitlab/gitlab_backup.sh
查看任务计划
crontab -l
这样,我们就可以在远程备份服务器,看到每天晚上23点执行的备份文件。
7.4、数据恢复
# 停止Gitlab服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
ok: down: sidekiq: 12s, normally up
# 开始恢复数据
gitlab-rake gitlab:backup:restore BACKUP=/nfs/gitlab/backups/1711897288_2024_03_31_16.10.0-ee
注意!!!! 指定备份文件时得把 _gitlab_backup.tar去掉 才可以正常恢复,否则会报错说找不到文件
# 启动Gitlab服务
gitlab-ctl start unicorn
gitlab-ctl start sidekiq
ok: run: sidekiq: (pid 83582) 0s