美文网首页
linux学习--week21--分布式版本控制系统Git、gi

linux学习--week21--分布式版本控制系统Git、gi

作者: 亮仔_c1b5 | 来源:发表于2019-12-16 01:03 被阅读0次

    12.分布式版本控制系统Git实战
    第一章 快速入门
    1.1 什么是Git
    1.2 为什么要做版本控制
    1.3 安装git
    第二章 “抖音”创业史
    2.1 第一阶段:单枪匹马开始干
    2.2 第二阶段:开发新功能
    2.3 第三阶段:“约XX事件”
    2.4 阶段回顾:区域与总结
    2.5 第四阶段:商城&紧急修复bug
    2.5.1 分支
    2.5.2 紧急修复bug方案
    2.5.3 分支命令总结
    2.5.4 工作流
    2.6 第五阶段:进军三里屯
    2.6.1 第一天上班前在家上传代码
    2.6.2 初次在公司新电脑下载代码
    2.6.3 下班回到家继续写代码
    2.6.4 到公司继续开发
    2.6.5 在公司约妹子忘记提交代码
    2.6.6 回家继续写代码
    2.6.7 到公司继续写代码
    2.6.8 知识补充&总结
    2.7第六阶段:其他知识补充
    2.7.1 git tag标签
    2.7.2 免密码登录
    2.7.3 git忽略文件

    第一章 快速入门

    1.1 什么是Git

    Git是一个分布式的版本控制软件。

    • 软件,类似于QQ、office、dota等安装到电脑上才能使用的工具。
    • 版本控制,类似于毕业论文、写文案、视频剪辑等,需要反复修改和保
      留原历史数据。
    • 分布式
      文件夹拷贝
      本地版本控制
      集中式版本控制
      分布式版本控制


      image.png

    1.2 为什么要做版本控制

    要保留之前所有的版本,以便回滚和修改。

    1.3 安装git

    安装git软件有很多种方式:官网传送门

    • 1.windows系统
    https://git-scm.com/download/win
    
    • 2.linux系统
    yum install git -y
    
    • 3.macos系统
    https://git-scm.com/download/mac
    

    第二章 “抖音”创业史

    2.1 第一阶段:单枪匹马开始干

    想要让 git 对一个目录进行版本控制需要以下步骤:

    • 进入要管理的文件夹
    • 执行初始化命令
    git init
    
    • 管理目录下的文件状态
    git status
    注:新增的文件和修改过后的文件都是红色
    
    • 管理指定文件(红变绿)
    git add 文件名
    git add .
    
    • 个人信息配置:用户名、邮箱 【一次即可】
    git config --global user.email "oldxu@qq.com"
    git config --global user.name "oldxu"
    git config --global color.ui true
    
    • 生成版本
    git commit -m '描述信息'
    
    • 查看版本记录
    git log
    

    2.2 第二阶段:开发新功能

    git add
    git commit -m '短视频'
    

    2.3 第三阶段:“约XX事件”

    • 回滚至之前版本
    git log
    git reset --hard 版本号
    
    • 回滚之之后版本
    git reflog
    git reset --hard 版本号
    

    2.4 阶段回顾:区域与总结

    git init #初始化一个目录为git版本库
    git add #将没有被管理的文件,加入git进行管理
    git commit #将内容提交到版本库中,生成对应的版本记录信息
    git log #查看提交的历史记录
    git reflog #查看所有的历史提交记录
    git reset --hard 版本号 #回退到指定的提交版本记录
    
    image.png
    image.png

    2.5 第四阶段:商城&紧急修复bug

    2.5.1 分支

    分支可以给使用者提供多个环境的可以,意味着你可以把你的工作从开发
    主线上分离开来,以免影响开发主线。

    2.5.2 紧急修复bug方案

    image.png

    2.5.3 分支命令总结

    • 查看分支
    git branch
    
    • 创建分支
    git branch 分支名称
    
    • 切换分支
    git checkout 分支名称
    
    • 分支合并(可能产生冲突)
    git merge 要合并的分支
    注意:切换分支再合并
    
    • 删除分支
    git branch -d 分支名称
    

    2.5.4 工作流

    有了分支后,我们的开发工作流程就可以变成如下方式


    image.png

    2.6 第五阶段:进军三里屯

    有钱之后就要造呀,一个人在三里屯买了一层楼做办公室。


    image.png

    2.6.1 第一天上班前在家上传代码

    首先,需要注册github账号,并创建远程仓库,然后再执行如下命令,将代码上传到github。


    image.png
    1. 给远程仓库起别名
    git remote add origin 远程仓库地址
    2. 向远程推送代码
    git push -u origin 分支
    

    2.6.2 初次在公司新电脑下载代码

    1. 克隆远程仓库代码
    git clone 远程仓库地址 (内部已实现git remote add origin
    远程仓库地址)
    2. 切换分支
    git checkout 分支
    

    在公司下载完代码后,继续开发

    1.切换到dev分支进行开发
    git checkout dev
    2.把master分支合并到dev [仅一次]
    git merge master
    3.修改代码
    4.提交代码
    git add .
    git commit -m 'xx'
    git push origin dev
    

    2.6.3 下班回到家继续写代码

    1.切换到dev分支进行开发
    git checkout dev
    2.拉代码
    git pull origin dev
    3.继续开发
    4.提交代码
    git add .
    git commit -m 'xx'
    git push origin dev
    

    2.6.4 到公司继续开发

    1.切换到dev分支进行开发
    git checkout dev
    2.拉最新代码(不必再clone,只需要通过pull获取最新代码即可)
    git pull origin dev
    3.继续开发
    4.提交代码
    git add .
    git commit -m 'xx'
    git push origin dev
    

    开发完毕,要上线

    1. 将dev分支合并到master,进行上线
    git checkout master
    git merge dev
    git push origin master
    2. 把dev分支也推送到远程
    git checkout dev
    git merge master
    git push origin dev
    

    2.6.5 在公司约妹子忘记提交代码

    1.拉代码
    git pull origin dev
    2.继续开发
    3.提交代码
    git add .
    git commit -m 'xx'
    注:忘记push了
    

    2.6.6 回家继续写代码

    1.拉代码,发现在公司写的代码忘记提交...
    git pull origin dev
    2.继续开发其他功能
    3.把dev分支也推送到远程
    git add .
    git commit -m 'xx'
    git push origin dev
    

    2.6.7 到公司继续写代码

    1.拉代码,把晚上在家写的代码拉到本地(有合并、可能产生冲突)
    git pull origin dev
    2.如果有冲突,手动解决冲突
    3.继续开发其他功能
    4.把dev分支也推送到远程
    git add .
    git commit -m 'xx'
    git push origin dev
    

    2.6.8 知识补充&总结

    git pull origin dev
    等价于
    git fetch origin
    git merge origin/dev
    
    image.png
    image.png

    小总结

    • 添加远程连接(别名)
    git remote add origin 地址
    git remote -v
    
    • 推送代码
    git push origin dev
    
    • 下载代码
    git clone 地址
    
    • 拉取代码
    git pull origin dev
    等价于
    git fetch origin dev
    git merge origin/dev
    
    • 记录图形展示
    git log --graph --pretty=format:"%h %s"
    

    2.7第六阶段:其他知识补充

    2.7.1 git tag标签

    1.git标签作什么用?

    当Git仓库内的数据有改善或者功能更新时,我们经常会打一个类似于软件
    版本号的标签tag,这样通过标签就可以将版本库中的某次commit给记录下
    来,便于我们后续将特定时期的数据取出来用。简单来说:标签也是版本
    库的一个快照。

    2.为什么要使用git标签?

    Git有commit,为什么还要引入tag?“请把上周一的那个版本打包发布,
    commit号是6a5819e...”, “一串乱七八糟的数字不好找!”如果换一个办
    法:
    “请把上周一的那个版本打包发布,版本号是v1.2”。按照 tag v1.2查找
    commit就行!”所以,tag就是一个让人容易记住的名字,它跟某个commit
    绑在一起。

    3.git标签基本使用

    • 对当前最新提交的代码创建标签,-a标签名称,-m标签描述
    git tag -a "v1.1" -m "描述信息"
    
    • 创建标签,指定commitID
    git tag -a v1.2 CommitID -m "Messages"
    
    • 查看标签详情
    git tag
    git show 标签名
    git push origin --tags 推送标签到gitee码云
    

    2.7.2 免密码登录

    • URL中体现
    原来的地址:https://github.com/oldxu/treenb.git
    修改的地址:https://用户名:密码
    @github.com/oldxu/treenb.git
    
    git remote add origin https://用户名:密码
    @github.com/oldxu/treenb.git
    git push origin master
    
    • SSH实现
    1. 生成公钥和私钥(默认放在 ~/.ssh目录下,id_rsa.pub公钥、
    id_rsa私钥)
    ssh-keygen
    2. 拷贝公钥的内容,并设置到github中。
    3. 在git本地中配置ssh地址
    git remote add origin
    git@github.com:WuPeiqi/dbhot.git
    4. 以后使用
    git push origin master
    
    • git自动管理凭证

    2.7.3 git忽略文件

    让Git不再管理当前目录下的某些文件。.gitignore
    通常情况下有如下文件可能需要忽略

    • 1.程序运行时产生的垃圾文件
    • 2.程序运行时产生的缓存文件
    • 3.程序本地开发使用的图片文件
    • 4.程序连接数据一类的配置文件
    *.h
    !a.h
    files/
    *.py[c|a|d]
    

    更多参考:https://github.com/github/gitignore

    ☆2. GitLab分布式版本控制器

    GitLab简介
    GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。GitLab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

    由于Git的分布式特性,即使Gitlab不可用,开发人员仍然可以在本地提交代码。

    1. gitlab安装

    #配置base源和epel源
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    
    #下载并安装gitlab
    wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.3-ce.0.el7.x86_64.rpm
    rpm -ivh gitlab-ce-12.0.3-ce.0.el7.x86_64.rpm 
    
    
    image
    #设置访问url和关闭prometheus
    [root@node1 tools]# vim /etc/gitlab/gitlab.rb 
    external_url 'http://douergitlab.com'
    prometheus_monitoring['enable'] = false
    
    #配置gitlab通过smtp发送邮件
    [root@node1 tools]# vim /etc/gitlab/gitlab.rb
      52 gitlab_rails['gitlab_email_enabled'] = true
      53 gitlab_rails['gitlab_email_from'] = '245684979@qq.com'
      54 gitlab_rails['gitlab_email_display_name'] = 'linux_gitlab'
    
    #配置mail邮件服务
     517 gitlab_rails['smtp_enable'] = true
     518 gitlab_rails['smtp_address'] = "smtp.qq.com"
     519 gitlab_rails['smtp_port'] = 25
     520 gitlab_rails['smtp_user_name'] = "245684979@qq.com"
     521 gitlab_rails['smtp_password'] = "<passwd>"
     522 gitlab_rails['smtp_domain'] = "smtp.qq.com"
     523 gitlab_rails['smtp_authentication'] = "login"
     524 gitlab_rails['smtp_enable_starttls_auto'] = true
     525 gitlab_rails['smtp_tls'] = true
    
    #关闭一些不用的组件
    grafana['enable'] = false
    node_exporter['enable'] = false
    redis_exporter['enable'] = false
    postgres_exporter['enable'] = false
    gitlab_monitor['enable'] = false
    gitlab_monitor['probe_sidekiq'] = false
    prometheus_monitoring['enable'] = false
    prometheus['enable'] = false
    alertmanager['enable'] = false
    
    
    #重新加载配置文件_需要等待一会
    gitlab-ctl reconfigure
    
    gitlab基本启动与停止
    gitlab-ctl start | restart | stop | status
    
    注意:每次修改gitlab的配置文件,都需要进行一次初始化操作(非常快)
    
    gitlab日常使用?
    如果有新成员需要加入该项目该怎么办?
        1.创建用户
        2.加入组
        3.为其分配权限
        4.用户拿Windows将公钥放入对应的用户ssh下,
        5.使用git clone 下载代码
        6.使用git pull或git push 更新或者上传代码
    
    

    浏览器访问域名
    http://www.douergitlab.com/

    image

    2.gitlab汉化

    #下载汉化包
    https://gitlab.com/xhang/gitlab
    
    gitlab-ctl stop
    tar xf gitlab-12-0-stable-zh.tar.gz
    \cp -a gitlab-12-0-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/
    gitlab-ctl restart
    
    

    页面显示502,请耐心等待一会,重启的时间较久

    image image

    3. gitlab-用户-用户组-项目之间的关系

    先创建用户组—>在基于用户组创建项目—>最后创建用户—>编辑用户组—>添加成员—>注意权限

    image image image

    ※4. gitlab灾备措施_备份恢复和迁移※

    备份恢复与迁移非常简单. 使用一条命令即可创建完整的Gitlab备份:

    4.1 备份

    [root@node1 ~]# gitlab-rake gitlab:backup:create
    [root@node1 ~]# ls /var/opt/gitlab/backups/
    1572333106_2019_10_29_11.9.12_gitlab_backup.tar
    
    

    /etc/gitlab/gitlab.rb 配置文件须备份
    /var/opt/gitlab/nginx/confnginx配置文件
    /etc/postfix/main.cfpostfix 邮件配置备份

    1. 设置Gitlab备份目录

    [root@node1 ~]# vim /etc/gitlab/gitlab.rb
    ...
    gitlab_rails['manage_backup_path'] = true   #管理备份路径
    gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" #备份路径
    gitlab_rails['backup_archive_permissions'] = 0644 #备份的默认权限为644
    gitlab_rails['backup_keep_time'] = 604800   #允许删除备份之前保留备份的持续时间(以秒为单位 默认7天)
    ...
    
    

    2.手动备份

    [root@node1 ~]# gitlab-rake gitlab:backup:create
    
    

    3.自动备份

    [root@node1 ~]# crontab -e
    #每天凌晨2点进行一次自动备份:通过crontab使用备份命令实现
    00 02 * * * /usr/bin/gitlab-rake gitlab:backup:create
    
    

    4.2 恢复

    # 停止相关数据连接服务
    [root@node1 ~]# gitlab-ctl stop unicorn
    [root@node1 ~]# gitlab-ctl stop sidekiq
    
    #编号备份中恢复,只需复制到日期即可
    [root@node1 ~]# gitlab-rake gitlab:backup:restore BACKUP=1572333106_2019_10_29_11.9.12
    
    #启动Gitlab
    [root@node1 ~]# gitlab-ctl start
    
    

    恢复成功

    image

    4.3 迁移

    迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups即可


    需要注意的是新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的11.9.11版本的Gitlab那么迁移之前, 最好将老服务器的Gitlab升级为11.9.11,基于最新版本的状态在进行备份

    /etc/gitlab/gitlab.rb gitlab 配置文件须迁移,迁移后需要调整数据存放目录
    /var/opt/gitlab/nginx/conf nginx配置文件目录须迁移

    #迁移到云主机的方法
    先备份,云主机要安装相同版本,恢复(记得把软件包留下来)
    
    #将旧机器上的备份文件同步过来后的操作步骤
    [root@node1 ~]#  gitlab-ctl stop unicorn
    [root@node1 ~]#  gitlab-ctl stop sidekiq
    [root@node1 ~]#  chmod 777 /var/opt/gitlab/backups/1572333106_2019_10_29_11.9.12_gitlab_backup.tar
    [root@node1 ~]#  gitlab-rake gitlab:backup:restore BACKUP=1572333106_2019_10_29_11.9.12
    
    

    5. gitlab常用命令

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

    6. gitlab主要配置文件目录

    主配置文件: /etc/gitlab/gitlab.rb
    文档根目录: /opt/gitlab
    默认存储库位置: /var/opt/gitlab/git-data/repositories
    Nginx配置文件: /var/opt/gitlab/nginx/conf/gitlab-http.conf
    Postgresql数据目录: /var/opt/gitlab/postgresql/data
    
    

    7. Gitlab普通用户通过ssh协议上传

    我们在clone代码的时候可以选择http协议,当然我们亦可以选择ssh协议来拉取代码。
    在本地git客户端生成ssh key,然后配置在gitlab里,而后使用ssh协议进行提交和拉取git远程仓库的代码。

    创建普通用户 李四

    image image
    #在root用户下添加hosts解析
    [root@node1 ~]# vim /etc/hosts
    10.0.0.11  douergitlab.com
    
    #创建普通用户 lisi
    useradd lisi
    su - lisi 
    
    mkdir zx
    cd zx/
    git config --global user.name "李四"
    git config --global user.email "lichenxing0430@163.com"
    cp /etc/services .  # 用来测试的文件放到当前目录下
    
    #将生成ssh秘钥后添加
    [lisi@node1 zx]$ ssh-keygen -t rsa
    [lisi@node1 zx]$ cat ~/.ssh/id_rsa.pub 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDoBLv83m/JtEu7Kst47qwmYsCepkjcbl3OaBUvr0/47TmHfJ1fBFaQUOKMG61vAKuqKaQaoLGakpFQo8jyqe6XbgX0tKOgJs9IcoZegYLdNeRmqfUDoBqefurHitquNHnUhJCywvXgmzUQfnh+Ub07qTE0BIvbA2NLC1DloaJdsHbj8SsN0FasCcImu7wGlVol55tD+JdROy9SzFWD+bTeFROEPAV/3E4MCXAiZ4cpWoJe+3k2coxayKvmjdfFp/+fqOYtGmjkS4tUe3jZs8UJCvf5jwLZrXe2njAp4bDD2xGXqk9j1cWFnYLiqadCBIjf9M8EHlJRU19pb+p7Zf+N lisi@node1
    
    
    image
    #删除之前的origin配置
    git remote remove origin
    
    #生成origin传输协议为ssh,ssh协议地址到项目的详情页进行复制
    [lisi@node1 zx]$ git remote add origin git@douergitlab.com:lisi/zxzn.git
    [lisi@node1 zx]$ cat .git/config 
    [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
    [remote "origin"]
        url = git@douergitlab.com:lisi/zxzn.git
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    
    #上传代码 V_1版本
    git init
    git remote add origin git@douergitlab.com:lisi/zxzn.git
    git add .
    git commit -m "V_1"
    git push -u origin master   #这里直接通过SSH协议上传了
    
    

    刷新网页查看

    image image

    8. gitlab的克隆 clone

    创建一个新的普通用户 王二

    image
    #创建一个普通用户wanger并生成ssh秘钥
    [root@node1 ~]# useradd wanger
    [root@node1 ~]# su - wanger 
    [wanger@node1 ~]$ ssh-keygen -t rsa
    [wanger@node1 ~]$ cat ~/.ssh/id_rsa.pub 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyGDctK6P41EnTvn+ubVGyTMpa77zU7h4HUF7XhJirrp+8LUXe6HwdXWDKtzz88Eqd/OISh+ihMqsF9Wrs6TBL09Mda7YkxHZAHKlprJF3sfAmgCb6GYjHKj/mw+teYcg3Mu1YGr3GnR5q0sQvWcCBqwJCMZmaK8a0gVmsbJ5Jq+6d9N5Peko/m+U7MY9iX/kWPaiNHJ9l2UoDwelV5UCaU0hfTYNspgVTFlAZbSoTsjnMenHJFhWmzXytjJh3KyU9GKq1VErcMhjR0Px601IHtj1uprkqs9MfF62SLSYtMG348IGHxcWA5UhIL8b9Zhxlg1UrHK/YKpAwfI+24dyj wanger@node1
    
    #使用李四用户的SSH克隆链接 第一次需要输入 yes
    [wanger@node1 ~]$ git clone git@douergitlab.com:lisi/zxzn.git
    [wanger@node1 ~]$ tree
    .
    └── zxzn
        └── services
    
    

    找到王二用户的个人邮箱
    lichenxing@in365robot.com

    9.gitlab版本升级

    参考资料1
    参考资料2
    参考资料3

    gitlab升级,最好要小版本跨,不要直接跳级
    官方规定在主要版本系列中首先到达最后一个次要版本,才能升级至下一个主要版本。
    V10--->V11.8---V11.11--->V12.0
    
    #关闭gitlab核心服务
    gitlab-ctl stop unicorn
    gitlab-ctl stop sidekiq
    gitlab-ctl stop nginx
    
    #备份
    gitlab-rake gitlab:backup:create
    
    #查看当前版本
    [root@node1 ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
    11.9.12
    
    #下载gitlab的rpm安装包进行升级
    cd /server/tools
    wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
    rpm -Uvh gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
    cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
    11.11.8
    
    #访问重启后的gitlab,查看是否成功,继而升到最新版本
    wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm
    rpm -Uvh gitlab-ce-12.0.3-ce.0.el7.x86_64.rpm
    
    #更新配置
    gitlab-ctl reconfigure
    gitlab-ctl restart
    
    #查看新版本
    cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 
    12.0.3
    
    

    10. svn迁移到Gitlab

    1.安装svn服务器,将svn中的数据迁移到git仓库
    git-svn
    git clone svn

    svn是一个中心化的版本控制工具,git是分布式的,每个人都可以有完整的代码仓库

    #安装svn
    yum install subversion -y
    mkdir /svn/repo -p
    
    #初始化仓库
    svnadmin create /svn/repo
    
    cd /svn/repo/conf
    vim  svnserve.conf
    [general]
    anon-access = none
    auth-access = write
    password-db = passwd
    authz-db = authz
    realm = /svn/repo
    [sasl]
    
    vim passwd
    [users]
    admin = 123456
    
    vim authz
    [/]
    admin = rw
    test = r
    
    启动svn服务
    svnserve -d -r /svn/repo
    
    #svn迁移到git
    yum  install  git-svn  -y
    git svn clone svn://10.0.0.11 --username=admin --no-metadata --authors-file=password.txt git
    
    cat password.txt
    admin=<245684979@qq.com>
    
    

    11. 忘记gitlab的root密码

    甚至也忘记了邮箱,或许是默认邮箱无法使用
    需要在服务器上面直接修改数据

    gitlab-rails console production
    
    user = User.where(id: 1).first
    user.password = 'secret_pass'
    user.password_confirmation = 'secret_pass'
    user.save!
    
    如下提示代表成功:
    irb(main):004:0> user.save!
    Enqueued ActionMailer::DeliveryJob (Job ID: 7dc9cc44-0296-4a62-8b9a-335d4d5da11b) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", gid://gitlab/User/1
    => true
    
    

    ☆3. 持续部署

    3.1 用脚本实现html类型自动化代码上线

    脚本需求:
    假设1一个集群有5个节点
    a:实现一键部署5个节点
    b:实现一键回滚到上个版本(秒级回滚) web web_v0.1 web_v0.2

    gitlab 拉取代码
    本地打包
    for 循环
    do
    scp  目标主机  传输压缩包
    从负载均衡上摘下来
    ssh   目标主机  解压压缩包,  删除软连接,新建软连接
    curl  访问  200
    从负载均衡上加回去
    done
    
    

    3.2 准备环境

    gitlab 10.0.0.11
    lb01负载均衡 10.0.0.5
    web01 10.0.0.7
    web02 10.0.0.8

    #lb01,web01,web02都安装nginx
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum install nginx -y
    grep -Ev '^$|#' nginx.conf.default > nginx.conf
    
    

    配置lb01负载均衡

    #修改nginx.conf配置文件
    [root@lb01 nginx]# vim nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        upstream monitor {
        include /etc/nginx/upstream_monitor;
        }
        server {
            listen       80;
            server_name  www.in365robot.com;
            location / {
           proxy_pass http://monitor;
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $remote_addr;
            }
        }
    }
    
    #创建upstream资源池文件
    vim  /etc/nginx/upstream_monitor
    server 10.0.0.7;
    server 10.0.0.8;
    
    #检查语法并重启nginx
    nginx -t
    systemctl restart nginx
    systemctl enable nginx
    
    

    配置web01和web02,文件配置内容相同

    vim /etc/nginx/nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  in365robot.com;
            location / {
                root   /usr/share/nginx/html/web;
                index  index.html index.htm;
            }
        }
    }
    
    #检查语法并重启nginx
    nginx -t 
    systemctl restart nginx
    systemctl enable nginx
    
    

    在web01上创建首页并创建软连接

    mkdir /usr/share/nginx/html/web_v1
    cd /usr/share/nginx/html/
    echo 'web01' >/usr/share/nginx/html/web_v1/index.html
    ln -s /usr/share/nginx/html/web_v1 /usr/share/nginx/html/web
    ls
    web  web_v1
    
    

    在web02上创建首页并创建软连接

    mkdir /usr/share/nginx/html/web_v1
    cd /usr/share/nginx/html/
    echo 'web02' >/usr/share/nginx/html/web_v1/index.html
    ln -s /usr/share/nginx/html/web_v1 /usr/share/nginx/html/web
    ls
    web  web_v1
    
    

    在windows上做hosts解析

    C:\Windows\System32\drivers\etc\hosts
    
    10.0.0.5 www.in365robot.com
    
    
    image

    3.3 新建gitlab项目

    image

    流程

    image
    #在gitlab上
    git config --global user.name "Administrator"
    git config --global user.email "admin@example.com"
    mkdir /code
    cd /code/
    ls
    wget http://192.168.37.202/linux59/monitor_html.tar.gz
    ls
    tar  xf monitor_html.tar.gz 
    cd monitor/
    ls
    ls .git/
    git branch 
    git log --oneline 
    
    [root@k8s-node2 monitor]# mkdir -p /server/scripts
    [root@k8s-node2 monitor]# cd /server/scripts/
    
    ============================================================
    [root@lb scripts]# cat auto_deploy.sh 
    #!/bin/bash
    
    serverlist="10.0.0.7 10.0.0.8"
    
    #代码更新
    
    fabu() {
    cd /code/monitor/ && \
    git pull -u origin 
    version=`git tag|tail -1`
    echo $version
    tar zcf /code/monitor_${version}.tar.gz *
    
    for ip in $serverlist
    do
      scp -rp /code/monitor_${version}.tar.gz root@${ip}:/code
      ssh  root@${ip} "mkdir -p /code/web_${version}  && 
                  tar xf /code/monitor_${version}.tar.gz -C /code/web_${version} && \
                  rm -fr /code/web && ln -s /code/web_${version} /code/web && rm -fr /code/monitor_${version}.tar.gz "
    done
    }
    
    huigun() {
       cd /code/monitor/
       version=`git tag|tail -1`
       last_version=`git tag|tail -2|head -1`
       for ip in $serverlist
       do
            ssh root@${ip} "rm -fr /code/web && ln -s /code/web_${last_version} /code/web"
       done
    }
    
    case $1 in
    deploy)
       fabu;
    ;;
    rollback)
        huigun;
    ;;
    *)
       echo '无效的参数';
    esac
    
    ========================================================
    
    [root@lb ~]# ssh-keygen -t rsa
    [root@lb ~]# cat /root/.ssh/id_rsa.pub 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsPPhatOoCoYEt/PBoKeC6Kd8Uj+Ll+dD0Bnrw3aiYsL7fWc83bCyp45wub31Wqt7sCcoqxuqwbidk6vlsZyb3CbGKxVcroMln91ASD+bmaYIJkl4KINAqktTzBIIDLRG0GUYRZw9npNq5d0MCc1XLTSmoAWpWpvuwIEpCFJcSYwSlUWkEXWtEFkJX5oWCNJX77iCfCp00JJI7TF59gReUojZ2YcXzxBSNz/lAvcvudcflJvu/rc9nBXMnwtXEYiY/QfXk2I9igqfR1lfU2FnfptJOKHKHHibajkuGVaovMypiBQxm66fHG88z7ZL+05+IDk/+LBj5In/tkYi1VWi5 root@lb
    
    

    添加秘钥

    image

    相关文章

      网友评论

          本文标题:linux学习--week21--分布式版本控制系统Git、gi

          本文链接:https://www.haomeiwen.com/subject/gaqrnctx.html