gitlabgitlab 大版本升级级注意哪些问题

gitlab版本升级并docker化 - 简书
gitlab版本升级并docker化
写在前面:
这两天把公司的gitlab服务从老版本(7.12.0,源码版本)升级到了最新版(8.14.3,docker化版本)。过程中遇到不少坑,最后总算升级成功了。感觉光看官方文档很难升级成功,还需要研究gitlab的一些实现机制,所以特此把?过程总结记录下来,以便日后查阅。
首先这次为什么要docker化而不采用传统的升级方式,原因有两个:
第一,服务器上的老版本gitlab是通过源码安装的,光安装配置的教程就有整整一页,步骤很繁琐,也容易出错()。如果哪天要换服务器,真不想从头再重装一次了。使用docker后,只需迁移数据部分到新机器上,?再在新机器上了一键执行docker-compose命令,就可以完成gitlab的迁移工作。
第二,我查阅了官方文档,老版本升级到新版本,并没有给出一步到位的方法,而是要一个版本一个版本的升级()。看到这个列表瞬间放弃这种方式。
update.png
建议先升级到8.0.5,再升级到最新版,不然可能会遇到问题。所以我的升级流程是这样:源码v7.14 —& docker-gitlab v8.0.5 —& docker-gitlab 最新版(8.14.3)。
第一步,备份数据
由于老版本gitlab的目录的owner是git,需要切换到root,才有权限做备份。
[frank gitlab]$ sudo su - root
[root gitlab]$ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
gitlab会将数据备份成一个tar文件,存放在目录:/home/git/gitlab/tmp/backups/
第二步,将数据解压缩到backup目录
mkdir -p /mnt/docker/gitlab/backup
cd /mnt/docker/gitlab/backup
sudo tar xvf /home/git/gitlab/tmp/backups/_gitlab_backup.tar
会解压出如下几个目录文件:
db:存放数据库备份文件database.sql
repositories:存放每个git项目的仓库(repo)。每个repo被打包成为扩展名为bundle的文件,其实质上是个tar文件。
uploads:存放用户上传的图片等文件。
backup_information.yml:记录了backup相关信息,数据库,gitlab版本等。
如果使用gitlab提供的rake:backup:restore命令还原数据,是不可行的。原因比较多,首先在第一次启动gitlab时,会做db migrate,但此时数据库还没有导入备份的数据库数据呢。之后在做restore时,db的备份文件已无法导入到migrate过的数据库中了,会报错;另外repositories下git项目的存储格式从v7.14到v8.0也发生了变化,从.bundle变成了.git,运行restore的时候会提示文件格式错误。
既然知道了备份的各个文件的作用,那么就可以手动恢复。
第三步,新建并配置v8.0.5的docker-compose.yml文件
需要注意的一个问题是,上并没有8.0.5版本的tag,所以只能将的docker-compose.yml文件下载下来,再将文件内gitlab image的版本修改成8.0.5-1。 docker-compose.yml文件内配置了三个镜像:redis,postgresql,gitlab。
redis 需修改:
volumes: 挂载的磁盘目录,我的配置:/mnt/docker/gitlab/redis:/var/lib/redis
postgresql需修改:
volumes:挂载的磁盘目录,我的配置:
/mnt/docker/gitlab/postgresql:/var/lib/postgresql
DB_USER:数据库名称
DB_PASS:数据库密码
gitlab需修改:
volumes: 挂载的磁盘目录,我的配置:/mnt/docker/gitlab/gitlab:/home/git/data
image:修改成 sameersbn/gitlab:8.0.5-1
GITLAB_HOST:gitlab服务的ip地址或者域名,会显示在gitlab的web页面上。
GITLAB_PORT:gitlab服务的端口号,会显示在gitlab的web页面上。填空的话是默认值80。
GITLAB_EMAIL等:发邮件时的显示的一些信息。
SMTP_ENABLED等:如果设置成true,会启用smtp邮件服务器。我使用的是qq企业邮箱,具体配置如下:
- SMTP_ENABLED=true
- SMTP_DOMAIN=qq.com
- SMTP_HOST=smtp.exmail.qq.com
- SMTP_PORT=25
- SMTP_USER=
- SMTP_PASS=password
- SMTP_STARTTLS=true
- SMTP_AUTHENTICATION=plain
GITLAB_BACKUPS,GITLAB_BACKUP_TIME:备份周期和备份时间。如果觉得daily周期太短,可以改成weekly。
GITLAB_SECRETS_DB_KEY_BASE:64位密钥。
第四步,数据库恢复
将数据库备份文件放到postgresql可访问到的位置:
cp /mnt/docker/gitlab/backup/db/database.sql /mnt/docker/gitlab/postgresql
database.sql注释掉开头的两行:
vi /mnt/docker/gitlab/postgresql/database.sql
// 注释掉的语句
--CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_
--COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
启动postgresql服务。
在docker-compose.yml所在目录运行
docker-compose up postgresql
进入postgresql容器内:
docker exec -ti gitlab_postgresql_1 bash
运行pgsql恢复数据库
psql -U git -h 127.0.0.1 -d gitlabhq_production -f /var/lib/postgresql/database.sql
执行exit退出postgresql容器
至此,数据库恢复完毕。
第五步,将repositories目录下的bundle文件解压,放到以.git作为扩展名的目录下。
将repositories拷贝到gitlab挂载的数据目录下。
mkdir /mnt/docker/gitlab/gitlab
cp -R backup/repositories /mnt/docker/gitlab/gitlab/
写了个简单的脚本用来做bundle to .git的转化:
if [ -d $1 ]; then
echo "begin to change .bundle to .git ..."
echo "$1 must be a dir"
function walk() {
echo "file path: $1"
for file in `ls $1`
file=$1/$file
echo $file
if test -d $ then
walk ${file}
if test -f $file && [ ${file##*.} = "bundle" ]; then
gitFile=${file%.*}".git"
echo gitFile: $gitFile
if [ ! -d $gitFile ]; then
echo "begin to unpack bundle file: $file"
echo "make dir: ${gitFile}"
mkdir -p $gitFile
tar xvf $file -C $gitFile/
echo "unpack bundle file: $file success!"
rm -rf $file
echo "bundle file removed"
在repositories目录下执行该脚本。
cd /mnt/docker/gitlab/gitlab/repositories
sh bundle-to-git.sh
第六步,拷贝uploads到gitlab数据目录下
cp -R backup/uploads /mnt/docker/gitlab/gitlab/
第七步,运行gitlab容器
docker-compose up (-d)
第八步,在浏览器中登录gitlab,检查是否一切ok。
点击项目,进入详情页,如果出现“No repository”的提示,很可能是repositories目录下的owner和gitlab的不匹配。
no-repo.png
运行命令,将owner赋给gitlab的owner:
chown -R user:user repositories
如果依然有此提示,需要清除一下缓存:
docker exec -ti gitlab bash
bundle exec rake cache:clear RAILS_ENV=production
另外,你会发现,项目概述中显示的commit数量都为0,这显然不正确。
commit-0.png
修改方法是运行更新commit数的命令:
docker exec -ti gitlab bash
bundle exec rake gitlab:update_commit_count RAILS_ENV=production
第九步,升级gitlab到最新版本(本文为8.14.3)
关闭gitlab v8.0.5容器
docker-compose stop
将的docker-compose.yml模板文件下载下来,参考本文第三步进行配置。
这里多了两个需要配置的字段:GITLAB_SECRETS_SECRET_KEY_BASE和GITLAB_SECRETS_OTP_KEY_BASE, 值都必须是64位长度的字符串。
启动gitlab v8.14.3
docker-compose up
其他问题:
如果之前使用ssh的方式连接git服务,更新后发现连接不上了,需要修改本地git的remote repo地址。这是因为docker的宿主机上ssh服务一般都用的22端口,所以gitlab的ssh配置在了非22的端口上(在docker-compose.yml的GITLAB_SSH_PORT配置),那么ssh的地址会多出来了“ssh://”和端口号“:10022”。如图所示:
如果想跟原来的ssh地址保持一致,除了修改docker-compose.yml的ssh端口号为22外(ports:"22:22",GITLAB_SSH_PORT不配置);还需要修改宿主机服务器端的ssh服务的端口号,使用22以外的端口。
使用ssh的方式拉取代码,可能出现权限问题,需要在profile里将原来的ssh-key删除再重新添加一次。
Cloning into 'mytest'...
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
最后, 本文用到脚本和配置文件在上可以获取。
在v8.14.3版本上发现一个严重bug,如果我是一个项目的“owner”, 往master分支git push会报错~
Franklin$ git push
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (9/9), 4.34 KiB | 0 bytes/s, done.
Total 9 (delta 1), reused 0 (delta 0)
remote: GitLab: You are not allowed to force push code to a protected branch on this project.
To http://your.gitlab.com/proj.git
! [remote rejected] master -& master (pre-receive hook declined)
error: failed to push some refs to 'http://your.gitlab.com/proj.git'
查了一下,原因是docker-gitlab v8.14.0之后的版本,git版本升级到了2.11,而gitlab对此git版本上的git push的处理存在一些问题。参见: 和 。目前此问题尚未解决,所以暂时的解决方法是把项目设置 protected branch中的master的规则去掉。
remove-master.png
上面的bug已经在8.15.1以上的版本解决掉了。撒花~
前言 前段时间的工作中有接触到接口测试,测试代码以maven工程的形式编写,使用testNG测试框架。工作中,每次执行测试都是在IDE里手动执行测试代码,很是麻烦,再考虑到后期的回归测试需要,所以产生了把该接口测试自动化的想法。最初的做法是将测试数据保存在excel中,测试...
GIT分布式版本控制系统最佳实践 这篇文章来自于老男孩教育高级架构师班12期的徐亮偉同学。 首先感谢老男孩架构师班赵班长深入讲解Git,综合自己实践整理而来,特此在今天分享给大家。 Git诞生历史 我想大家还记得Linus torvalds在1991年时发布了Linux操作...
自日开启内测以来,灵雀云团队持续快速迭代,一方面不断打磨平台品质,提升用户体验,另一方面相继推出多款新服务上线。日,“灵雀云”容器云平台(Container-as-a-Service)正式发布。发布会上,灵雀云同时推出五款全新服务,继而完成...
一、系统环境 服务器:阿里云主机 操作系统:Centos7.0 64位 已装软件:Nginx(80端口)、Apache(8080端口)、PHP-FPM(9000端口) 二、安装版本 GitLab分为社区版(GitLab Community Edition)和企业版(GitL...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
做年度目标是从2016年元旦开始的,那时用思维导图做了2016年的年度目标,可是一年结束的时候,回顾却发现没能达成。现在回顾起来,还发现自己也曾经做过月目标,周目标和日计划,这些都被无法落地而流产了。所以自己一直生活在盲目中,感觉生活总是那么混乱,怎么理都无法理清楚。后来接...
中秋节放假的时候我刷了最近大热的韩国电影《釜山行》,刷完又看了它的前传《首尔站》(讲真节奏慢到着急,不建议看了)。 很多人都在刷弹幕表达着自己的观点,觉得谁好谁坏,谁应该如何如何做。但其实,没有到那个情境下,不是我们自己真的去面对,我们很难去判断每个人的所作所为。《釜山行》...
前不久,看奇葩说,一个原来就注意到却没了解过的小男孩触动了我的心弦,他叫陈咏开。 节目里,这个小男孩坚强的诉说着他有抑郁症的故事。不知怎么了,我没有哭,但心却像是被什么东西撞击了一下,很痛。 那一刻我才意识到,原来这么一个口若悬河,聪明智慧的男孩,也会患上一种叫抑郁症的病。...
他叫陌路,是我的第一个男人,也是目前为止唯一一个。尽管,我们已经不在一起,可我依然忘不了他。 我和他相识,完全是因为工作关系。 那天单位组织了一场活动,邀请了几个合作单位的负责人,他就是其中之一。 我对酒精过敏,所以,那场party上,我滴酒未沾,只是跟几个女同事一起在角落...
1 世上的爱情,两情相悦的少,一厢情愿的多。明知心上人不爱自己,明知在一起的可能性几乎为零,却还要为TA死去活来无怨无悔,这种人,我们称之为“备胎”。 金庸是写爱情的高手,写过的错位爱情多不胜数,由此产生了一个庞大的备胎群。 虽然金庸的武侠世界是以男性为主导,女备胎自然比男...Linux系统技术交流QQ群(915246)验证问题答案:刘遄
几乎任何应用系统都规避不开的三个问题:备份、恢复和升级。相对而言来说,gitlab-ce虽然是一个开源免费产品,但在这三方面做的还是比较人性化的。下面逐个介绍。
一、数据备份
先打开/etc/gitlab/gitlab.rb配置文件,查看一个和备份相关的配置项:
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
该项定义了默认备份出文件的路径,可以通过修改该配置,并执行gitlab-ctl restart 重启服务生效。备份执行一条命令就搞定:/opt/gitlab/bin/gitlab-rake gitlab:backup:create ,也可以加到crontab中定时执行:
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
可以到/var/opt/gitlab/backups找到备份包,解压查看,会发现备份的还是比较全面的,数据库、repositories、build、upload等分类还是比较清晰的。
每天执行备份,肯定有目录被爆满的风险,我们可以立马想到的可以通过find 查找一定的时间前的文件,配合rm进行删除。不过不需要这么麻烦,gitlab-ce自身集成的有自动删除配置。同样打开/etc/gitlab/gitlab.rb配置文件,可以找到如下配置:
gitlab_rails['backup_keep_time'] = 604800
这里是设置备份保留7天(7*800),秒为单位,如果想增大或减小,可以直接在该处配置,并通过gitlab-ctl restart 重启服务生效。
二、数据恢复
恢复前需要先停掉数据连接服务:
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
如果是台空主机,没有任何操作,理论上不停这两个服务也可以。停这两个服务是为了保证数据一致性。如果你没修改过默认备份目录的话,将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups,执行下面的命令进行恢复:
gitlab-rake gitlab:backup:restore BACKUP=备份编号
上个图,看的更直观:
上面的操作中,有两个注意点:
1、到底那个是备份编号?
--- _gitlab之前的部分都是;
2、600权限是无权恢复的。 --- 这里改成了777;
后面再输入两次yes就完成恢复了。
恢复完成后,启动刚刚的两个服务,或者重启所有服务,再打开浏览器进行访问,发现数据和之前的一致:
gitlab-ctl start unicorn
gitlab-ctl start sidekiq
gitlab-ctl restart
还有一点要别注注意,根据以往的经验,通过备份文件恢复gitlab必须保证两台主机的gitlab版本一致,否则会提示版本不匹配。
三、gitlab-ce升级
升级比较简单,但最好不要跨越太大的版本,版本差别比较大时,最好逐个版本往上升。
# 关闭gitlab服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
gitlab-ctl stop nginx
# 备份gitlab
gitlab-rake gitlab:backup:create
# 升级rpm包
rpm -Uvh gitlab-ce-xxx.rpm
# 启动并查看gitlab版本信息
gitlab-ctl reconfigure
gitlab-ctl restart
head -1 /opt/gitlab/version-manifest.txt
可能遇到的报错,
Error executing action `run` on resource 'ruby_block[directory resource: /var/opt/gitlab/git-data/repositories]'
sudo chmod 2770 /var/opt/gitlab/git-data/repositories
原文来自:
本文地址:编辑:张雄,审核员:暂无
为您推荐一些与本文相关的文章:
Linux系统镜像及所需软件工具包下载地址:
进阶课程目录
第24章 使用Xen与Kvm部署虚拟化服务环境。(即将公布)
Linux技术交流QQ群
向每个正在奋斗的Linuxer致敬.
Linux技术交流群A:560843
Linux技术交流群B:340829
Linux技术交流群C:463590
Linux技术交流群D:915246
Linux技术交流群E:1663106
Linux技术交流群F:1653851
Linux技术交流群G:2632018
Linux技术交流群H:2636170
Linux技术交流群I:2650582
Linux技术交流群J:3026356
Linux技术交流群K:2659793
Linux技术交流群L:2659106
全国Linux技术交流群(总):
8月0 篇文章9月0 篇文章10月0 篇文章11月0 篇文章12月0 篇文章
1月0 篇文章12月0 篇文章处理Gitlab升级时的错误 – tlanyan
Recent PostsPages
Theme | Powered by怎么在gitlab的项目更新到自己的本地工具上? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。3被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答添加评论分享收藏感谢收起4添加评论分享收藏感谢收起写回答

我要回帖

更多关于 gitlab 回退版本 的文章

 

随机推荐