Gitlab-CE迁移备忘录

文章目录

前言

前略,天国的Gitlab-CE 8.9.6,我突然特别想买iMAC 27寸了,5K屏幕的显示效果应该很棒棒的,再外接个4K显示器,竖屏使用。

您试过在不丢数据的前提下,把一个两三年前的软件升级到最新版本吗?虽然碰上中秋节,周六还是去加班专门解决Gitlab-CE的升级问题,一整天都在尝试各种更新,不断地失败,下班后在家咸鱼了两天,周二花了一个早上完成了迁移。

原先的Gitlab-CE使用亚马逊提供的bitnami全家桶安装,停留在8.9.6版本,sidekiq进程经常崩溃。这个时候可以推送代码,但gitlab的网页上看不到更新。因为代码仓库是很重要的资源,刚来的时候看到这个问题感觉后背拔凉,吹牛说要更新gitlab,结果拖了刚好满一个月时才动手。

正文

机器配置

(1)Gitlab全家桶套装,可以这么称呼,附带PostgreSQL、Redis程序,所以最好独立一台主机安装;

(2)Gitlab文档中推荐至少双核4GB的配置,实测单核2GB依旧可以运行,启动与升级较慢,CPU会跑满;

(3)交换空间需要加大,避免升级或更新配置时内存爆满引起OOM,备份或检查指令应该在Gitlab稳定运行,CPU使用率降下后执行;

(4)备份、还原与升级会占用巨大的空间,以4GB的repository目录为例,备份、还原后至少占据12GB,升级过程中若自动备份老数据,总量可能一下子蹦上20GB。

迁移过程

初始版本:Bitnami Gitlab-CE 8.9.6

目标版本:Omnibus Gitlab-CE 11.3.0

版本迁移过程:Bitnami Gitlab-CE 8.9.6 -> GItlab-CE 8.9.6 -> Gitlab-CE 8.10.0 -> Gitlab-CE 8.11.0 -> Gitlab-CE 8.17.8 -> Gitlab-CE 10.0.0 -> Gitlab-CE 10.8.7 -> Gitlab-CE 11.0.0 -> Gitlab-CE 11.3.0

注意事项

(1)一开始觉得需要手动导出数据库,但发现Gitlab-CE全家桶内部解决了数据库问题,转而使用备份还原策略,Bitnami版本导出数据恢复到官方版本,然后一路升级,修复问题;

(2)官方的Release Note中有标记关键版本,例如8.11.0、8.15.0,这类是大版本内部的小版本升级,但由于更改数据结构和安装方式,不能跳过;

(3)大版本升级,同样需要先升级至当前大版本的最新版本,然后再升级下一个版本的初始版本,版本8到10之间还有一个9,但官方文档里提示可以从8升级至10,需要8.15及以上版本,数据库及数据越需要一并升级,从8.17.8可以直接升级10;

(4)保险起见,应该停机升级,每次升级前,做好虚拟机级别的快照,并创建Gitlab-CE数据备份包以便恢复,但很繁琐。

相关链接:

Gitlab-CE各版本更新说明: https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/update

Gitlab-CE大版本更新说明:https://docs.gitlab.com/omnibus/update/

恢复与备份

安装后查看Gitlab-CE的文件目录,会发现自带了许许多多的软件,包括ruby,所以不需要安装额外的软件。gitlab开头的程序可以直接使用,应该是作为真正可执行的ruby程序的一个带参数链接,像较老的Bitnami版本,文件安装目录更分散,需要使用一些程序时可以把程序目录暂时添加到PATH。

创建备份

omnibus版本:

sudo gitlab-rake gitlab:backup:create

备份文件保存在**/var/opt/gitlab/backups**目录

从源码安装的版本(注意添加可执行程序路径到PATH):

sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production

以Bitnami Gtilab-CE 8.9.6版本为例,保存在**/opt/bitnami/apps/gitlab/htdocs/tmp/backups**目录下

文件名为数字+下划线+gitlab+下划线+backup.tar的压缩包。例如1537610011_gitlab_backup.tar

还原备份

我在从Bitnami版迁移到Gitlab官方版时备份还原了一次,这是必须执行的操作,后续就变成在官方版本的环境下直接升级。

还原时先关闭了所有Bitnami相关内容,包括开机自启动,安装官方版本,启动,待稳定运行后关闭unicorn与sidekiq两个程序。

sudo gitlab-ctl start
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl status

操作要慢,命令执行后要检查,因为程序在启动过程中不会被停止。

还原时BACKUP后填备份时生成的数字部分即可。

sudo gitlab-rake gitlab:backup:restore BACKUP=1537610011

还原完成后重启,并进行检查。

sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true

相关链接:

https://docs.gitlab.com/ce/raketasks/backup_restore.html

遇到的问题

备份升级过程中遇到的问题太多,有些解决了但忘了记录,还原后启动不正常,从404到502的错误都遇到过,但注意,我们可以看日志,找配置文件,再谷歌搜索,下面是一些我认为需要关注的目录。

/var/log/gitlab目录:包含Gitlab全家桶的全部进程日志,外网HTTP请求Gitlab,分别经过NGINX、gitlab-workhorse、gitlab-rails,最后一个是经常引起问题的本体;

/var/opt/gitlab目录:包含Gitlab全家桶程序的配置以及数据存储,例如可以在其中的nginx目录中看到NGINX的详细配置和所有的repo;

/opt/gitlab目录:可执行程序全家桶的本体目录;

/etc/gitlab目录:Gitlab配置目录。

下面记录一些还有点印象的内容。

db_key_base字段

原本的密钥字段位置在**/opt/bitnami/apps/gitlab/htdocs/config/secrets.yml中,官方版本存在/etc/gitlab/gitlab-secrets.json**中,升级文档里提到要注意备份还原密钥,但还缺了一个操作,导致一直报OpenSSL相关问题。更新密钥后还需要执行

sudo gitlab-rails runner "Project.where.not(import_url: nil).each { |p| p.import_data.destroy if p.import_data }"

修复访问错误

数据库及数据升级

sudo gitlab-ctl pg-upgrade
sudo gitlab-rake db:migrate

从8.11.0升级到8.17.8后执行了一次数据库升级,PostgreSQL也一并升到9.6,之后可以正常访问Gitlab,但从8.17.8升级到10.0.0时直接报502了,看日志发现一些用户相关问题,应该是数据库中用户对象的属性与新版本的用户对象没有同步,再次执行数据升级操作后,正常运行。

HTTPS配置

若Gitlab配置文件中外部链接含有https,Gitlab默认使用let's encrypt证书+NGINX来启用HTTPS。由于是从一台机器迁移到另一台,原先的域名重新解析,导致let's encrypt的文件验证方式失败,在迁移前不妨先解析一个新的域名,待完成迁移验证后,再把老域名重新解析过来。另外默认未开启80重定向,需要在配置文件中启用并保存,执行gitlab-ctl reconfigure指令应用修改。

Check

sudo gitlab-rake gitlab:check SANITIZE=true

每次升级、重启Gitlab后,都会执行一次来检查状态,多多少少会遇到一些文件权限问题,命令行输出会提示如何进行修正。