@[TOC] (gitlab安装部署维护)
git简介
git是分布式版本控制系统,git(/ɡɪt/,音频)是一个分布式版本控制软件,最初由林纳斯·托瓦兹(LinusTorvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。应注意的是,这与GNUInteractiveTools(一个类似NortonCommander界面的文件管理器)有所不同,具休介绍和相关文档可参阅gitlab中文文档(http://www.git-scm.com.cn/)
特点
- 直接记录快照,而非差异比较
- 近乎所有操作都是本地执行
- Git 保证完整性
- Git 一般只添加数据
git的三种状态
- 已提交(committed)
- 已修改(modified)
- 已暂存(staged)
工作目录、暂存区域以及 Git 仓库.
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’’,不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
-
在工作目录中修改文件。
-
暂存文件,将文件的快照放入暂存区域。
-
提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。 在Git 基础一章,你会进一步了解这些状态的细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。
安装部署维护
GitLab简介
- GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务
- Gitlab 是一个基于Git实现的在线代码仓库托管软件,你可以用Gitlab自己搭建一个类似于Github一样的系统平台,一般搭建gitlab私服就是用在公司的内部
- Gitlab 功能就是能够对代码的提交审核和问题跟踪,这个对于软件工程质量的管理是至关重要
- Gitlab分为社区版(CE) 和 企业版(EE) 我感觉大多数的公司还是会选择社区版,反正我们公司是要用社区版的
- 部署Gitlab 是对服务器有配置要求的 建议是CPU两核,内存4G以上
GitLab系统架构和组件介绍
- repository:代码库,可以是硬盘或 NFS 文件系统
- Nginx:Web 入口
- 数据库:包含以下信息:
- repository 中的数据(元数据,issue,合并请求 merge request 等)
- 可以登录 Web 的用户(权限)
- Redis:缓存,负责分发任务
- sidekiq:后台任务,主要负责发送电子邮件。任务需要来自 Redis
- Unicorn:Gitlab 自身的 Web 服务器,包含了 Gitlab 主进程,负责处理快速/一般任务,与 Redis 一起工作。工作内容包括:
- 通过检查存储在 Redis 中的用户会话来检查权限
- 为 Sidekiq 制作任务
- 从仓库(warehouse)取东西或在那里移动东西
- gitlab-shell:用于 SSH 交互,而不是 HTTP。gitlab-shell 通过 Redis 与 Sidekiq 进行通信,并直接或通过 TCP 间接访问 Unicorn
- gitaly:后台服务,专门负责访问磁盘以高效处理 git 操作,并缓存耗时操作。所有的 git 操作都通过 Gitaly 处理
- gitlab-workhorse:反向代理服务器,可以处理与 Rails 无关的请求(磁盘上的CSS、JS 文件等),处理Git Push/Pull 请求,处理到Rails的连接(修改由Rails发送的响应或发送给 Rails 的请求,管理 Rails 的长期 WebSocket 连接等)。
- mail_room:处理邮件请求。回复 GitLab 发出的邮件时,GitLab 会调用此服务
补充: Sidekiq. Unicorn 和 GitLab-shell 是GitLab中处理任务的 3 个程序。
gitlab安装完初始化后的目录结构
- /opt/gitlab //gitlab组件二进制文件存放目录
- /etc/gitlab //配置文件目录
- /etc/gitlab/gitlab.rb //gitlab主配置文件
- /var/opt/gitlab //各组件配置文件所在目录
- /var/opt/gitlab/git-data/repositories //仓库默认存储目录
- /var/log/gitlab //gitlab 各个组件产生的日志
- /var/opt/gitlab/backups //备份文件生成的目录
gitlab下载安装
- 下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-13.5.5-ce.0.el7.x86_64.rpm
- 版本选择:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
[root@jenkins-git opt]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-13.5.5-ce.0.el7.x86_64.rpm
[root@jenkins-git opt]# yum -y install gitlab-ce-13.5.5-ce.0.el7.x86_64.rpm
安装完成后的部分内容显示:
*. *.
*** ***
***** *****
.****** *******
******** ********
,,,,,,,,,***********,,,,,,,,,
,,,,,,,,,,,*********,,,,,,,,,,,
.,,,,,,,,,,,*******,,,,,,,,,,,,
,,,,,,,,,*****,,,,,,,,,.
,,,,,,,****,,,,,,
.,,,***,,,,
,*,.
_______ __ __ __
/ ____(_) /_/ / ____ _/ /_
/ / __/ / __/ / / __ `/ __ \
/ /_/ / / /_/ /___/ /_/ / /_/ /
\____/_/\__/_____/\__,_/_.___/
Thank you for installing GitLab!
修改配置、初始化启动、502问题
- 修改配置
[root@jenkins-git opt]# vim /etc/gitlab/gitlab.rb (ip改成自己对应的本机IP)
external_url ‘http://192.168.10.20’
## 用于配置邮件服务
gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “smtp.163.com”
gitlab_rails[‘smtp_port’] = 25
gitlab_rails[‘smtp_user_name’] = “cbuyXXX@163.com” ##自己的163邮箱账号
gitlab_rails[‘smtp_password’] = “xxxx” ##开通smtp时返回的授权码
gitlab_rails[‘smtp_domain’] = “163.com”
gitlab_rails[‘smtp_authentication’] = “login”
gitlab_rails[‘smtp_enable_starttls_auto’] = true
gitlab_rails[‘smtp_tls’] = false
gitlab_rails[‘gitlab_email_from’] = “cbuyXXX@163.com” ##指定发送邮件的邮箱地址
user[“git_user_email”] = “cbuyXXX@163.com” ##指定接收邮件的邮箱地址 - 初始化启动
[root@jenkins-git opt]# gitlab-ctl reconfigure - 502问题
初始启动后,主页显示502
因8080端口被占用,导致unicorn服务无法启动,从而出现502错误,要更改unicorn端口
[root@jenkins-git opt]# vim /etc/gitlab/gitlab.rb
unicorn[‘port’] = 8181 //原来端口是8080,这里换一个
相关组件服务操作
- 检查gitlab各组件状态:
gitlab-ctl status - 重启gitlab(start/stop/restart):
gitlab-ctl restart - 只重启某个组件:
gitlab-ctl restart nginx - gitlab组件:
alertmanager 负责接收并处理来自Prometheus Server(也可以是其它的客户端程序)的告警信息
gitaly Gitaly是一个Git RPC服务,用于处理GitLab发出的所有git调用
gitlab-exporter
gitlab-workhorse 轻量级的反向代理服务器
grafana 跨平台的开源的度量分析和可视化工具
logrotate 日志文件管理工具
nginx 高性能HTTP和反向代理服务器
node-exporter 监控服务器CPU、内存、磁盘、I/O等信息
postgres-exporter postgresql监控组件
postgresql 开源对象-关系数据库服务器
prometheus 开源监控报警系统和时序列数据库
puma 是用于HTTP 1.1应用程序的多线程ruby服务器
redis 内存高速缓存数据库
redis-exporter 获取redis状态信息
sidekiq 是Ruby中一个非常优秀而且可靠的后台任务处理软件,其依赖 Redis 实现队列任务的增加、重试以及调度等
Gitlab备份和恢复、迁移操作记录
-
修改gitlab配置文件:
[root@jenkins-git opt]# vim /etc/gitlab/gitlab.rb
#指定备份后数据存放的路径、权限、时间配置
gitlab_rails[‘manage_backup_path’] = true #292行 开启备份功能
gitlab_rails[‘backup_path’] = “/opt/gitlab_backup” #293行 指定备份的路径
gitlab_rails[‘backup_archive_permissions’] = 0644 #296行 备份文件的权限
gitlab_rails[‘backup_keep_time’] = 7776000 #301行 备份保留时间(保留90天) -
创建备份目录并授权:
[root@jenkins-git opt]# mkdir /opt/gitlab_backup && chown -R git.git /opt/gitlab_backup/ -
重新生效gitlab配置:
[root@jenkins-git opt]# gitlab-ctl reconfigure -
手动备份:
[root@jenkins-git opt]# gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl stop nginx
[root@jenkins-git opt]# gitlab-rake gitlab:backup:create -
查看备份:
[root@jenkins-git opt]# ll -sh /opt/gitlab_backup/ -
脚本定时备份
编写备份脚本,结合crontab实施自动定时备份,比如每天0点、6点、12点、18点各备份一次
编写备份脚本:
[root@jenkins-git opt]# vim /opt/gitlab_backup/git_back.sh
#!/usr/bin/bash
/usr/bin/gitlab-rake gitlab:backup:create CRON=1
chmod +x /opt/gitlab_backup/git_back.sh
注意:环境变量CRON=1的作用是如果没有任何错误发生时, 抑制备份脚本的所有进度输出
加入定时任务:
[root@jenkins-git opt]# crontab -e
0 0,6,12,18 * * * /bin/bash /opt/gitlab_backup/git_back.sh > /dev/null 2>&1 -
恢复备份
GItlab只能还原到与备份文件相同的gitlab版本。
关闭数据库连接服务:
[root@jenkins-git opt]# gitlab-ctl stop unicorn && gitlab-ctl stop sidekiq && gitlab-ctl stop nginx
Gitlab的恢复操作会先将当前所有的数据清空,然后再根据备份数据进行恢复.
在指定备份文件恢复时,gitlab文件名只贴到数字尾,注意。
[root@jenkins-git opt]# cd /opt/gitlab_backup
[root@jenkins-git opt]# gitlab-rake gitlab:backup:restore BACKUP=1613439490_2021_02_16_13.5.5
Gitlab ssh设置和git日常操作
- 在客户端电脑上执行
[root@jenkins .ssh]# ssh-keygen -t rsa -b 4096 -C “lcf@ald8.cn”
[root@jenkins .ssh]# ls
id_rsa id_rsa.pub
[root@jenkins .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDWye2PALrwas6KiEdj2zq+6PD6mM2TkvunlpgCMSHJa3phjNaJGE2eskQS+dDuXl/nYJjqotN8WHOwz/rGNV5w3E1mQOFV9fHoQNfNq1d1FDejqHbFEKo+w/lQsb/2IT5x0bw0pd+PLNZ3q72sbk4wL0l0mhfA5ciVdx5zEcJJMDtMcqqLFdqtuCkENHZgQCxrByBPifPQzs75NBho1PrM61Ya7QIpO1cf+stvvSFHOf3JigmYwhTJn34jAQiCi9yMP9s+A0dk0NB3WCNKQlQwWqxtQfw0r4DwL9lLuUxUKHZ6F1Q42FkPjAATTYA4tv0Dw1UJa+xFx8v/1r0dkYOp+PEp9Ipm3x7yTHU7Y/gPyUnec7Vao/NbwVpKUzoeEjOBcJ1vjKkd8rSJ4s19LgX+SNQVyIlu6+RuAKDLSWgIY8u/bWEmPnu1cXP+zXWgV40I+SJQltiddHbkcmUU+n8yd3FOo1Q1CiU8yxxpuwU821KYHFt+b/VQiDj3sjFYGNJU0Yj7ENtPD2ysmtzaR918RdawXuE0KwPBoEw7f7O1yqJABJbN07wHKcS9OcpMt5Bfp0Jl+XlW16U/Iqm2QY5e3xWsZoW/nPPySIrh4Zi3EvNftJ6Gtqt1sMqnEaGlxzgVdGkQKjct94VEPGVDMfDiFfK89a/eX5TpC5QCh7Me6Q== lcf@ald8.cn - 然后装id_rsa.pub的内容添加到 gitlab添加ssh密钥
- 在客户端上测试创建项目等操作
-
创建版本库
[root@jenkins mnt]# mkdir mygit
[root@jenkins mnt]# cd mygit/
[root@jenkins mygit]# git init
初始化空的 Git 版本库于 /mnt/mygit/.git/
[root@jenkins mygit]# echo ‘this is test’ > index.html
[root@jenkins mygit]# git add .
[root@jenkins mygit]# git commit -m ‘index.html’
[master(根提交) ce12606] index.html
1 file changed, 1 insertion(+)
create mode 100644 index.html -
添加到远程库
[root@jenkins mygit]# git remote add origin git@192.168.10.20:lcf/mygit.git
[root@jenkins mygit]# git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote:
remote: The private project lcf/mygit was successfully created.
remote:
remote: To configure the remote, run:
remote: git remote add origin git@192.168.10.20:lcf/mygit.git
remote:
remote: To view the project, visit:
remote: http://192.168.10.30/lcf/mygit
remote:
remote:
remote:
To git@192.168.10.20:lcf/mygit.git
* [new branch] master -> master -
克隆版本
[root@jenkins mnt]# git clone git@192.168.10.20:lcf/mygit.git
正克隆到 ‘mygit’…
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (3/3), done.
-