GitLab升级失败恢复

GitLab是许多小团队必备的在线代码版本管理工具。GitLab官方提供了官方镜像gitlab/gitlab-ce来快速搭建一个GitLab。而第三方开发者sameersbn提供的sameersbn/gitlab则把GitLab解耦成三个不同的镜像:PostgreSql数据库、redis、GitLab主系统服务,并且提供更高程度的定制。配置中默认开启了每日自动备份,也极大的保证了数据安全。(要是没这个功能,这次我肯定要死了……)

sameersbn配置的docker-gitlab可以用docker-compose快速部署。

首先下载docker-compose.yml文件:

wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml

按需求修改完docker-compose.yml即可用docker-compose up -d部署。

前一阵子,GitLab升级到8.15,提供了不少新特性,于是我就想着把公司的GitLab v8.11升级一下。

虽然GitLab每天有自动备份,不过升级前很明智的把GitLab手动备份了一下。备份和恢复备份操作详解可以在https://github.com/sameersbn/docker-gitlab#creating-backups看到。使用docker-compose可以用以下命令备份:

docker-compose run --rm gitlab app:rake gitlab:backup:create

而在我升级的时候,却错把刚下载未修改配置的docker-compose.yml文件直接运行了,系统检查到了之前旧的GitLab开始了升级操作。而在我赶紧中止了操作,使用之前旧docker-compose.yml运行的时候,却提示我GitLab已经升级到8.15版本,无法降级(downgrade)到原来的8.11。

幸好之前做了备份,开始试着从备份恢复吧!

docker-compose run --rm gitlab app:rake gitlab:backup:restore

(理论上)执行这条恢复命令后,会让你选择恢复到哪一个版本。然而发现恢复命令无法生效,直接跳出了。

省去一系列踩坑的步骤,直接描述恢复办法:

应该是不同版本生成数据库不匹配造成的。所以我必须清空数据库,重新创建数据库再恢复。(如果只是清空而不创建的话,恢复会报找不到表的错误)

GitLab使用ruby开发,同时也使用ruby开发标配的rake做构建工具,虽然对ruby不太熟悉,不过还是知道其创建数据库的命令。所以可以参考一下sameersbn/docker-gitlab其他rake命令的调用方式,使用如下命令:

docker-compose run --rm gitlab app:rake db:drop db:create db:migrate

然后再恢复备份就没错了:

docker-compose run --rm gitlab app:rake gitlab:backup:restore

这个时候再把docker-compose.yml中gitlab镜像版本改为8.15,再一次运行。貌似因为不是第一次运行,所以不再做数据库迁移了,没关系,手动执行一下数据库迁移即可:

docker-compose run --rm gitlab app:rake db:migrate

如此,就顺利升级到最新版本的GitLab了!

Enjoy it!

2017-01-24 更新

今天我升级postgresql镜像,结果恢复的时候失败。

GitLab官方宣称是因为8.15更改了备份文件包名称的格式造成的。如果把备份包改成8.15版本的格式,就可以正确恢复。https://gitlab.com/gitlab-org/gitlab-ce/issues/26090

但是事实上我的版本正是8.15不存在这个问题。

最后从sameersbn/docker-gitlab的issues https://github.com/sameersbn/docker-gitlab/issues/1042 中发现办法:

在sameersbn/docker-gitlab的volumn位置/srv/docker/gitlab/gitlab下找到备份 文件夹backups,把backups里面的备份文件包除了你想恢复的版本,其它全部删除。然后执行以下命令即可回复。

docker exec -it gitlab sudo -HEu git bundle exec rake gitlab:backup:restore RAILS_ENV=production