GitLab跨版本升级之旅【11.0.2-->17.2.2,亲测+避坑】
/进入rc.local文件中 vi /etc/rc.d/rc.local //这里复制粘贴到rc.local文件中即可 /usr/local/redis-5.0.0/bin/redis-server /usr/local/redis-5.0.0/etc/redis.conf /usr/local/redis/redis-7.0.0/bin/redis-server /usr/local/redis
前言
先说一下背景,因gitlab版本过低,存在安全漏洞,所以决定升级版本,但gitlab官网说不能直接跨版本升级,只能按照官方的升级路径来升级,在升级的过程中也遇到好多问题,所以记录下来,
现状 服务器版本 Centos7
gitlab版本 11.0.2
升级前需要把Centos7 更新,yum update ,以便升级所需依赖包版本,避免gitlab升级过程中需要的依赖包版本低导致升级失败
需要把Centos7 的防火墙先关闭,升级完gitlab版本在打开,
首先确认升级方式
1、确认升级方式
首先,我们的环境中GitLab是通过RPM方式安装的,然后版本是gitlab-ce-11.0.2,所以我要进行升级的话还是选择通过RPM的方式去升级。
2、确认升级流程
Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror gitlab包下载地址
GitLab的跨版本升级,需要先升级到当前大版本的最高版本后再升到下一版本。因此升级路线如下:26个
升级路线查看工具地址:Upgrade Path
11.0.2=>11.0.3=>11.0.4=>11.0.5=>11.0.6=>11.11.8=>12.0.12 => 12.1.17 => 12.10.14 => 13.0.14 => 13.1.11 => 13.8.8 => 13.12.15 =>
gitlab 13.x 升级至 14.x 需要解决哈希存储转换问题
14.0.12 =>
14.0.12->14.3.6需要升级数据库关系
14.3.6 => 14.9.5 => 14.10.5 => 15.0.5 => 15.4.6 => 需手动要升级PostgreSQL版本 13
15.11.13 => 16.0.8 => 16.1.6 => 16.3.7 => 16.7.7 => 16.10.1=>要手动升级PostgreSQL版本 14
16.11.8=> 17.2.2
3、确认升级影响
对于单节点安装,GitLab 在升级过程中对用户不可用。用户的 Web 浏览器显示Deploy in progress消息或502错误。
对于多节点安装,请参阅如何执行 零停机升级
4、升级前备份
GitLab 提供了用于备份和恢复 GitLab 实例的 Rake 任务。
应用程序数据备份会创建一个包含数据库、所有存储库和所有附件的存档文件。
您只能将备份恢复到与 创建它的 GitLab完全相同的版本和类型 (CE/EE) 。将项目从一台服务器迁移到另一台服务器的最佳方式是通过备份和恢复。
5、手动备份
先停止两个组件 gitlab-ctl stop unicorn gitlab-ctl stop sidekiq
gitlab-ctl stop sidekiq是停止Sidekiq进程的命令。
Sidekiq是GitLab中的一个组件,主要用于在后台执行队列任务(异步执行)。通过gitlab-ctl stop sidekiq命令,可以停止Sidekiq进程。这个命令通常用于维护或更新GitLab服务时,需要暂时停止Sidekiq进程以确保服务的稳定性和数据的完整性,
大概意思就是 停止了Sidekiq进程,gitlab就不能正常访问,但是备份不受影响,就确保了备份的完整性,如果不停止Sidekiq进程,就可能出现研发一边在上传代码,一边在备份数据,备份完成的数据就不完整了
gitlab-rake gitlab:backup:create # 备份文件默认存储路径 /var/opt/gitlab/backups
注意:gitlab升级的时候,会自动备份
#配置文件备份
/etc/gitlab/gitlab.rb 配置文件须备份
升级前最好 更新一下 yum update (有些依赖版本低会在后续升级中导致报错)
6、升级命令
配置文件备份
cp /etc/gitlab/gitlab.rb /var/opt/gitlab/backups/
cp /etc/gitlab/gitlab-secrets.json /var/opt/gitlab/backups/ #该文件存储了 GitLab 运行所需的敏感信息和密钥,例如数据库密码、JWT 秘钥、CI/CD token、GitLab shell 秘钥等
1.下载安装包(把升级需要的安装包下载好)
下载的安装包最好把权限都设置 777,
2.关闭部分gitlab服务(不要全关,因为升级中可能需要部分服务)
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
gitlab-ctl stop nginx
3.安装
rpm -Uvh gitlab-ce-11.0.2-ce.0.el7.x86_64
4.刷新配置
gitlab-ctl reconfigure
5.重启
gitlab-ctl restart
5.当时访问会显示502 ,需要等待一会即可
注:要在管理中心》监控》后台任务,已停滞的都清理掉,避免升级报错
安装及升级命令可重复进行版本逐个升级安装
把防护墙关闭以免影响升级
避坑:
14.0.12->14.3.6需要升级数据库关系&&14.0.12->14.3.6需要升级Redis版本(注:缺一个都会导致升级失败),安装完毕后最好重启电脑,等待在check gitlab一下 ,OK了 在进行下一步升级
14.0.12->14.3.6需要升级数据库关系
这一步升级的时候报错了,然后执行以下操作继续升
gitlab-rake db:migrate #升级数据库关系
gitlab-ctl reconfigure
gitlab-ctl restart
到14.0.12 需要修改文件权限,要不然升级会报错
chmod 755 /var/opt/gitlab/postgresql
chmod 755 /var/opt/gitlab/postgres-exporter
chmod -R 777 /opt/gitlab/varpuma/
systemctl restart gitlab-runsvdir
GitLab 15.11.0升级到16.0.1,需将PostgreSQL升级到13.6版本
查看PostgreSQL版本 /opt/gitlab/embedded/bin/postgres --version
升级到PostgreSQL13.0以上 gitlab-ctl pg-upgrade -V 13
在每次升级前需检查一般配置:gitlab-rake gitlab:check 看是否正常,如果有,要处理
在升级完成后并能正常访问后可 清理缓存: gitlab-rake cache:clear
14.0.12->14.3.6需要升级Redis版本(这个报错问题困扰了好久,试安装了好多个版本,
Linux(centos7)安装Redis
1.下载Redis
Redis版本库: Index of /releases/可根据自己的需求选择下载对应的版本,本文中使用的是 5.0.0 版本; 我测试安装的是 7.0.0版本,安装教程是5.0.0,
通过网盘分享的文件:redis-7.0.0.tar.gz
链接: 百度网盘 请输入提取码 提取码: pm38
查看Redis的版本信息,可以使用:
redis-server --version 将直接输出Redis服务器的版本号
[root@localhost git-rpm]# redis-server --version
Redis server v=7.0.0 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=ad770755ab837828
2.上传Redis至Centos
在/usr/local目录下创建一个redis文件夹用于接收已下载的redis文件
//在/usr/local目录下创建一个redis文件夹 mkdir /usr/local/redis //权限不够可以先切换root用户 使用su进行切换 su,我直接用root账号
我是用ftp工具把压缩包上传到 centos7上的
3.解压Redis
//解压命令 tar -xzf ./redis-5.0.0.tar.gz
4.安装Redis(编译和安装)
//先进入redis-5.0.0目录中 cd /usr/local/redis/redis-5.0.0 //对解压后的文件进行编译 make //编译完成后进入redis-5.0.0/src目录 cd /usr/local/redis/redis-5.0.0/src //安装redis make install
5.统一管理Redis配置文件
将Redis文件中的conf配置文件和常用命令移动到统一文件中方便后续管理配置文件。
(1)创建bin和etc文件夹(先进入redis-5.0.0目录中在创建)
//创建bin目录 mkdir bin //创建etc目录 mkdir etc
(2)将redis-5.0.0目录下的 redis.conf 移动到 redis-5.0.0目录下的etc文件夹下
//先进入redis-5.0.0目录中并创建完成etc目录在执行下面代码 mv ./redis.conf ./etc
执行完成以后可以到etc目录看下:
(3)将mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-cli、redis-server 移动到 /usr/local/redis-5.0.0/bin 目录下
//先进入redis-5.0.0的src目录 cd /usr/local/redis/redis-5.0.0/src //将mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-cli、redis-server 移动到 /usr/local/redis-5.0.0/bin 目录下 mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis/redis-5.0.0/bin
执行完成后可以进入bin目录看下:
6.编辑 redis.conf配置文件,设置后台启动redis服务
(1).把文件中的daemonize属性改为yes(表明需要在后台运行)
(2).把 redis.conf配置文件中的 bind 127.0.0.1 这一行给注释掉,这里的bind指的是只有指定的网段才能远程访问这个redis,注释掉后,就没有这个限制了。
//进入redis.conf文件中 vi /usr/local/redis/redis-5.0.0/etc/redis.conf
daemonize属性改为yes 在309行
注释bind 127.0.0.1 在87行
完成以上2个步骤保存(:wq)即可;
7.编辑 redis.conf文件,修改Redis默认密码 (默认密码为空)。
//进入redis.conf文件中 vi /usr/local/redis/redis-5.0.0/etc/redis.conf
在这个地方新加一行然后设置密码就可以了这里我设置的123456 在1037行
8.设置Redis开机启动,添加代码到 /etc/rc.d/rc.local 中
//进入rc.local文件中 vi /etc/rc.d/rc.local //这里复制粘贴到rc.local文件中即可 /usr/local/redis-5.0.0/bin/redis-server /usr/local/redis-5.0.0/etc/redis.conf /usr/local/redis/redis-7.0.0/bin/redis-server /usr/local/redis/redis-7.0.0/etc/redis.conf
添加完成后保存即可
9.关闭防火墙,启动redis服务
//关闭防火墙 systemctl stop firewalld.service //进入redis的bin目录 cd /usr/local/redis/redis-5.0.0/bin //启动redis ./redis-server /usr/local/redis/redis-5.0.0/etc/redis.conf ./redis-server /usr/local/redis/redis-7.0.0/etc/redis.conf
启动成功如下
gitlab 13.12.15 升级至 14.0.12 哈希存储转换问题
[root@docker test] gitlab-ctl stop puma && gitlab-ctl stop sidekiq && gitlab-ctl stop nginx && gitlab-ctl status
进入 Rails 控制台
gitlab-rails console
查询项目 read-only 打开的
projects = Project.where(repository_read_only: true) #最好手打
关闭项目的 read-only
projects.each do |p| #最好手打
p.update!(repository_read_only:nil)
end
退出
exit
注意: 13升到14的时候,存储需要migrate_to_hashed
存储库迁移
[root@gitlab_ae ~] gitlab-rake gitlab:storage:migrate_to_hashed
重启gitlab
[root@gitlab_ae ~] gitlab-ctl restart
存储库迁移
[root@gitlab_ae ~] gitlab-rake gitlab:storage:migrate_to_hashed
查看传统存储项目以下两条命令应该为 0
[root@gitlab_ae ~] gitlab-rake gitlab:storage:list_legacy_projects
[root@gitlab_ae ~] gitlab-rake gitlab:storage:legacy_attachments
可以导出或者删除有问题的存储库,方便以后恢复
重新检查传统存储项目
[root@gitlab_ae ~] gitlab-rake gitlab:storage:list_legacy_projects
但实际上这边遇到了一个奇怪的问题,每次迁移时都提示成功,多次执行都返回如下内容:
Enqueuing migration of 41 projects in batches of 200. Done!
如果传统存储转HASH显示成功,实际没有成功的情况,可以更新下令牌重新转HASH就可以。
具体如下:
#进入数据库终端
gitlab-rails dbconsole
#执行清空命令
UPDATE projects SET runners_token = null, runners_token_encrypted = null;
#退出
exit;
然后重新执行 hash转储命令,校验后发现已经迁移成功!
gitlab-rake gitlab:storage:migrate_to_hashed
后续在补充。。。。。
更多推荐
所有评论(0)