SVN-GitLab数据迁移
一、生产环境SVN数据迁移到测试环境GitLab
主机名 |
IP地址 |
备份 |
特殊要求 |
SVN |
192.168.200.188 |
SVN服务器 |
无 |
Git01 |
192.168.200.186 |
Git客户端 |
无 |
Git02 |
192.168.200.187 |
GitLab服务器01 |
内存2G |
1.1 Git与SVN对比:优缺点
1.2 部署SVN服务器
1.[root@SVN ~]# yum -y install subversion
2.[root@SVN ~]# mkdir -p /application/svndata/yunjisuan
3.[root@SVN ~]# mkdir -p /application/svnpasswd
4.
5.#创建yunjisuan项目主分支,开发分支,测试分子
6.[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/master
7.[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/dev
8.[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/test
9.
10.[root@SVN ~]# cd /application/svndata/yunjisuan/master/conf/
11.[root@SVN conf]# cp svnserve.conf{,.bak}
12.[root@SVN conf]# vim svnserve.conf
13.[root@SVN conf]# sed -n '19p;20p;27p;34p' svnserve.conf
14.anon-access = none
15.auth-access = write
16.password-db = /application/svnpasswd/passwd
17.authz-db = /application/svnpasswd/authz
18.
19.#将配置文件覆盖另外两个分支
20.[root@SVN conf]# /bin/cp svnserve.conf /application/svndata/yunjisuan/dev/conf/
21.[root@SVN conf]# /bin/cp svnserve.conf /application/svndata/yunjisuan/test/conf/
22.[root@SVN conf]# cp /application/svndata/yunjisuan/master/conf/authz /application/svnpasswd/
23.[root@SVN conf]# cp /application/svndata/yunjisuan/master/conf/passwd /application/svnpasswd/
24.[root@SVN conf]# cd /application/svnpasswd/
25.[root@SVN svnpasswd]# vim passwd
26.[root@SVN svnpasswd]# tail -4 passwd
27.yunjisuan = 123123
28.benet = 123123
29.stu001 = 123
30.stu002 = 456
31.[root@SVN svnpasswd]# vim authz
32.[root@SVN svnpasswd]# egrep -v "#|^$" authz
33.[aliases]
34.[groups]
35.testgroup = stu001,stu002
36.[yunjisuan/master:/]
37.yunjisuan = rw #master主分支代码提交者---开发经理
38.benet = r
39.
40.[yunjisuan/dev:/]
41.benet = rw #dev开发分支代码提交者---普通程序员
42.yunjisuan = r #dev开发分支代码下载者---开发经理
43.
44.[yunjisuan/test:/]
45.@testgroup = r #test测试分支代码下载者----测试人员
46.yunjisuan = rw #test测试分支代码提交者---开发经理
47.
48.[root@SVN svnpasswd]# svnserve -d -r /application/svndata/
49.[root@SVN svnpasswd]# ps -ef | grep svn
50.root 1388 1 0 21:59 ? 00:00:00 svnserve -d -r /application/svndata/
root 1390 1225 0 21:59 pts/0 00:00:00 grep --color=auto svn
在宿主机创建三个svn目录checkout代码,如下图
随便在三个目录上传点代码文件
1.3 利用git-svn克隆svn代码
特别提示:
Yum安装的git没有git-svn功能,要源码安装最新版本
1.#在Git01上操作
2.#安装git-svn支持程序(没有这两个包git-svn报错)
3.[root@Git01 ~]# yum -y install subversion-perl
4.[root@Git01 backup]# yum -y install perl-Digest-MD5
5.
6.#创建Git工作目录并克隆SVN分支代码到本地
7.[root@Git01 ~]# mkdir -p /backup
8.[root@Git01 ~]# cd /backup
9.
10.#将SVN服务器master分支代码克隆到本地Git工作目录
11.[root@Git01 backup]# git svn clone --no-metadata svn://192.168.200.188/yunjisuan/master/ /backup/master/
12.初始化空的 Git 仓库于 /backup/master/.git/
13.Authentication realm: <svn://192.168.200.188:3690> 072f4de9-e153-4bf7-ba81-3d5e5f12c9f7
14.Password for 'root': #输入root登陆密码
15.Authentication realm: <svn://192.168.200.188:3690> 072f4de9-e153-4bf7-ba81-3d5e5f12c9f7
16.Username: yunjisuan #输入svn的master分支的授权账户名
17.Password for 'yunjisuan': #输入svn的master分支的授权账户密码
18. A test.txt
19.r1 = 91d6150e732f2a0191a3609dda47a78592d1406e (refs/remotes/git-svn)
20. D test.txt
21. A testmaster.txt
22.W: -empty_dir: test.txt
23.r2 = 67a5085e0fbc4b2d22a9d381e3b6ad076d2eb31e (refs/remotes/git-svn)
24.Checked out HEAD:
25. svn://192.168.200.188/yunjisuan/master r2
26.
27.
28.#将SVN服务器dev分支代码克隆到本地Git工作目录
29.[root@Git01 backup]# git svn clone --no-metadata svn://192.168.200.188/yunjisuan/dev/ /backup/dev/
30.初始化空的 Git 仓库于 /backup/dev/.git/
31.Authentication realm: <svn://192.168.200.188:3690> 9149d004-cc0e-48a9-b8a2-3caa58aa2092
32.Password for 'root': #输入root登陆密码
33.Authentication realm: <svn://192.168.200.188:3690> 9149d004-cc0e-48a9-b8a2-3caa58aa2092
34.Username: benet #输入svn的dev分支的授权账户名
35.Password for 'benet': #输入svn的dev分支的授权账户密码
36. A test.txt
37.r1 = b7e184a3080b3f046969f39dbf18a07c367d37a2 (refs/remotes/git-svn)
38. M test.txt
39.r2 = 7e33b02be20bc4244086dcd622a18873f7ea93af (refs/remotes/git-svn)
40. D test.txt
41. A testdev.txt
42.W: -empty_dir: test.txt
43.r3 = 5a3189eeff8b15228c78858c27dabeda6c417940 (refs/remotes/git-svn)
44.Checked out HEAD:
45. svn://192.168.200.188/yunjisuan/dev r3
46.
47.
48.#将SVN服务器test分支代码克隆到本地Git工作目录
49.[root@Git01 backup]# git svn clone --no-metadata svn://192.168.200.188/yunjisuan/test/ /backup/test/
50.初始化空的 Git 仓库于 /backup/test/.git/
51.Authentication realm: <svn://192.168.200.188:3690> cf8ca014-62dd-4f60-b821-38db9bf1a0d3
52.Password for 'root': #输入root登陆密码
53.Authentication realm: <svn://192.168.200.188:3690> cf8ca014-62dd-4f60-b821-38db9bf1a0d3
54.Username: yunjisuan #输入svn的test分支的授权账户名
55.Password for 'yunjisuan': #输入svn的test分支的授权账户密码
56. A test.txt
57.r1 = b2d971b3c80708c858dffcdd5a542561b677d93f (refs/remotes/git-svn)
58. D test.txt
59. A testtest.txt
60.W: -empty_dir: test.txt
61.r2 = e57f1c1dab5a12df3cda337726bf89382f572135 (refs/remotes/git-svn)
62.Checked out HEAD:
63. svn://192.168.200.188/yunjisuan/test r2
64.
65.[root@Git01 backup]# ls
66.dev master test
67.[root@Git01 backup]# tree
68..
69.├── dev
70.│ └── testdev.txt
71.├── master
72.│ └── testmaster.txt
73.└── test
74. └── testtest.txt
75.
76.3 directories, 3 files
在GitLab上创建一个组,在组里添加3个成员(主程序员,开发者,报告者)
GitLab默认情况下,master分支是受到保护的(只能主程序员推送和合并)
主程序员=产品经理:推送和合并受保护分支
开发者=开发人员:推送不受保护分支
报告者=测试人员:只能clone代码
在GitLab这个组里创建一个项目叫做Demo
通过主程序员账号将从SVN克隆下来的master分支,dev分支,test分支的代码推送到Demo项目里。分支名称不变
1.[root@Git01 backup]# ls
2.dev master test
3.[root@Git01 backup]# cd master/
4.[root@Git01 master]# ls
5.testmaster.txt
6.[root@Git01 master]# git remote add origin http://192.168.200.187:8888/test/demo.git
7.
8.#将master目录代码推送到GitLab仓库的Demo项目里
9.[root@Git01 master]# git push -u origin master
10.Username for 'http://192.168.200.187:8888': 215379068@qq.com
11.Password for 'http://215379068@qq.com@192.168.200.187:8888':
12.对象计数中: 5, 完成.
13.压缩对象中: 100% (2/2), 完成.
14.写入对象中: 100% (5/5), 383 bytes | 0 bytes/s, 完成.
15.Total 5 (delta 1), reused 0 (delta 0)
16.To http://192.168.200.187:8888/test/demo.git
17. * [new branch] master -> master
18.分支 master 设置为跟踪来自 origin 的远程分支 master。
19.
20.#将dev目录代码推送到GitLab仓库的Demo项目里
21.[root@Git01 master]# cd /backup/dev
22.[root@Git01 dev]# git branch
23.* master
24.[root@Git01 dev]# git branch dev
25.[root@Git01 dev]# git checkout dev
26.切换到分支 'dev'
27.[root@Git01 dev]# git branch
28.* dev
29. master
30.[root@Git01 dev]# ls
31.testdev.txt
32.[root@Git01 dev]# git add *
33.[root@Git01 dev]# git commit -m "开发分支代码提交"
34.
35.*** Please tell me who you are.
36.
37.Run
38.
39. git config --global user.email "you@example.com"
40. git config --global user.name "Your Name"
41.
42.to set your accounts default identity.
43.Omit --global to set the identity only in this repository.
44.
45.fatal: unable to auto-detect email address (got 'root@Git01.(none)')
46.[root@Git01 dev]# git config --global user.email "215379068@qq.com"
47.[root@Git01 dev]# git config --global user.name "Mr.chen"
48.[root@Git01 dev]# git commit -m "开发分支代码提交"
49.位于分支 dev
50.nothing to commit, working tree clean
51.[root@Git01 dev]# git push -u origin dev
52.Username for 'http://192.168.200.187:8888': 215379068@qq.com
53.Password for 'http://215379068@qq.com@192.168.200.187:8888':
54.对象计数中: 8, 完成.
55.压缩对象中: 100% (3/3), 完成.
56.写入对象中: 100% (8/8), 628 bytes | 0 bytes/s, 完成.
57.Total 8 (delta 0), reused 0 (delta 0)
58.remote:
59.remote: To create a merge request for dev, visit:
60.remote: http://192.168.200.187:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=dev
61.remote:
62.To http://192.168.200.187:8888/test/demo.git
63. * [new branch] dev -> dev
64.分支 dev 设置为跟踪来自 origin 的远程分支 dev。
65.
66.
67.#将test目录代码推送到GitLab仓库的Demo项目里
68.[root@Git01 dev]# cd /backup/test/
69.[root@Git01 test]# git branch
70.* master
71.[root@Git01 test]# git branch test
72.[root@Git01 test]# git checkout test
73.切换到分支 'test'
74.[root@Git01 test]# git add *
75.[root@Git01 test]# git config --global user.email "215379068@qq.com"
76.[root@Git01 test]# git config --global user.name "Mr.chen"
77.[root@Git01 test]# git commit -m "测试分支代码提交"
78.位于分支 test
79.nothing to commit, working tree clean
80.[root@Git01 test]# git remote add origin http://192.168.200.187:8888/test/demo.git
81.[root@Git01 test]# git push -u origin test
82.Username for 'http://192.168.200.187:8888': 215379068@qq.com
83.Password for 'http://215379068@qq.com@192.168.200.187:8888':
84.对象计数中: 5, 完成.
85.压缩对象中: 100% (2/2), 完成.
86.写入对象中: 100% (5/5), 379 bytes | 0 bytes/s, 完成.
87.Total 5 (delta 1), reused 0 (delta 0)
88.remote:
89.remote: To create a merge request for test, visit:
90.remote: http://192.168.200.187:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=test
91.remote:
92.To http://192.168.200.187:8888/test/demo.git
93. * [new branch] test -> test
94.分支 test 设置为跟踪来自 origin 的远程分支 test。
二、测试环境GitLab数据迁移到生产环境GitLab
2.1 案例背景
前段时间,在某台CentOS服务器上搭建了GitLab环境,并且其他开发组的同仁都陆陆续续把代码从svn迁移到了GitLab,但是之前的CentOS服务器并不是搭建在公司的机房环境,而是搭建在办公室的某台闲置的电脑上,因此为了保证数据安全性,领导要求将之前的GitLab数据全部重新迁移到公司机房的服务器上去。
主机名 |
IP地址 |
备份 |
特殊要求 |
Git01 |
192.168.200.186 |
GitLab服务器01 |
内存2G |
Git02 |
192.168.200.187 |
GitLab服务器02 |
内存2G |
2.2 GitLab的数据备份
2.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 邮件配置备份
1.[root@Git02 backups]# pwd
2./var/opt/gitlab/backups
3.[root@Git02 backups]# ls
4.
5.#执行命令生成备份压缩包
6.[root@Git02 backups]# gitlab-rake gitlab:backup:create
7.
8.#查看备份包
9.[root@Git02 backups]# ls
10.1537370009_2018_09_19_11.2.3_gitlab_backup.tar 1537370260_2018_09_19_11.2.3_gitlab_backup.tar
11.[root@Git02 backups]# ll
12.总用量 184
13.-rw------- 1 git git 92160 9月 19 23:13 1537370009_2018_09_19_11.2.3_gitlab_backup.tar
14.-rw------- 1 git git 92160 9月 19 23:17 1537370260_2018_09_19_11.2.3_gitlab_backup.tar #最后一次备份
2.2.2 更改GitLab备份目录
GitLab配置文件路径:/etc/gitlab/gitlab.rb
1.[root@Git02 ~]# mkdir -p /backup
2.#修改如下配置文件
3.[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb.bak | sed -n '299p'
4. 299 # gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
5.[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '299p'
6. 299 gitlab_rails['backup_path'] = "/backup"
7.
8.#重载GitLab配置文件
9.[root@Git02 ~]# gitlab-ctl reconfigure
10.
11.#再次进行备份尝试
12.[root@Git02 ~]# cd /backup/
13.[root@Git02 backup]# ls
14.[root@Git02 backup]# gitlab-rake gitlab:backup:create
15.[root@Git02 backup]# ls
16.1537371499_2018_09_19_11.2.3_gitlab_backup.tar
2.2.3 GitLab的自动备份
将命令写成定时任务,每天凌晨两点执行一次备份操作
2.2.4 设置备份过期时间
设置只保存最近7天的备份,编辑/etc/gitlab/gitlab.rb配置文件,找到如下配置并修改
1.[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb.bak | sed -n '307p'
2. 307 # gitlab_rails['backup_keep_time'] = 604800
3.[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '307p'
4. 307 gitlab_rails['backup_keep_time'] = 604800
2.3 copy老服务器上面的备份文件到新服务器
2.3.1 确保新GitLab服务器和老GitLab服务器版本相同
在G01上和G02上都部署同版本的GitLab服务器
2.3.2 copy老服务器上面的备份文件到新服务器
1.[root@Git02 ~]# cd /backup/
2.[root@Git02 backup]# ls
3.1537371499_2018_09_19_11.2.3_gitlab_backup.tar
4.[root@Git02 backup]# scp 1537371499_2018_09_19_11.2.3_gitlab_backup.tar root@192.168.200.186:/root/
5.root@192.168.200.186's password:
1537371499_2018_09_19_11.2.3_gitlab_backup.tar 100% 90KB 23.4MB/s 00:00
2.4 从备份数据中恢复GitLab
2.4.1 将备份文件权限修改为777
第一步:将备份文件权限修改为777,不然可能恢复的时候会出现权限不够,不能解压的问题。
1.#将拷贝过来的备份文件移动到新GitLab的备份目录下
2.[root@Git01 ~]# mv 1537371499_2018_09_19_11.2.3_gitlab_backup.tar /var/opt/gitlab/backups/
3.[root@Git01 ~]# cd /var/opt/gitlab/backups/
4.[root@Git01 backups]# ls
5.1537371499_2018_09_19_11.2.3_gitlab_backup.tar
6.
7.#给备份文件增加777权限
8.[root@Git01 backups]# chmod 777 1537371499_2018_09_19_11.2.3_gitlab_backup.tar
9.[root@Git01 backups]# ll 1537371499_2018_09_19_11.2.3_gitlab_backup.tar
10.-rwxrwxrwx 1 root root 92160 9月 20 22:17 1537371499_2018_09_19_11.2.3_gitlab_backup.tar
2.4.2 执行命令停止相关数据连接服务
第二步:执行命令停止相关数据连接服务
1.#停止相关数据连接服务
2.[root@Git01 ~]# gitlab-ctl stop unicorn
3.ok: down: unicorn: 0s, normally up
4.
5.[root@Git01 ~]# gitlab-ctl stop sidekiq
6.ok: down: sidekiq: 0s, normally up
2.4.3 执行命令从备份文件中恢复GitLab
第三步:执行命令从备份文件中恢复GitLab
gitlab-rake gitlab:backup:restore BACKUP=备份文件编号
1.#执行命令恢复数据
2.[root@Git01 ~]# gitlab-rake gitlab:backup:restore BACKUP=1537371499_2018_09_19_11.2.3
3.
4.说明:
恢复过程中出现两个(yes/no),输入两个yes即可
2.4.4 重新启动GitLab
第四步:启动GitLab
1.[root@Git01 ~]# gitlab-ctl start
2.ok: run: alertmanager: (pid 30942) 1078s
3.ok: run: gitaly: (pid 30950) 1077s
4.ok: run: gitlab-monitor: (pid 30971) 1077s
5.ok: run: gitlab-workhorse: (pid 30976) 1077s
6.ok: run: logrotate: (pid 30984) 1076s
7.ok: run: nginx: (pid 30991) 1076s
8.ok: run: node-exporter: (pid 30996) 1075s
9.ok: run: postgres-exporter: (pid 31075) 1075s
10.ok: run: postgresql: (pid 31084) 1074s
11.ok: run: prometheus: (pid 31093) 1074s
12.ok: run: redis: (pid 31102) 1073s
13.ok: run: redis-exporter: (pid 31106) 1073s
14.ok: run: sidekiq: (pid 32321) 1s
ok: run: unicorn: (pid 32328) 0s
2.4.5 进行Web访问检查
两台GitLab除了IP和端口不同外,项目内容完全一致