• GitLab初识以及代码迁移


    一.理论概述

    1.什么是gitlib

      Gitlab 是一个基于Git实现的在线代码仓库托管软件,你可以用Gitlab自己搭建一个类似于Github一样的系统平台,一般搭建gitlab私服就是用在公司的内部,

      Gitlab 功能就是能够对代码的提交审核和问题跟踪,这个对于软件工程质量的管理是至关重要的,而且GitLab拥有web界面,更加直观.安装GitLab建议4GB内存以上

      Gitlab分为社区版(CE) 和 企业版(EE)大多数的公司还是会选择社区版

      其实gitlab的原理就是git的原理,GitHub不是也是基于Git的吗,笔者在这篇文章介绍过

    2.GitLab服务构成

    分别是:

    1. Nginx:静态Web服务器
    2. gitlab-shell:用于处理Git命令和修改authorized keys列表
    3. gitlab-workhorse:轻量级的反向代理服务器(这个是个敏捷的反向代理,它会处理一些大的HTTP请求,比如文件的上传下载,其他的请求会反向代理给Gitlab Rails应用)
    4. logrotate:日志文件管理工具
    5. postgresql:数据库
    6. redis:缓存数据库
    7. sidekiq:用于在后台执行队列的任务
    8. unicorn:Gitlab Rails应用是托管在这个服务器上面的

    3.Git对比SVN

    Git SVN
    代码管理方式 分布式,本地就可以用,保存历史痕迹,不用担心污染服务器 集中式
    分支 Git中代码仓库只是一个文件快照,对分支做操作非常迅速 相当于是版本库中的文件的复制,操作分支速度较慢
    代码管理 GitLab可以通过web界面很方便的管理权限等等 还是传统操作方式

    更详细对比介绍参考

    二.部署

    1.简单操作GitLab

    • 部署GitLab
    [root@gitlab ~]# vim /etc/yum.repos.d/gitlab-ce.repo
    [gitlab-ce]
    name=Gitlab CE Repository
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
    gpgcheck=0
    enabled=1
    
    [root@gitlab ~]# yum clean all
    
    [root@gitlab ~]# yum -y install gitlab-ce
    #安装最新版本
    
    #yum install gitlab-ce-x.x.x    
    #安装指定版本
    
    [root@gitlab ~]# vim /etc/gitlab/gitlab.rb 
    	external_url 'http://192.168.111.3'
    #修改配置文件,改为本机ip,或者可以解析情况下修改为域名
    
    [root@gitlab ~]# gitlab-ctl reconfigure
    #重新加载配置文件
    
    [root@gitlab ~]# cat /opt/gitlab/version-manifest.txt | head -1
    gitlab-ce 12.0.3
    #查看GitLab版本
    

    汉化以及邮件配置参考文章

    客户端浏览器输入192.168.111.3访问web界面测试

    设置密码

    然后使用root用户登录,密码为刚才自定义的

    将在GitLab创建的仓库克隆到本地

    [root@gitlab ~]# git config --global user.name "joinbest"
    [root@gitlab ~]# git config --global user.email "joinbest@163.com"
    #这里配置的用户名和邮箱并不是说要在某服务器上注册,而是类似于一种标识符的存在
    

    创建一个README文件并且同步到远程仓库

    [root@gitlab ~]# git clone http://192.168.111.3/root/joinbest.git
    正克隆到 'joinbest'...
    warning: 您似乎克隆了一个空版本库。
    [root@gitlab ~]# cd joinbest
    [root@gitlab joinbest]# touch README.md
    [root@gitlab joinbest]# git add README.md
    [root@gitlab joinbest]# git commit -m "add README"
    [master(根提交) 2cb80d4] add README
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 README.md
    [root@gitlab joinbest]# git push -u origin master
    Username for 'http://192.168.111.3': root  #远程仓库用户
    Password for 'http://root@192.168.111.3': #远程仓库密码
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 210 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To http://192.168.111.3/root/joinbest.git
     * [new branch]      master -> master
    分支 master 设置为跟踪来自 origin 的远程分支 master。
    

    • GitLab常用命令
    sudo gitlab-ctl start    
    # 启动所有 gitlab 组件;
    
    sudo gitlab-ctl stop       
    # 停止所有 gitlab 组件;
    
    sudo gitlab-ctl restart        
    # 重启所有 gitlab 组件;
    
    sudo gitlab-ctl status        
    # 查看服务状态;
    
    sudo gitlab-ctl reconfigure        
    # 启动服务;
    
    sudo vim /etc/gitlab/gitlab.rb        
    # 修改默认的配置文件;
    
    gitlab-rake gitlab:check SANITIZE=true --trace    
    # 检查gitlab;
    
    sudo gitlab-ctl tail        
    # 查看日志;
    

    三.项目实践:SVN代码迁移至GitLab

    疑问点:项目迁移,新建一个Git项目,把SVN代码复制过去不就可以了吗?但是为了保留之前的历史提交记录,我们得用更安全保守可靠的方式来进行代码迁移

    环境

    主机名 ip 角色信息
    gitlab 192.168.111.3 GitLab服务器
    svn 192.168.111.4 SVN服务器

    1.Linux下部署SVN服务器及简单实用

    [root@svn ~]# yum -y install subversion
    #安装
    
    [root@svn ~]# mkdir -p /application/svndata/joinbest
    [root@svn ~]# mkdir -p /application/svnpasswd
    #后面配置会用到
    
    [root@svn ~]# svnadmin create /application/svndata/joinbest/master
    [root@svn ~]# svnadmin create /application/svndata/joinbest/dev
    [root@svn ~]# svnadmin create /application/svndata/joinbest/test
    #创建分支
    
    [root@svn ~]# vim /application/svndata/joinbest/master/conf/svnserve.conf
    	anon-access = none
    	#不允许匿名访问
    	auth-access = write
    	#通过授权的用户允许写操作
    	password-db = /application/svnpasswd/passwd
    	#用户以及密码文件
    	authz-db = /application/svnpasswd/authz
    	#授权文件
    	
    [root@svn ~]# cp /application/svndata/joinbest/master/conf/svnserve.conf /application/
    
    svndata/joinbest/dev/conf/cp:是否覆盖"/application/svndata/joinbest/dev/conf/svnserve.conf"? yes
    [root@svn ~]# cp /application/svndata/joinbest/master/conf/svnserve.conf
     /application/svndata/joinbest/test/conf/cp:是否覆盖"/application/svndata/joinbest/test/conf/svnserve.conf"? yes
    #每个分支都需要配置,直接复制过去
    
    [root@svn ~]# cp /application/svndata/joinbest/master/conf/passwd /application/svnpasswd/
    [root@svn ~]# cp /application/svndata/joinbest/master/conf/authz /application/svnpasswd/
    #复制到我们制定的目录里使用
    
    [root@svn ~]# vim /application/svnpasswd/passwd 
    [users]
    manager=123456
    dev=123456
    tom=123
    bob=123
    #格式为"用户名=密码"
    
    [root@svn ~]# vim /application/svnpasswd/authz 
    [groups]
    testgroup=tom,bob
    #在[groups]标签下定义一个组,并且定义包含哪些用户
    [joinbest/master:/]
    manager = rw
    dev = r
    #该标签表示joinbest仓库下的master分支,各个用户的权限,manager用户有读和写,dev用户只有读权限
    [joinbest/dev:/]
    dev = rw
    manager = r
    [joinbest/test:/]
    @testgroup = r
    manager = rw
    
    [root@svn ~]# svnserve -d -r /application/svndata/
    [root@svn ~]# ps aux | grep svn
    root      59559  0.0  0.0 197684  1040 ?        Ss   15:34   0:00 svnserve -d -r /application/svndata/
    #启动
    

    2.Linux下SVN客户端进行测试及简单使用

    [root@gitlab ~]#  yum install -y subversion
    #安装
    
    [root@gitlab ~]# svn checkout svn://192.168.111.4/joinbest/master ./master
    认证领域: <svn://192.168.111.4:3690> ea5d88c8-24e7-41d8-b26d-a646288dc380
    “root”的密码: 
    认证领域: <svn://192.168.111.4:3690> ea5d88c8-24e7-41d8-b26d-a646288dc380
    用户名: manager
    “manager”的密码: 
    
    -----------------------------------------------------------------------
    注意!  你的密码,对于认证域:
    
       <svn://192.168.111.4:3690> ea5d88c8-24e7-41d8-b26d-a646288dc380
    
    只能明文保存在磁盘上!  如果可能的话,请考虑配置你的系统,让 Subversion
    可以保存加密后的密码。请参阅文档以获得详细信息。
    
    你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
    来避免再次出现此警告。
    -----------------------------------------------------------------------
    保存未加密的密码(yes/no)?yes
    取出版本 0。
    #将文件checkout到本地目录
    [root@gitlab ~]# svn checkout svn://192.168.111.4/joinbest/dev ./dev
    [root@gitlab ~]# svn checkout svn://192.168.111.4/joinbest/test ./test
    
    • 添加代码文件
    [root@gitlab ~]# ll | grep -E 'test|dev|master'
    drwxr-xr-x  3 root root        18 7月   7 18:20 dev
    drwxr-xr-x  3 root root        18 7月   7 18:17 master
    drwxr-xr-x  3 root root        18 7月   7 18:21 test
    
    [root@gitlab dev]# cd /root/dev/
    [root@gitlab dev]# echo testdev > dev.txt
    [root@gitlab dev]# svn add dev.txt 
    A         dev.txt
    [root@gitlab dev]# svn commit -m '2019年7月7日18:29:42' dev.txt 
    
    [root@gitlab dev]# cd /root/master
    [root@gitlab master]# echo testmaster > master.txt
    [root@gitlab master]# svn add master.txt 
    A         master.txt
    [root@gitlab master]# svn commit -m '2019年7月7日18:29:42' master.txt 
    正在增加       master.txt
    传输文件数据.
    提交后的版本为 1。
    
    [root@gitlab master]#cd /root/test
    [root@gitlab test]# echo testtest > test.txt
    [root@gitlab test]# svn add test.txt 
    A         test.txt
    [root@gitlab test]# svn commit -m '2019年7月7日18:29:42' test.txt 
    正在增加       test.txt
    传输文件数据.
    提交后的版本为 1。
    
    
    
    正在增加       dev.txt
    传输文件数据.
    提交后的版本为 1。
    [root@gitlab dev]# 
    [root@gitlab dev]# cd ../master/
    
    
    
    
    [root@gitlab test]# svn list svn://192.168.111.4/joinbest/master
    master.txt
    [root@gitlab test]# svn list svn://192.168.111.4/joinbest/dev
    dev.txt
    [root@gitlab test]# svn list svn://192.168.111.4/joinbest/test
    test.txt
    #svn服务端也有了这些文件了
    

    更多的命令了解参考这篇文章

    3.先将SVN服务器上代码迁移至Git

    yum安装Git没有git-svn功能,需要用到源码安装的Git

    [root@gitlab ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel -y
    #依赖包
    
    #cd /usr/local/src
    
    #wget https://www.kernel.org/pub/software/scm/git/git-1.9.4.tar.gz
    
    #tar xf git-1.9.4.tar.gz
    
    #cd git-1.9.4
    
    #make prefix=/usr/local/git all
    
    #make prefix=/usr/local/git install
    
     
    
    #rm -rf /usr/bin/git
    
    #ln -s /usr/local/git/bin/git /usr/bin/git
    
    [root@gitlab git-1.9.4]# git version
    git version 1.9.4
    
    [root@gitlab git-1.9.4]# yum -y install subversion-perl perl-Digest-MD5
    #代码迁移要用到这些
    

    创建svn代码备份到本地的目录

    [root@gitlab git-1.9.4]# mkdir /backup
    [root@gitlab git-1.9.4]# cd /backup/
    

    克隆svn分支

    [root@gitlab backup]# git svn clone --no-metadata svn://192.168.111.4/joinbest/master/ /backup/master/
    #根据提示输入相应密码
    
    [root@gitlab backup]# git svn clone --no-metadata svn://192.168.111.4/joinbest/test/ /backup/test/
    
    [root@gitlab backup]# git svn clone --no-metadata svn://192.168.111.4/joinbest/dev/ /backup/dev/
    
    [root@gitlab backup]# tree
    .
    ├── dev
    │   └── dev.txt
    ├── master
    │   └── master.txt
    └── test
        └── test.txt
    [root@gitlab backup]#  cat dev/dev.txt 
    testdev
    [root@gitlab backup]# cat master/master.txt 
    testmaster
    #可以看到代码已经克隆完整
    

    在GitLab创建新仓库,并且将分支添加到GitLab上

    推送代码到GitLab上

    [root@gitlab ~]#   cd /backup/master/
    [root@gitlab master]# git branch
    * master
    
    [root@gitlab master]# git branch joinbest
    [root@gitlab master]# git checkout joinbest 
    切换到分支 'joinbest'
    [root@gitlab master]# git branch
    * joinbest
      master
    #新建一个分支,这样提交到GitLab上的分支名称会是joinbest这个可以自定义
    [root@gitlab master]# git add *
    [root@gitlab master]# git commit -m "master commit"
    位于分支 joinbest
    无文件要提交,干净的工作区
    
    [root@gitlab master]# git remote add origin http://192.168.111.3/root/pro.git
    
    [root@gitlab master]# git push -u origin joinbest
    Username for 'http://192.168.111.3': root
    Password for 'http://root@192.168.111.3': 
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 252 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    remote: 
    remote: The private project root/pro was successfully created.
    remote: 
    remote: To configure the remote, run:
    remote:   git remote add origin http://192.168.111.3/root/pro.git
    remote: 
    remote: To view the project, visit:
    remote:   http://192.168.111.3/root/pro
    remote: 
    To http://192.168.111.3/root/pro.git
     * [new branch]      joinbest -> joinbest
    分支 joinbest 设置为跟踪来自 origin  的远程分支 joinbest。
    
    
    [root@gitlab master]# cd /backup/dev/
    [root@gitlab dev]# git branch
    * master
    [root@gitlab dev]# git branch joinbest_dev
    [root@gitlab dev]# git checkout joinbest_dev 
    切换到分支 'joinbest_dev'
    [root@gitlab dev]# 
    [root@gitlab dev]# git add *
    [root@gitlab dev]# git commit -m "dev branch commit"
    位于分支 joinbest_dev
    无文件要提交,干净的工作区
    
    [root@gitlab dev]# git remote add origin http://192.168.111.3/root/pro.git
    
    [root@gitlab dev]# git push -u origin joinbest_dev 
    Username for 'http://192.168.111.3': root
    Password for 'http://root@192.168.111.3': 
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 244 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    remote: 
    remote: To create a merge request for joinbest_dev, visit:
    remote:   http://192.168.111.3/root/pro/merge_requests/new?merge_request%5Bsource_branch%5D=joinbest_dev
    remote: 
    To http://192.168.111.3/root/pro.git
     * [new branch]      joinbest_dev -> joinbest_dev
    分支 joinbest_dev 设置为跟踪来自 origin 的远程分支 joinbest_dev。
    
    [root@gitlab dev]# cd /backup/test/
    [root@gitlab test]# git branch
    * master
    [root@gitlab test]# git branch test
    [root@gitlab test]# git checkout test
    切换到分支 'test'
    [root@gitlab test]# git add *
    [root@gitlab test]# git commit -m "test branch commit"
    位于分支 test
    无文件要提交,干净的工作区
    [root@gitlab test]# 
    [root@gitlab test]# git remote add origin http://192.168.111.3/root/pro.git
    [root@gitlab test]# git push -u origin test
    Username for 'http://192.168.111.3': root
    Password for 'http://root@192.168.111.3': 
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 248 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    remote: 
    remote: To create a merge request for test, visit:
    remote:   http://192.168.111.3/root/pro/merge_requests/new?merge_request%5Bsource_branch%5D=test
    remote: 
    To http://192.168.111.3/root/pro.git
     * [new branch]      test -> test
    分支 test 设置为跟踪来自 origin 的远程分支 test。
    

    四.项目实践:GitLab之间的代码迁移(环境迁移)

    主机名 ip 角色信息
    labtest 192.168.111.3 测试环境GitLab
    lab 192.168.111.4 生产环境GitLab

    labtest还是用上面已经搭建好的GitLab环境

    • 部署GitLab
    [root@lab ~]# vim /etc/yum.repos.d/gitlab-ce.repo
    [gitlab-ce]
    name=Gitlab CE Repository
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
    gpgcheck=0
    enabled=1
    
    [root@lab ~]# yum clean all
    
    [root@lab ~]# yum -y install gitlab-ce
    #安装最新版本
    
    #yum install gitlab-ce-x.x.x    
    #安装指定版本
    
    [root@lab ~]# vim /etc/gitlab/gitlab.rb 
    	external_url 'http://192.168.111.4'
    #修改配置文件,改为本机ip,或者可以解析情况下修改为域名
    
    [root@lab ~]# gitlab-ctl reconfigure
    #重新加载配置文件
    
    [root@lab ~]# cat /opt/gitlab/version-manifest.txt | head -1
    gitlab-ce 12.0.3
    #查看GitLab版本
    

    在labtest将用到的配置文件复制到lab机器上

    [root@labtest ~]# cp /etc/gitlab/gitlab.rb{,.bak}
    [root@labtest ~]# cp /var/opt/gitlab/nginx/conf/nginx.conf{,.bak}
    [root@labtest ~]# cp /etc/postfix/main.cf{,.bak}
    
    [root@labtest ~]# scp /etc/gitlab/gitlab.rb root@192.168.111.4:/etc/gitlab/
    [root@labtest ~]# scp /var/opt/gitlab/nginx/conf/nginx.conf root@192.168.111.4:/var/opt/gitlab/nginx/conf/
    [root@labtest ~]# scp /etc/postfix/main.cf root@192.168.111.4:/etc/postfix/
    
    [root@labtest ~]# vim +334 /etc/gitlab/gitlab.rb
    gitlab_rails['backup_path'] = "/var/opt/gitlab/backup"
    #待会我们使用备份工具时,输出文件的保存路径
    
    gitlab_rails['backup_keep_time'] = 604800
    #备份文件的保存时间,604800为7天
    
    [root@labtest ~]# gitlab-ctl reconfigure
    #重新加载配置
    
    [root@labtest backup]# cd /backup/
    [root@labtest backup]# gitlab-rake gitlab:backup:create
    #使用以上命令会在/var/opt/gitlab/backup目录下创建一个名称类似为1562501710_2019_07_07_12.0.3_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1393513186是备份创建的日期.
    [root@labtest backup]# pwd
    /var/opt/gitlab/backup
    [root@labtest backup]# ls
    1562501710_2019_07_07_12.0.3_gitlab_backup.tar
    
    • Gitlab 自动备份

    也可以通过crontab使用备份命令实现自动备份:

    sudo su -
    crontab -e
    

    加入以下, 实现每天凌晨2点进行一次自动备份:

    0 2 * * * cd /backup/ && /opt/gitlab/bin/gitlab-rake gitlab:backup:create
    
    • Gitlab迁移

    迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backup目录下的备份文件拷贝到新服务器上即可(如果你没修改过默认备份目录的话). 但是需要注意的是新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的7.60版本的Gitlab, 那么迁移之前, 最好将老服务器的Gitlab 升级为7.60在进行备份.

    [root@labtest backup]# scp /var/opt/gitlab/backup/1562501710_2019_07_07_12.0.3_gitlab_backup.tar root@192.168.111.4:/root/
    

    在另一台机器将该备份移动到指定目录下

    [root@lab ~]# mv /root/1562501710_2019_07_07_12.0.3_gitlab_backup.tar /var/opt/gitlab/backups/
    [root@lab ~]# chmod 777 /var/opt/gitlab/backups/1562501710_2019_07_07_12.0.3_gitlab_backup.tar 
    
    [root@lab ~]# gitlab-ctl stop unicorn
    ok: down: unicorn: 0s, normally up
    [root@lab ~]# gitlab-ctl stop sidekiq
    ok: down: sidekiq: 1s, normally up
    #将数据库和队列先关闭
    
    [root@lab ~]# gitlab-rake gitlab:backup:restore
    #使用该命令在111.4进行恢复,有询问时输入yes即可
    
    [root@lab ~]# gitlab-ctl start
    #重新开启
    

    GitLab修改root用户密码

    五.总结

    1. 不满意太多了,但是似乎总是觉得自己没有精力去将它修改的好一点
  • 相关阅读:
    教你用笔记本破解无线路由器password
    EJB究竟是什么,真的那么神奇吗??
    Hibernate的介绍
    编程基本功训练:流程图画法及练习
    一年成为Emacs高手(像神一样使用编辑器)
    MfC 进度条控件
    最小生成树(普利姆算法、克鲁斯卡尔算法)
    创建与删除索引
    hdu 4876 ZCC loves cards(暴力)
    springMVC3学习(二)--ModelAndView对象
  • 原文地址:https://www.cnblogs.com/jojoword/p/11147828.html
Copyright © 2020-2023  润新知