Gitlab部署及维护
一、GitLab简介
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务
二、Git、GitLab、GitHub的区别
git -- 是一种基于命令的版本控制系统
gitlab -- 是一个基于git实现的在线代码仓库软件,提供web可视化管理界面,通常用于企业团队内部协作开发
github -- 是一个基于git实现的在线代码托管仓库,提供web可视化管理界面。同时提供免费账户和付费账户,提供私有仓库和公共仓库。大部分开源项目都选择GitHub作为代码托管仓库
三、GitLab系统架构
git用户的主目录通常是/home/git(~git表示主目录路径),GitLab主要以/home/git用户身份安装在用户主目录中git。在主目录中是gitlabhq服务器软件所在的位置以及存储库(尽管存储库位置是可配置的)。裸存储库位于/home/git/repositories。GitLab是一个ruby on rails应用程序,因此可以通过研究ruby on rails应用程序的工作原理来学习内部工作的细节。为了通过SSH提供存储库,有一个名为gitlab-shell的附加应用程序,它安装在/home/git/gitlab-shell。
GitLab 应用程序是下面所述的所有组件的集合:
1. repository:代码库,可以是硬盘或 NFS 文件系统
2. Nginx:Web 入口
3. 数据库:包含以下信息:
- repository 中的数据(元数据,issue,合并请求 merge request 等)
- 可以登录 Web 的用户(权限)
4. Redis:缓存,负责分发任务
5. sidekiq:后台任务,主要负责发送电子邮件。任务需要来自 Redis
6. Unicorn:Gitlab 自身的 Web 服务器,包含了 Gitlab 主进程,负责处理快速/一般任务,与 Redis 一起工作。工作内容包括:
- 通过检查存储在 Redis 中的用户会话来检查权限
- 为 Sidekiq 制作任务
- 从仓库(warehouse)取东西或在那里移动东西
7. gitlab-shell:用于 SSH 交互,而不是 HTTP。gitlab-shell 通过 Redis 与 Sidekiq 进行通信,并直接或通过 TCP 间接访问 Unicorn
8. gitaly:后台服务,专门负责访问磁盘以高效处理 git 操作,并缓存耗时操作。所有的 git 操作都通过 Gitaly 处理
9. gitlab-workhorse:反向代理服务器,可以处理与 Rails 无关的请求(磁盘上的CSS、JS 文件等),处理Git Push/Pull 请求,处理到Rails的连接(修改由Rails发送的响应或发送给 Rails 的请求,管理 Rails 的长期 WebSocket 连接等)。
10. mail_room:处理邮件请求。回复 GitLab 发出的邮件时,GitLab 会调用此服务
Sidekiq. Unicorn 和 GitLab-shell 是GitLab中处理任务的 3 个程序。
三、Gitlab安装、配置、启动管理
1、查看系统版本信息
# 查看Linux系统的版本信息 [root@centos8-3 ~]# cat /proc/version Linux version 4.18.0-492.el8.x86_64 (mockbuild@x86-05.stream.rdu2.redhat.com) (gcc version 8.5.0 20210514 (Red Hat 8.5.0-19) (GCC)) #1 SMP Tue May 9 17:56:55 UTC 2023 # 查看Linux系统发行版信息 [root@centos8-3 ~]# cat /etc/redhat-release CentOS Stream release 8
2、安装依赖包
#安装依赖包 [root@centos8-3 ~]# yum install -y policycoreutils openssh-server openssh-clients postfix #启动服务并设为开机自启 systemctl enable sshd systemctl start sshd systemctl enable postfix systemctl start postfix
3、安装gitlab
1.下载GitLab源 curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash 2.安装GitLab yum install -y gitlab-ce
4、简单配置GitLab
1.修改GitLab配置文件
安装后的gitlab默认路径是/opt/gitlab(程序路径)、 /etc/gitlab/gitlab.rb(配置文件路径)。
#配置主机IP、端口 cat /etc/gitlab/gitlab.rb external_url 'http://192.168.200.53' 不加端口默认是80 #重载配置生效 gitlab-ctl reconfigure 上面配置命令执行后,如没有报错,就说明gitlab配置成功。配置后会生成各应用服务配置文件,放在/opt/gitlab/etc下,日志路径为/var/log/gitlab/ #然后启动gitlab [root@centos8-3 ~]# gitlab-ctl start [root@centos8-3 ~]# gitlab-ctl status #防火墙开放相关端口 [root@centos8-3 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent success [root@centos8-3 ~]# systemctl reload firewalld 最后就可以使用http://192.168.200.53顺利访问Gitlab了。 默认用户名为:root 密码可以在/etc/gitlab/initial_root_password文件中查看,登录后要及时修改默认密码
5、将IP访问修改为域名访问的更改方法
1)首先将/etc/gitlab/gitlab.rb文件中的192.168.200.53全部替换为gitlab.kevin.com [root@code-server gitlab]# vim /etc/gitlab/gitlab.rb external_url 'http://192.168.200.53' 改为: external_url 'http://gitlab.kevin.com' 2)其次将下面两文件中的192.168.200.53全部替换为gitlab.kevin.com /var/opt/gitlab/gitlab-shell/config.yml /var/opt/gitlab/gitlab-rails/etc/gitlab.yml 下面两文件都是上面两文件的软链接,修改上面两个文件即可 [root@code-server gitlab]# ll /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml lrwxrwxrwx 1 root root 43 Nov 9 18:00 /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml -> /var/opt/gitlab/gitlab-rails/etc/gitlab.yml [root@code-server gitlab]# ll /opt/gitlab/embedded/service/gitlab-shell/config.yml lrwxrwxrwx. 1 root root 39 Jun 11 20:04 /opt/gitlab/embedded/service/gitlab-shell/config.yml -> /var/opt/gitlab/gitlab-shell/config.yml 3)然后将下面文件中的192.168.200.53全部替换为gitlab.kevin.com /var/opt/gitlab/nginx/conf/gitlab-http.conf 4)最后执行"gitlab-ctl reconfigure"命令使之配置生效(注意最好不要执行"gitlab-ctl restart",只执行本命令即可)
6、修改GitLab默认语言为中文
登录GitLab后,点击页面右上方的头像,选择“Preferences”。
点击进去,在Preferences页面中,找到“Localization”区域,将“Language”选项修改为“简体中文”
最后点击页面下方的“Save changes”按钮,保存语言设置
7、关闭注册功能方法
在管理员账号(root)登录后,先把"注册"功能关了,这样就只能在管理员账号下创建用户。
在设置——通用里面找到注册限制,取消勾选“已启用注册功能”和“新的注册需要管理员批准”
最后点击保存更改
8、GitLab常用命令
#重新配置应用程序 gitlab-ctl reconfigure #启动全部服务 gitlab-ctl start #重启全部服务 gitlab-ctl restart #停止全部服务 gitlab-ctl stop #重启单个服务 gitlab-ctl restart [servername] #查看全部服务的状态 gitlab-ctl status #验证配置文件 gitlab-ctl show-config #查看服务的日志 gitlab-ctl tail #进入控制台 ,可以修改root 的密码 gitlab-rails console -e production #Gitlab的supervisor方式启动服务 服务启动命令: systemctl start gitlab-runsvdir.service 服务停止命令: systemctl stop gitlab-runsvdir.service 服务重启命令: systemctl restart gitlab-runsvdir.service 服务开机启动命令: systemctl enable gitlab-runsvdir.service 取消开机启动命令: systemctl disable gitlab-runsvdir.service 服务查看命令: systemctl list-unit-files
9、GitLab目录结构和服务组成
Gitlab目录结构
/opt/gitlab/ # 主目录
/etc/gitlab/ # 放置配置文件
/var/opt/gitlab/ # 各个组件
/var/log/gitlab/ # 放置日志文件
/var/opt/gitlab/git-data/repositories #数据库的地址
/var/opt/gitlab/postgresql/data #gitlab组和项目的地址
/etc/gitlab/gitlab.rb #gitlab配置文件
GitLab的服务组成
Nginx: 静态web服务器,整个gitlab服务的入口
gitlab-shell: 用于处理Git命令和修改authorized keys列表
gitlab-workhorse: 轻量级的反向代理服务器
postgresql: GitLab数据库
redis: 缓存数据库
sidekiq: 用于在后台执行队列任务(异步执行)
unicorn: An HTTP server for Rack applications, GitLab Rails应用是托管在
这个服务器上面的(基于Ruby虚拟机)
10、GitLab重置root用户密码
[root@centos8-3 ~]# gitlab-rails console -e production -------------------------------------------------------------------------------- Ruby: ruby 3.0.6p216 (2023-03-30 revision 23a532679b) [x86_64-linux] GitLab: 16.2.2 (9a102b1b08b) FOSS GitLab Shell: 14.23.0 PostgreSQL: 13.11 ------------------------------------------------------------[ booted in 24.61s ] Loading production environment (Rails 7.0.6) irb(main):001:0> user = User.where(username:'root').first => #<User id:1 @root> irb(main):002:0> user.password='admin123' => "admin123" irb(main):003:0> user.save! /opt/gitlab/embedded/lib/ruby/gems/3.0.0/gems/activerecord-7.0.6/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Password must not contain commonly used combinations of words and letters (ActiveRecord::RecordInvalid) irb(main):006:0> user.password='086530Qwe' => "086530Qwe" irb(main):007:0> user.save! => true irb(main):008:0> exit 修改完密码之后,回到界面使用重置的密码即可登录 说明:报一下错误是验证失败:密码不能包含常用的单词和字母组合 /opt/gitlab/embedded/lib/ruby/gems/3.0.0/gems/activerecord-7.0.6/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Password must not contain commonly used combinations of words and letters (ActiveRecord::RecordInvalid)
11、配置邮箱
关于postfix邮件服务安装后无法启动的解决方法
#修改main.cf配置文件中的下面参数 [root@centos8-3 ~]# cat /etc/postfix/main.cf inet_interfaces = localhost 改为 inet_interfaces = all 之后重启邮件服务就可以了
gitlab使用第三方发送邮件做以下配置:
[root@centos8-3 ~]# cat /etc/gitlab/gitlab.rb|grep -v "^#"|grep -v "^$" external_url 'http://192.168.200.53' gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.qq.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "1490176741@qq.com" gitlab_rails['smtp_password'] = "bjfvomsgionmgbfa" gitlab_rails['smtp_domain'] = "qq.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = false gitlab_rails['smtp_tls'] = true gitlab_rails['gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = '1490176741@qq.com' gitlab_rails['gitlab_email_display_name'] = 'GitLab' #重载配置 gitlab-ctl reconfigure #测试发送邮件 执行 gitlab-rails console -e production进入控制台。 然后在控制台提示符后输入下面的命令 发送一封测试邮件:Notify.test_email('收件人邮箱', '邮件标题', '邮件正文').deliver_now [root@centos8-3 ~]# gitlab-rails console -e production -------------------------------------------------------------------------------- Ruby: ruby 3.0.6p216 (2023-03-30 revision 23a532679b) [x86_64-linux] GitLab: 16.2.2 (9a102b1b08b) FOSS GitLab Shell: 14.23.0 PostgreSQL: 13.11 ------------------------------------------------------------[ booted in 25.91s ] Loading production environment (Rails 7.0.6) irb(main):001:0> Notify.test_email('1490176741@qq.com','测试Gitlab邮箱','test').deliver_now Delivered mail 64cab31e7b95c_22532df0244ea@centos8-3.mail (1839.2ms) => #<Mail::Message:495260, Multipart: false, Headers: <Date: Thu, 03 Aug 2023 03:48:46 +0800>, <From: GitLab <1490176741@qq.com>>, <Reply-To: GitLab <noreply@192.168.200.53>>, <To: 1490176741@qq.com>, <Message-ID: <64cab31e7b95c_22532df0244ea@centos8-3.mail>>, <Subject: 测试Gitlab邮箱>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>> irb(main):002:0> exit #配置说明 gitlab_rails['smtp_enable'] = true #修改为对应的邮件服务域名 gitlab_rails['smtp_address'] = "smtp.qq.com" gitlab_rails['smtp_port'] = 465 #修改为对应的邮箱 gitlab_rails['smtp_user_name'] = "1490176741@qq.com" #授权码,从qq邮箱设置里获取 gitlab_rails['smtp_password'] = "bjfvomsgionmgbfa" gitlab_rails['smtp_domain'] = "qq.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = false gitlab_rails['smtp_tls'] = true gitlab_rails['gitlab_email_enabled'] = true #gitlab发送人,修改为对用的邮箱 gitlab_rails['gitlab_email_from'] = '1490176741@qq.com' #gitlab发邮件时使用的名称 gitlab_rails['gitlab_email_display_name'] = 'GitLab'
四、GitLab的备份与恢复
对gitlab进行备份将会创建一个包含所有库和附件的归档文件。对备份的恢复只能恢复到与备份时的gitlab相同的版本。
1、热备份前提
热备份需要关系gitlab消息队列,使得能够备份完整数据
[root@centos8-3 ~]# gitlab-ctl service-list alertmanager* gitaly* gitlab-exporter* gitlab-kas* gitlab-workhorse* logrotate* nginx* node-exporter* postgres-exporter* postgresql* prometheus* puma* redis* redis-exporter* sidekiq*
[root@centos8-3 ~]# gitlab-ctl stop sidekiq ok: down: sidekiq: 0s, normally up [root@centos8-3 ~]# gitlab-ctl stop unicron unicorn 是 ruby 的 http server ,可以通过 http:ͬ˾localhost:80 端口访问, nginx 是 unicorn 的反向代理。 gitlab-ctl stop unicorn 和 gitlab-ctl stop sidekiq 命令用来停止相关数据连接服务,防止发生意外情况
2、备份GitLib
使用控制台备份及恢复 Gitlab 数据
可以通过/etc/gitlab/gitlab.rb配置文件来修改默认存放备份文件的目录
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_keep_time'] = 604800 backup_path 表示备份文件路径,默认为 /var/opt/gitlab/backups ,可以修改为指定路径 backup_keep_time 表示备份有效时间,默认为7天 修改完路径后,需要使用gitlab-ctl reconfigure初始化gitlab配置
使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份
# gitlab-rake gitlab:backup:create 比如使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1691477848_2023_08_08_16.2.2_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1691477848是备份创建的日期。 /etc/gitlab/gitlab.rb 配置文件须备份 /var/opt/gitlab/nginx/conf nginx配置文件 /etc/postfix/main.cfpostfix 邮件配置备份 查看备份的文件 [root@centos8-3 ~]# ls /var/opt/gitlab/backups/ 1691477848_2023_08_08_16.2.2_gitlab_backup.tar
Gitlab自动备份
#实现每天凌晨2点进行一次自动备份:通过crontab使用备份命令实现
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
3、恢复GitLib数据
1)停止相关数据连接服务 # gitlab-ctl stop unicorn # gitlab-ctl stop sidekiq 2)从1481598919编号备份中恢复 # gitlab-rake gitlab:backup:restore BACKUP=1691477848 3)启动Gitlab # gitlab-ctl start
4、从备份文件中恢复(迁移)
迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups即可(如果你没修改过默认备份目录的话).
但是需要注意的是:
新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的7.60版本的Gitlab, 那么迁移之前, 最好将老服务器的Gitlab 升级为7.60在进行备份.
/etc/gitlab/gitlab.rb 这个gitlab配置文件须迁移,迁移后需要调整数据存放目录
/var/opt/gitlab/nginx/conf 这个nginx配置文件目录须迁移
/etc/gitlab/gitlab-secrets.json #复制新服务器相同的目录下
/etc/ssh/*key* #复制到新服务器相同目录下,解决ssh key认证不成功问题
gitlab-ctl stop unicorn gitlab-ctl stop sidekiq chmod 777 /var/opt/gitlab/backups/1691477848_2023_08_08_16.2.2_gitlab_backup.tar # 或 chown git:git /var/opt/gitlab/backups/1691477848_2023_08_08_16.2.2_gitlab_backup.tar gitlab-rake gitlab:backup:restore BACKUP=1691477848 提示,备份包中没有 gitlab.rb 和 gitlab-secrets.json ,需要手动拷贝到服务 器上,并重新初始化gitlab配置 scp /etc/gitlab/gitlab.rb server_ip:/etc/gitlab/ scp /etc/gitlab/gitlab-secrets.json server_ip:/etc/gitlab/ gitlab-ctl reconfigure gitlab-ctl status
5、 Gitlab升级
1.关闭gitlab服务 # gitlab-ctl stop unicorn # gitlab-ctl stop sidekiq # gitlab-ctl stop nginx 2.备份gitlab # gitlab-rake gitlab:backup:create 3.下载gitlab的RPM包并进行升级 # curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash # yum update gitlab-ce 或者直接安装高版本 #yum install gitlab-ce-12.1.12-ce.0.el7.x86_64 或者上官网下载最新版本 gitlab对应软件包 gitlab官网地址: https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-12.1.12-ce.0.el7.x86_64.rpm 使用: # rpm -Uvh gitlab-ce-12.1.12-ce.0.el7.x86_64 如果报错. Error executing action `run` on resource 'ruby_block[directory resource: /var/opt/gitlab/git-data/repositories]' 解决方法: sudo chmod 2770 /var/opt/gitlab/git-data/repositories 4.启动并查看gitlab版本信息 # gitlab-ctl reconfigure # gitlab-ctl restart # head -1 /opt/gitlab/version-manifest.txt
五、GitLab Runner使用
1、为什么要使用CI/CD
1、频繁发布:持续实践背后的目标是能够频繁地交付高质量的软件。
2、自动化流程:实现此频率的关键是用自动化流程来处理软件生产中的方方面面,减少人为干预。
3、可重复:如果我们使用的自动化流程在给定相同输入的情况下始终具有相同的行为,则这个过程应该是可重复的。
4、快速迭代:“快速”在这里是个相对术语,但无论软件更新/发布的频率如何,预期的持续过程都会以高效的方式将源代码转换为交付物。
2、CICD简单工作流程中的6个步骤
1、Commit Change 开发人员提交代码至代码仓库中
2、Build Binary CI Server 针对最新的变更构建应用程序
3、Deplop UAT CI Server 将二进制程序部署到UAT环境中
4、Test UAT 在UAT环境中针对测试计划完成测试
5、Deploy PROD CI Server 将二进制程序部署到PROD环境中
6、Test PROD 在PROD环境中针对测试计划完成测试
UAT (User Acceptance Test),用户接受度测试 即验收测试,所以UAT环境主要是用来作为客户体验的环境。
PROD production 产品/正式/生产,是指正式提供对外服务的,一般会关掉错误报告,打开错误日志。可以理解为包含所有的功能的环境,任何项目所使用的环境都以这个为基础,然后根据客户的个性化需求来做调整或者修改。
3、GitLab CI部署
gitlab-CI 是gitlab8.0之后自带的一个持续集成系统,中心思想是当每一次push到gitlab的时候,都会触发一次脚本执行,然后脚本的内容包括了测试,编译,部署等一系列自定义的内容。
gitlab-CI 的脚本执行,需要自定义安装对应 gitlab-runner 来执行,代码push 之后, webhook 检测到代码变化,就会触发 gitlab-CI ,分配到各个 Runner来运行相应的脚本 script 。这些脚本有的是测试项目用的,有的是部署用的。
4、GitLab Runner安装
- GitLab Runner是一个开源项目,用于运行作业并将结果发送回GitLab。
- 与GitLabCI结合使用,GitLabCI是GitLab随附的用于协调作业的开源持续集成服务。
- GitLab Runner是用Go编写的,可以在Linux,macOS和Windows操作系统上运行。
- 容器部署需使用最新Docker版本。GitLab Runner需要最少的Docker v1.13.0。
- GitLab Runner版本应与GitLab版本同步。(避免版本不一致导致差异化)
- 可以根据需要配置任意数量的Runner。
#安装 curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash yum install -y gitlab-runner #启动并设为开机自启 systemctl start gitlab-runner systemctl status gitlab-runner systemctl enable gitlab-runner
5、注册GitLab Runner
#注册 gitlab-runner register --url http://192.168.200.53/ --registration-token 64Cyckx3kKm9EmcNUAX6
url为gitlib访问的IP,token为在web界面管理中心---共享Runner中查看