秋栈博客

七月

Gitlab升级文档demo

2022-11-29

一、准备工作

  1. 出错排查

 # 查看所有的logs; 按 Ctrl-C 退出
 $ gitlab-ctl tail
 # 拉取/var/log/gitlab下子目录的日志(查看拉取或者推送的错误日志)
 $ gitlab-ctl tail gitlab-rails
 # 拉取某个指定的日志文件(查看gitlab运行组件报错信息)
 $ gitlab-ctl tail nginx/gitlab_error.log
  1. 确认当前版本及安装方式

 $ cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
 14.7.3
 cat /var/opt/gitlab/postgresql/data/PG_VERSION
 12
 $ rpm -qa gitlab-ce
 gitlab-ce-14.7.3-ce.0.el7.x86_64
  1. 确认版本

 $ cat /etc/redhat-release
 CentOS Linux release 7.9.2009 (Core)
 $ uname -r
 3.10.0-1160.59.1.el7.x86_64
  1. GitLab状态

 $ gitlab-ctl status
  1. 升级流程

可通过 https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/ 获取升级流程

二、备份相关测试

  1. 查看备份版本

 $ cat /etc/gitlab/gitlab.rb | grep backup_path
 gitlab_rails['manage_backup_path'] = true
 gitlab_rails['backup_path'] = "/data/gitlab/backups"
  1. 查看过期时间(秒)

 $ cat /etc/gitlab/gitlab.rb | grep backup_keep_time
 gitlab_rails['backup_keep_time'] = 604800
  1. 执行备份命令

 $ gitlab-backup create

从备份中排除特定目录

  • db(数据库)
  • uploads(附件)
  • builds(CI 作业输出日志)
  • artifacts(CI 作业工件)
  • lfs(LFS 对象)
  • registry(容器注册表映像)
  • pages(页面内容)
  • repositories(Git 存储库数据)
  • packages(包)
$ gitlab-backup create SKIP=db,uploads
  1. 配置文件备份

/etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab.rb
$ cp /etc/gitlab/gitlab.rb /root/gitlab/gitlab.rb
$ cp /etc/gitlab/gitlab-secrets.json /root/gitlab/gitlab-secrets.json

三、正式升级步骤

升级包下载地址:https://packages.gitlab.com/gitlab/gitlab-ce/

升级路径:14.9.5 => 14.10.5 => 15.0.5 => 15.4.4 => 15.5.3

循环执行以下步骤

升级每个版本时,需要启动GitLab等待数据迁移任务完成,然后再备份,再次进行下一个版本的升级。
 升级前检查:
$ rpm -qa gitlab-ce
gitlab-ce-14.7.3-ce.0.el7.x86_64

#查看服务状态
$ gitlab-ctl status
 
$ gitlab-rake gitlab:check SANITIZE=true --trace
$ gitlab-rake gitlab:check
$ gitlab-rake gitlab:check SANITIZE=true
 
 #手动备份敏感文件
$ cp /etc/gitlab/gitlab.rb  /var/opt/gitlab/backups
$ cp /etc/gitlab/gitlab-secrets.json  /var/opt/gitlab/backups
 
 #停止服务
$ gitlab-ctl reconfigure
$ gitlab-ctl stop 
$ gitlab-ctl status

#安装新版本
$ rpm -Uvh gitlab-ce-12.10.14-ce.0.el7.x86_64.rpm 

确认配置文件内容存在,如果不存在替换之前的备份文件:
$ cd /etc/gitlab/
$ egrep -v "^$|^#" gitlab.rb

#刷新配置 
$ gitlab-ctl reconfigure

#安装后可能会有部分服务启动失败,执行如下命令:
$ gitlab-ctl restart

#查看数据是否迁移完成:web界面为Menu > Admin > Monitoring > Background Migrations.
$ gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'

#确认当前版本及服务状态:
$ gitlab-ctl status 
$ rpm -qa gitlab-ce
$ cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
#访问页面确认版本
http://gitlab.luna.org/help

14.7.3 => 14.9.5

$ wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-14.9.5-ce.0.el7.x86_64.rpm/download.rpm
$ rpm -Uvh gitlab-ce-14.9.5-ce.0.el7.x86_64.rpm

风险点:

  • 升级到 GitLab 14.9 所做的数据库更改可能需要数小时或数天才能在更大的 GitLab 实例上完成。这些批处理的后台迁移更新整个数据库表,以确保namespaces表中的每条记录都有对应的记录projects
  • 更新到 14.9.0 或更新的 14.9 补丁版本后, 必须先完成批量后台迁移, 然后再更新到更新的版本。
  • 如果迁移未完成并且您尝试更新到更高版本,您会看到如下错误:
  • Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
  • 或者
  • Error executing action run on resource 'bash[migrate gitlab-rails database]' ================ Mixlib::ShellOut::ShellCommandFailed ------------------------------------ Command execution failed. STDOUT/STDERR suppressed for sensitive resource
  • GitLab 14.9.0 包括一个 后台迁移ResetDuplicateCiRunnersTokenValuesOnProjects ,它可能会永久停留在挂起状态。
  • 要清理这个卡住的工作,请在GitLab Rails 控制台中运行以下命令:
  • Gitlab::Database::BackgroundMigrationJob.pending.where(class_name: "ResetDuplicateCiRunnersTokenValuesOnProjects").find_each do |job| puts Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded("ResetDuplicateCiRunnersTokenValuesOnProjects", job.arguments) end
  • 如果您运行外部 PostgreSQL,尤其是 AWS RDS, 请检查您是否有 PostgreSQL 错误修复 以避免数据库崩溃。

更新14.9.5 => 14.10.5

 $ wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-14.10.5-ce.0.el7.x86_64.rpm/download.rpm
 $ rpm -Uvh gitlab-ce-14.10.5-ce.0.el7.x86_64.rpm

风险点

  • 在升级到 GitLab 14.10 之前,您必须已经在您的实例上安装了最新的 14.9.Z。升级到 GitLab 14.10 会执行数据库表中不需要的条目的并发索引删除。ci_job_artifacts这可能会运行数分钟,尤其是在表有大量流量并且迁移无法获取锁的情况下。建议让此过程完成,因为重新启动可能会导致数据丢失。
  • 如果您运行外部 PostgreSQL,尤其是 AWS RDS, 请检查您是否有 PostgreSQL 错误修复 以避免数据库崩溃。
  • 如果在运行 GitLab 14.9 时未完成升级到补丁级别 14.10.3 或更高版本,由于长时间运行的数据库数据更改可能会遇到一小时超时。
  • 存在一种解决方法来手动完成数据更改和升级

升级14.10.5 => 15.0.5

 $ wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-15.0.5-ce.0.el7.x86_64.rpm/download.rpm
 $ rpm -Uvh gitlab-ce-15.0.5-ce.0.el7.x86_64.rpm

风险点

升级15.0.5 => 15.4.4

 $ wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-15.4.4-ce.0.el7.x86_64.rpm/download.rpm
 $ rpm -Uvh gitlab-ce-15.4.4-ce.0.el7.x86_64.rpm

风险点

升级15.4.4 => 15.5.3

 $ wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-15.5.3-ce.0.el7.x86_64.rpm/download.rpm
 $ rpm -Uvh gitlab-ce-15.5.3-ce.0.el7.x86_64.rpm

查看版本号

 $ cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

四、回滚

前提:
  • 已安装与创建备份完全相同的 GitLab 版本
  • 运行一次gitlab-ctl reconfigure
  • GitLab 正在运行。如果没有,请运行gitlab-ctl start
首先确保您的备份 tar 文件位于 gitlab.rb配置中描述的备份目录中gitlab_rails['backup_path']。默认值为 /var/opt/gitlab/backups. 备份文件需要归git用户所有。
$ cp time-ce_gitlab_backup.tar /var/opt/gitlab/backups/
$ chown git:git /var/opt/gitlab/backups/time-ce_gitlab_backup.tar
停止连接到数据库的进程。让 GitLab 的其余部分继续运行:
$ gitlab-ctl stop puma
$ gitlab-ctl stop sidekiq
# Verify
$ gitlab-ctl status
接下来,恢复备份,指定要恢复的备份的时间戳:
$ gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce

若有排除的还原任务项

  • db(数据库)
  • uploads(附件)
  • builds(CI 作业输出日志)
  • artifacts(CI 作业工件)
  • lfs(LFS 对象)
  • registry(容器注册表映像)
  • pages(页面内容)
  • repositories(Git 存储库数据)
  • packages(包)
$ gitlab-backup restore BACKUP=timestamp_of_backup SKIP=db,uploads
重新配置、重启并检查GitLab:
$ gitlab-ctl reconfigure
$ gitlab-ctl restart
$ gitlab-rake gitlab:check SANITIZE=true
检查敏感配置, 前提/etc/gitlab/gitlab-secrets.json已恢复
$ gitlab-rake gitlab:doctor:secrets
执行完整性检查
$ gitlab-rake gitlab:artifacts:check
$ gitlab-rake gitlab:lfs:check
$ gitlab-rake gitlab:uploads:check

五、测试

  • 0