项目案例之GitLab的数据迁移

链接:https://pan.baidu.com/s/1CgaEv12cwfbs5RxcNpxdAg

提取码:fytm

复制这段内容后打开百度网盘手机App,操作更方便哦

5.项目案例一:生产环境SVN数据迁移到测试环境GitLab

主机名 IP地址 备份 特殊要求
Git01 192.168.200.52 Git客户端
Git02 192.168.200.53 GitLab服务器01 内存2G
SVN 192.168.200.57 SVN服务器

5.1 案例背景

公司近期对于"版本管理工具是否进行切换SVN-->Git"的问题进行了讨论,于是对svn和git进行了相关研究,进而梳理出了Git的特点(优,缺点),最后将Git与SVN进行了对比,对比结果详细见下方内容。

5.2 部署SVN服务器

[root@SVN ~]# yum -y install subversion
[root@SVN ~]# rpm -qa subversion
subversion-1.7.14-14.el7.x86_64 [root@SVN ~]# mkdir -p /application/svndata/yunjisuan
[root@SVN ~]# mkdir -p /application/svnpasswd
[root@SVN ~]# tree /application
/application
├── svndata
│   └── yunjisuan
└── svnpasswd 3 directories, 0 files
#创建yunjisuan项目主分支,开发分支,测试分子
[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/master
[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/dev
[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/test [root@SVN ~]# cd /application/svndata/yunjisuan/master/conf/
[root@SVN conf]# ls
authz passwd svnserve.conf
[root@SVN conf]# cp svnserve.conf{,.bak}
[root@SVN conf]# sed -n '19p;20p;27p;34p' svnserve.conf
anon-access = none
auth-access = write
password-db = /application/svnpasswd/passwd
authz-db = /application/svnpasswd/authz
#将配置文件覆盖另外两个分支
[root@SVN conf]# /bin/cp svnserve.conf /application/svndata/yunjisuan/dev/conf/
[root@SVN conf]# /bin/cp svnserve.conf /application/svndata/yunjisuan/test/conf/
[root@SVN conf]# cp /application/svndata/yunjisuan/master/conf/authz /application/svnpasswd/
[root@SVN conf]# cp /application/svndata/yunjisuan/master/conf/passwd /application/svnpasswd/
[root@SVN conf]# cd /application/svnpasswd/
[root@SVN svnpasswd]# ls
authz passwd [root@SVN svnpasswd]# vim passwd
[root@SVN svnpasswd]# tail -4 passwd
yunjisuan = 123123
benet = 123123
stu001 = 123
stu002 = 456 [root@SVN svnpasswd]# vim authz
[root@SVN svnpasswd]# egrep -v "#|^$" authz
[aliases]
[groups]
testgroup = stu001,stu002
[yunjisuan/master:/] #master主分支代码提交者---开发经理
yunjisuan = rw
benet = r [yunjisuan/dev:/]
benet = rw #dev开发分支代码提交者---普通程序员
yunjisuan = r #dev开发分支代码下载者---开发经理 [yunjisuan/test:/]
@testgroup = r #test测试分支代码下载者----测试人员
yunjisuan = rw #test测试分支代码提交者---开发经理 [root@SVN svnpasswd]# svnserve -d -r /application/svndata/
[root@SVN svnpasswd]# ps -ef | grep svn
root 10649 1 0 09:08 ? 00:00:00 svnserve -d -r /application/svndata/
root 10651 10566 0 09:08 pts/0 00:00:00 grep --color=auto svn

在宿主机创建三个svn目录checkout代码,如下图



随便在三个目录上传点代码文件

5.3 利用git-svn克隆svn代码

特别提示: Yum安装的git没有git-svn功能,要源码安装最新版本

#在Git01上操作
#安装git-svn支持程序(没有这两个包git-svn报错)
[root@Git01 ~]# yum -y install subversion-perl perl-Digest-MD5
[root@Git01 ~]# rpm -qa subversion-perl perl-Digest-MD5
subversion-perl-1.7.14-14.el7.x86_64
perl-Digest-MD5-2.52-3.el7.x86_64 #创建Git工作目录并克隆SVN分支代码到本地
[root@Git01 ~]# mkdir -p /backup
[root@Git01 ~]# cd /backup #将SVN服务器master分支代码克隆到本地Git工作目录
[root@Git01 backup]# git svn clone --no-metadata svn://192.168.200.57/yunjisuan/master/ /backup/master/
初始化空的 Git 仓库于 /backup/master/.git/
Authentication realm: <svn://192.168.200.57:3690> 123e5da4-f346-4cb1-af1c-8511a1b9d2ce
Password for 'root': 111111 #输入root登陆密码
Authentication realm: <svn://192.168.200.57:3690> 123e5da4-f346-4cb1-af1c-8511a1b9d2ce
Username: yunjisuan #输入svn的master分支的授权账户名
Password for 'yunjisuan': 123123 #输入svn的master分支的授权账户密码
A master测试文件.txt
r1 = c45d2c0a60369c2703f6791f74c88cafe127ae1b (refs/remotes/git-svn)
Checked out HEAD:
svn://192.168.200.57/yunjisuan/master r1
[root@Git01 backup]# ls
master
[root@Git01 backup]# cd master/
[root@Git01 master]# ls
master测试文件.txt
[root@Git01 master]# cat master测试文件.txt
welcome to yunjisuan
#将SVN服务器dev分支代码克隆到本地Git工作目录
[root@Git01 master]# git svn clone --no-metadata svn://192.168.200.57/yunjisuan/dev/ /backup/dev/
初始化空的 Git 仓库于 /backup/dev/.git/
Authentication realm: <svn://192.168.200.57:3690> 6ab3b7d8-6315-4c00-bca9-b53840a155ae
Password for 'root': 111111 #输入root登陆密码
Authentication realm: <svn://192.168.200.57:3690> 6ab3b7d8-6315-4c00-bca9-b53840a155ae
Username: benet #输入svn的dev分支的授权账户名
Password for 'benet': 123123 #输入svn的dev分支的授权账户密码
A dev测试文件 .txt
r1 = 1d061e53f74e53a6a2170138e7446328b38b8159 (refs/remotes/git-svn)
Checked out HEAD:
svn://192.168.200.57/yunjisuan/dev r1
[root@Git01 backup]# ls
dev master
[root@Git01 backup]# cd dev/
[root@Git01 dev]# ls
dev测试文件 .txt
[root@Git01 dev]# cat dev测试文件\ .txt
welcome to yunjisuan
#将SVN服务器test分支代码克隆到本地Git工作目录
[root@Git01 backup]# git svn clone --no-metadata svn://192.168.200.57/yunjisuan/test/ /backup/test/
初始化空的 Git 仓库于 /backup/test/.git/
Authentication realm: <svn://192.168.200.57:3690> afe84583-3f5a-405b-a345-34e530f9c9e3
Password for 'root': 111111 #输入root登陆密码
Authentication realm: <svn://192.168.200.57:3690> afe84583-3f5a-405b-a345-34e530f9c9e3
Username: yunjisuan #输入svn的test分支的授权账户名
Password for 'yunjisuan': 123123 #输入svn的test分支的授权账户密码
A test测试文件 .txt
r1 = 3b6d1e30144fbc8989191bebf7c74042c8939132 (refs/remotes/git-svn)
Checked out HEAD:
svn://192.168.200.57/yunjisuan/test r1
[root@Git01 backup]# ls
dev master test
[root@Git01 backup]# cd test/
[root@Git01 test]# ls
test测试文件 .txt
[root@Git01 test]# cat test测试文件\ .txt
welcome to yunjisuan
[root@Git01 backup]# ls
dev master test
[root@Git01 backup]# tree
.
├── dev
│   └── dev\346\265\213\350\257\225\346\226\207\344\273\266\ .txt
├── master
│   └── master\346\265\213\350\257\225\346\226\207\344\273\266.txt
└── test
└── test\346\265\213\350\257\225\346\226\207\344\273\266\ .txt 3 directories, 3 files

在GitLab上创建一个组,在组里添加3个成员(主程序员,开发者,报告者)

GitLab默认情况下,master分支是受到保护的(只能主程序员推送和合并)

  • 主程序员=产品经理:推送和合并受保护分支
  • 开发者=开发人员:推送不受保护分支
  • 报告者=测试人员:只能clone代码

    在GitLab这个组里创建一个项目叫做Demo

    通过主程序员账号将从SVN克隆下来的master分支,dev分支,test分支的代码推送到Demo项目里。分支名称不变

[root@Git01 backup]# ls
dev master test
[root@Git01 backup]# cd master/
[root@Git01 master]# ls
master测试文件.txt
[root@Git01 master]# git remote add origin http://192.168.200.53:8888/test/demo.git
#将master目录代码推送到GitLab仓库的Demo项目里
[root@Git01 master]# git push -u origin master
Username for 'http://192.168.200.53:8888': root
Password for 'http://root@192.168.200.53:8888':
对象计数中: 3, 完成.
Delta compression using up to 2 threads.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 253 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.200.53:8888/test/demo.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
#将dev目录代码推送到GitLab仓库的Demo项目里
[root@Git01 master]# cd /backup/dev
[root@Git01 dev]# git remote add origin http://192.168.200.53:8888/test/demo.git [root@Git01 dev]# git branch
* master
[root@Git01 dev]# git branch dev
[root@Git01 dev]# git checkout dev
切换到分支 'dev'
[root@Git01 dev]# git branch
* dev
master
[root@Git01 dev]# ls
dev测试文件 .txt
[root@Git01 dev]# git add *
[root@Git01 dev]# git commit -m "开发分支代码提交"
位于分支 dev
nothing to commit, working tree clean [root@Git01 dev]# git push -u origin dev
Username for 'http://192.168.200.53:8888': root
Password for 'http://root@192.168.200.53:8888':
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 244 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.200.53:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To http://192.168.200.53:8888/test/demo.git
* [new branch] dev -> dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
#将test目录代码推送到GitLab仓库的Demo项目里
[root@Git01 dev]# cd /backup/test/
[root@Git01 test]# git remote add origin http://192.168.200.53:8888/test/demo.git [root@Git01 test]# git branch
* master
[root@Git01 test]# git branch test
[root@Git01 test]# git checkout test
切换到分支 'test'
[root@Git01 test]# git branch
master
* test
[root@Git01 test]# git add *
nothing to commit, working tree clean
[root@Git01 test]# git config --global user.email "1773464408@qq.com"
[root@Git01 test]# git config --global user.name "Mr.yang"
[root@Git01 test]# git commit -m "测试分支代码提交"
位于分支 test
nothing to commit, working tree clean [root@Git01 test]# git push -u origin test
Username for 'http://192.168.200.53:8888': root
Password for 'http://root@192.168.200.53:8888':
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 252 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for test, visit:
remote: http://192.168.200.53:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=test
remote:
To http://192.168.200.53:8888/test/demo.git
* [new branch] test -> test
分支 test 设置为跟踪来自 origin 的远程分支 test。

6.项目案例二:测试环境GitLab数据迁移到生产环境GitLab

6.1 案例背景

前段时间,在某台CentOS服务器上搭建了GitLab环境,并且其他开发组的同仁都陆陆续续把代码从svn迁移到了GitLab,但是之前的CentOS服务器并不是搭建在公司的机房环境,而是搭建在办公室的某台闲置的电脑上,因此为了保证数据安全性,领导要求将之前的GitLab数据全部重新迁移到公司机房的服务器上去。

主机名 IP地址 备份 特殊要求
Git01 192.168.200.52 GitLab服务器01 内存2G
Git02 192.168.200.53 GitLab服务器02 内存2G

6.2 GitLab的数据备份

6.2.1 创建备份文件

首先,我们得把老服务器上的Gitlab整体备份,使用Gitlab一键安装包安装Gitlab非常简单,同样的备份恢复与迁移也非常简单。使用一条命令即可创建完整的Gitlab备份。

gitlab-rake gitlab:backup:create

使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1537115457_2018_09_17_11.2.3_gitlab_backup.tar的压缩包,这个压缩包就是Gitlab整个的完整部分,其中开头1537115457_2018_09_17\是备份创建的日期,11.2.3是Gitlab的版本号


  • /etc/gitlab/gitlab.rb配置文件需要备份
  • /var/opt/gitlab/nginx/conf nginx配置文件
  • /etc/postfix/main.cf postfix 邮件配置备份
[root@Git02 ~]# cd /var/opt/gitlab/backups
[root@Git02 backups]# ls #执行命令生成备份压缩包
[root@Git02 backups]# gitlab-rake gitlab:backup:create
#以下省略。。。 #查看备份包
[root@Git02 backups]# ls
1540035121_2018_10_20_11.2.3_gitlab_backup.tar
[root@Git02 backups]# ll
总用量 92
-rw------- 1 git git 92160 10月 20 19:32 1540035121_2018_10_20_11.2.3_gitlab_backup.tar

6.2.2 更改Gitlab备份目录

GitLab配置文件路径:/etc/gitlab/gitlab.rb

[root@Git02 ~]# mkdir -p /backup
#修改如下配置文件
[root@Git02 backup]# vim /etc/gitlab/gitlab.rb
[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '299p'
299 gitlab_rails['backup_path'] = "/backup" #重载GitLab配置文件
[root@Git02 ~]# gitlab-ctl reconfigure #再次进行备份尝试
[root@Git02 ~]# cd /backup/
[root@Git02 backup]# ls
[root@Git02 backup]# gitlab-rake gitlab:backup:create
#以下省略。。。
[root@Git02 backup]# ls
1540036570_2018_10_20_11.2.3_gitlab_backup.tar

6.2.3 GitLab的自动备份

将命令写成定时任务,每天凌晨两点执行一次备份操作

6.2.4 设置备份过期时间

设置只保存最近7天的备份,编辑/etc/gitlab/gitlab.rb配置文件,找到如下配置并修改

[root@Git02 backup]# vim /etc/gitlab/gitlab.rb
[root@Git02 backup]# cat -n /etc/gitlab/gitlab.rb | sed -n '307p'
307 gitlab_rails['backup_keep_time'] = 604800
[root@Git02 backup]# gitlab-ctl reconfigure

6.3 copy老服务器上面的备份文件到新服务器

6.3.1 确保新GitLab服务器和老GitLab服务器版本相同

在G01上和G02上都部署同版本的GitLab服务器

6.3.2 copy老服务器上面的备份文件到新服务器

[root@Git02 backup]# cd /backup/
[root@Git02 backup]# ls
1540036570_2018_10_20_11.2.3_gitlab_backup.tar [root@Git02 backup]# scp 1540036570_2018_10_20_11.2.3_gitlab_backup.tar root@192.168.200.52:/root/
root@192.168.200.52's password: 111111
1540036570_2018_10_20_11.2.3_gitlab_backup.tar 100% 90KB 1.0MB/s 00:00

6.4 从备份数据中恢复GitLab

6.4.1 将备份文件权限修改为777

第一步:将备份文件权限修改为777,不然可能恢复的时候会出现权限不够,不能解压的问题。

#将拷贝过来的备份文件移动到新GitLab的备份目录下
[root@Git01 ~]# mv 1540036570_2018_10_20_11.2.3_gitlab_backup.tar /var/opt/gitlab/backups/
[root@Git01 ~]# cd /var/opt/gitlab/backups/
[root@Git01 backups]# ls
1540036570_2018_10_20_11.2.3_gitlab_backup.tar #给备份文件增加777权限
[root@Git01 backups]# chmod 777 1540036570_2018_10_20_11.2.3_gitlab_backup.tar
[root@Git01 backups]# ll 1540036570_2018_10_20_11.2.3_gitlab_backup.tar
-rwxrwxrwx 1 root root 92160 10月 20 20:03 1540036570_2018_10_20_11.2.3_gitlab_backup.tar

6.4.2 执行命令停止相关数据连接服务

第二步:执行命令停止相关数据连接服务

#停止相关数据连接服务
[root@Git01 ~]# gitlab-ctl stop unicorn
ok: down: unicorn: 3s, normally up [root@Git01 ~]# gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up

6.4.3 执行命令从备份文件中恢复GitLab

第三步:执行命令从备份文件中恢复GitLab

gitlab-rake gitlab:backup:restore BACKUP=备份文件编号

#执行命令恢复数据
[root@Git01 ~]# gitlab-rake gitlab:backup:restore BACKUP=1540036570_2018_10_20_11.2.3 说明:恢复过程中出现两个(yes/no),输入两个yes即可
6.4.4 重新启动GitLab

第四步:启动GitLab

[root@Git01 ~]# gitlab-ctl start
ok: run: alertmanager: (pid 2758) 9649s
ok: run: gitaly: (pid 1129) 10493s
ok: run: gitlab-monitor: (pid 1144) 10489s
ok: run: gitlab-workhorse: (pid 1122) 10495s
ok: run: logrotate: (pid 10709) 3252s
ok: run: nginx: (pid 1124) 10495s
ok: run: node-exporter: (pid 1138) 10492s
ok: run: postgres-exporter: (pid 1143) 10489s
ok: run: postgresql: (pid 1113) 10496s
ok: run: prometheus: (pid 1151) 10487s
ok: run: redis: (pid 1108) 10496s
ok: run: redis-exporter: (pid 1160) 10479s
ok: run: sidekiq: (pid 13190) 1s
ok: run: unicorn: (pid 13197) 0s

6.4.5 进行Web访问检查

最终我们发现,两台GitLab除了IP和端口不同外,项目内容完全一致

项目案例之GitLab的数据迁移的更多相关文章

  1. KingbaseES V8R6集群维护案例之--单实例数据迁移到集群案例

    案例说明: 生产环境是单实例,测试环境是集群,现需要将生产环境的数据迁移到集群中运行,本文档详细介绍了从单实例环境恢复数据到集群环境的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingb ...

  2. 如何在PHP项目中使用phinx进行数据迁移和建表

    建表 phinx\bin\phinx.bat migrate -e production 建设 phinx.yml文件 paths: migrations: %%PHINX_CONFIG_DIR%%\ ...

  3. Django项目与mysql交互进行数据迁移时报错:AttributeError: 'str' object has no attribute 'decode'

    问题描述 Django项目启动,当我们执行命令 python manage.py makemigrations 出现如下错误: File , in last_executed_query query ...

  4. vs2015 mvc项目数据迁移报错

    第一次做个mvc项目玩玩,然后需要数据迁移,也没做过,就百度找怎么数据迁移, 找到的方法是: 如果数据是在类库项目里就在‘程序包管理控制台’输入:enable-migrations -ContextT ...

  5. EF 中 Code First 的数据迁移以及创建视图

    写在前面: EF 中 Code First 的数据迁移网上有很多资料,我这份并没什么特别.Code First 创建视图网上也有很多资料,但好像很麻烦,而且亲测好像是无效的方法(可能是我太笨,没搞成功 ...

  6. ASP.NET 5探险(1):Azure中配置连接字符串、独立项目执行EF7数据迁移

    (此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注.) 题记:我开始把ASP.NET 5用于生产系统开发已经有1个多月了,也填了一些坑积累了一些经验,从今天开始会陆陆续 ...

  7. gitlab 存储仓库目录设置及数据迁移

    注:一开始没有考虑到把gitlab划分好存储目录,占用系统磁盘,由于gitlab是默认安装的,随着公司代码越来越多,导致gitlab数据目录空间不足 磁盘空间: [root@gitlab ~]# df ...

  8. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  9. gitlab数据迁移

    由于gitlab是默认安装的,随着公司代码越来越多,导致gitlab数据目录空间不足,出现无法访问gitlab了. 磁盘空间: /home有1.8T的空间一直没用上! 现在打算将原有代码目录迁移到新目 ...

随机推荐

  1. linux100day(day6)--shell脚本简单逻辑

    if语句: if条件语句的使用格式: 1.单分支语句 if 条件;then 执行语句 fi 2.双分支语句 if 条件;then 执行语句1 else 执行语句2 fi 3.多分支语句 if 条件;t ...

  2. Oracle之分页问题

    前面的Top-N问题使用了reownum,但是又遇到个分页问题,将表emp的4行为1页输出,前4行很好做: select rownum,empno,ename,sal from emp ; 但是4-- ...

  3. 创建者模式-Builder

    创建者模式使用多个简单的对象一步一步构建成一个复杂的对象.它提供了一种创建对象的最佳方式.一个 Builder 类会一步一步构造最终的对象,该 Builder 类是独立于其他对象的. 一.类图 创建者 ...

  4. 启动ABP项目

    1.在官网下载ABP项目 2.打开项目选择解决方案,右击还原NuGet包 3.修改appsettings.json中的ConnectionStrings 例子"ConnectionStrin ...

  5. jquery 选项卡切换 带背景图片

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  6. js手机端图片弹出方法

    1 $("img").click(function(){ //获取窗口可视大小 var width=$(window).width(); var height=$(window). ...

  7. get和post 两种基本请求方式的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  8. vue-cli脚手架快速搭建项目

    前言 vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. 准备工作 在搭建一个vue项目之前,需要先安装好node.js和cnpm. 虽然np ...

  9. HTTP 错误 500.21 - Internal Server Error处理程序“NickLeeCallbackHandler”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    HTTP 错误 500.21 - Internal Server Error处理程序“NickLeeCallbackHandler”在其模块列表中有一个错误模块“ManagedPipelineHand ...

  10. px4的CMakelists.txt阅读

    ############################################################################ # # Copyright (c) PX4 D ...