項目案例之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和端口不同外,項目內容完全一致