升级场景
由于公司要通过gitlab接入ci和cd功能,经测试一个repo不能正常使用,且gitlab9.5之后增加了很多新功能,比较吸引我们
-
GPG Commit Verification: GPG密钥允许您验证签名提交
-
New Navigation Improvements: 界面窗口有所改进,更便捷和美观,可以在老界面和新界面自由切换
-
Project Template: 新增了更多的项目模板
-
Automatic Retry for Failed CI Jobs:自动重试失败的ci job
-
Automatically Monitor Auto Deployed Apps:自动监控自动部署应用程序
- Merge Request Diff File Navigation:查看merge request时更清晰
更多的特性请查阅:https://about.gitlab.com/2017/08/22/gitlab-9-5-released/
考虑的点及问题
-
1.postgresql版本问题: 由于我们公司使用的是外部的postgresql和redis,postgresql的版本为9.3,而gitlab9.5.9依赖postgresql 9.6以上的版本,所以在升级gitlab的时候他会升级数据库,但是我们是外部的(AWS RDS),所以他并不能升级,会抛出异常。
-
2.postgresql的表结构问题:在升级期间,由于版本变化比较大,所以会涉及表结构及表字段的更改,如果使用外部的postgresql,可能会导致不成功
- 3.gitlab有可能升级失败,失败后必须理解还原,且不影响线上数据
解决方案
根据上述问题,新启动一台实例,首先保持和线上的版本相同,其次将线上的数据还原到这台实例,然后在将新启动的实例进行升级,不过在这其中有几个点必须注意:
-
1.新启动的实例必须使用本地的postgresql和redis
-
2.必须将线上的postgresql的数据还原到当前实例的postgresql
-
3.当前实例上面的psql和pg_dump工具必须和线上版本保持一致(AWS RDS POSTGRESQL)
-
4.在测试期间,绝对不能和线上使用同一个redis,必须保持redis只有一个connect
- 5.在gitlab还原数据的时候,其必须在running状态
实施步骤
一、新实例安装线上同版本gitlab
$ curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
$ sudo yum install gitlab-ce-8.15.1-ce.0.el7.x86_64 -y
二、初始化新实例的gitlab
修改配置文件,修改external_url
$ sudo vim /etc/gitlab/gitlab.rb
external_url 'http://git.test.com'
$ sudo gitlab-ctl reconfigure
# 成功后,通过域名映射来访问(注意,这里如果没有增加dns记录,需要添加hosts)
三、还原postgresql
和git-data
,与线上保持一致
还原postgresql
1.清除当前实例pgsql的数据
$ gitlab-psql -h /var/opt/gitlab/postgresql -d template1
template1=> DROP DATABASE gitlabhq_production;
DROP
template1=> CREATE DATABASE gitlabhq_production WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';
CREATE
template1=> ALTER DATABASE gitlabhq_production OWNER TO gitlab;
ALTER
2.还原线上数据
$ pg_dump -U gitlab -h HOST -p 5432 gitlabhq_production > gitlabhq_production.sql
$ gitlab-psql -h /var/opt/gitlab/postgresql -d gitlabhq_production < gitlabhq_production.sql
还原Gitlab data
1.首先下载备份文件,我这里保存在s3上面,所以从s3直接下载,如果没有
可以执行下面的命令先进行备份,如果有请忽略
$ sudo gitlab-rake gitlab:backup:create SKIP=db # // 如果有备份不需要执行 //
$ aws s3 cp s3://git-bak/1505322888_2017_10_27_gitlab_backup.tar .
$ cp 1505322888_2017_10_27_gitlab_backup.tar /var/opt/gitlab/backups/
2.进行还原
$ sudo gitlab-rake gitlab:backup:restore SKIP=db BACKUP=1505322888_2017_09_14_gitlab_backup.tar
3.重新配置并访问查看
$ sudo gitlab-ctl reconfigure
四、对当前实例Gitlab进行升级
1.通过yum升级
sudo yum install gitlab-ce-9.5.9-ce.0.el7.x86_64 -y
2.访问正常后,将当前实例的数据导出
sudo -u gitlab-psql pg_dump -h /var/opt/gitlab/postgresql -U gitlab-psql gitlabhq_production > /tmp/gitlab.sql
3.导入到线上的新postgresql(AWS RDS 9.6+)
psql -U gitlab -h HOST -p 5432 -d gitlabhq_production < gitlabhq_production.sql
4.修改gitlab配置,配置pgsql及nginx等
注意,修改后为https,需要增加证书。禁用默认的pgsql及prometheus等(如果需要可以开启)
$ sudo vim /etc/gitlab/gitlab.rb
external_url 'https://git.test.com'
nginx['redirect_http_to_https'] = true
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "xxx.xxx.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "xxx"
gitlab_rails['smtp_password'] = "xxx"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = 'HOST'
gitlab_rails['db_port'] = '5432'
gitlab_rails['db_username'] = 'gitlab'
gitlab_rails['db_password'] = 'xxxxxx'
postgresql['enable'] = false
redis['enable'] = false
gitlab_rails['redis_host'] = 'xxxx.qm7fjs.ng.0001.cnn1.cache.amazonaws.com.cn'
gitlab_rails['redis_port'] = 6379
nginx['enable'] = true
nginx['ssl_certificate'] = '/etc/gitlab/ssl/xxx.com.chain.crt'
nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/xxx.com.key'
node_exporter['enable'] = false
prometheus_monitoring['enable'] = false
5.重新配置gitlab
$ gitlab-ctl reconfigure
6.重新访问,并确认成功