• 持续集成


    第一章 Devops介绍

    1.1 Devops是什么

    *DevOps一次词的来自于Development和Operations的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。
    **是一种方法,一种过程,一种理念:狭义上指共同协作,广义上指所有软件生命周期内所有参与的角色
    

    参考文章:http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html
    https://www.cnblogs.com/yinzhengjie/p/9581653.html

    1.1 Devops能干嘛

    提高产品质量
    自动化测试
    持续集成
    代码质量管理工具
    程序员鼓励师
    

    1.1 Devops如何实现

    产品设计成型 -> 开发人员开发代码 -> 测试人员测试功能 -> 运维人员发布上线
    持续集成 (Continuous integration,简称CI)
    持续交付(Continuous delivery)
    持续部署(continuous deployment)
    

    第二章 版本控制系统

    2.1 版本控制系统简介

    vcs `version control system`
    1) 版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本内容情况的系统
    2) 记录文件的所有历史变化
    3) 随时可恢复到任何一个历史状态
    4)多人协作开发
    

    2.2 为什么需要版本控制系统

    在软件开发过程,每天都会产生新的代码,代码合并的过程中可能会出现如下问题:

    代码被覆盖或丢失
    代码写的不理想希望还原之前的版本
    希望知道与之前版本的差别
    是谁修改了代码以及为什么修改
    发版时希望分成不同的版本(测试版、发行版等)
    

    因此,我们希望有一种机制,能够帮助我们:

    可以随时回滚到之前的版本
    协同开发时不会覆盖别人的代码
    留下修改记录,以便随时查看
    发版时可以方便的管理不同的版本
    

    2.3 SVN

    SVN是Subversion的简称,是一个开源的集中式版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不可访问,所有的使用者无法使用SVN,无法进行提交或备份文件,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。
    说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。

    2.4 Git

    Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
    Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
    Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
    

    github是基于git的在线web页面代码托管平台,可以选择付费服务
    gitlab可以认为是一个开源的github,两者没有直接关系
    

    2.5 SVN与Git的区别

    1)SVN与Git的最主要的区别(核心区别)
    SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
    Git不仅仅是分布式版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
    2)Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
    3)Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
    4)Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
    5)Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

    第三章 SVN

    第四章 Git

    4.1 系统环境准备

    [root@git:~]# cat /etc/redhat-release 
    CentOS Linux release 7.5.1804 (Core)
    [root@git:~]# uname -r
    3.10.0-862.el7.x86_64
    

    4.2 Git安装部署

    4.2.1 在windows中安装git

    在windows上和mac上安装git都很方便,我们可以从官方网站上下载安装包,按照默认配置快速安装(一直下一步),访问git官网,即可下载git,git的官方网址如下:

    https://git-scm.com/downloads
    

    1)在windows中安装git的过程中,如果你没有修改默认的设置,当安装完成后,安装程序会自动为你安装两种客户端,一种是图形化的客户端,一种是命令行的客户端.

    2)图形化的客户端被称之为"Git GUI",命令行的客户端被称之为"Git Bash",在系统的"开始"菜单中可以找到"Git GUI"和"Git Bash",同时,默认情况下,当你安装完成git后,你的右键菜单中会多出两个选项,"Git GUI Here"和"Git Bash Here",通过这两项,你可以在任何目录中打开"Git GUI"和"Git Bash","Git GUI"和"Git Bash"都是客户端程序,我们可以通过这两种程序中的任意一种来操作git,从而达到版本控制的目的,这两种工具在不同的使用场景下各有优势,命令行的优势在于比较通用,而且当你需要编写一些版本控制的自动化脚本时,无可避免的需要使用git命令,使用图形化的好处就是比较直观,所以,我们有可能会交替的使用这两种工具,但是主要以命令行的使用模式为主,因为只要理解了相关概念和git命令后,
    再去使用任何一种图形化工具,都是非常简单的。

    3)除了gitk(默认安装的图形化客户端就包含了gitk),比较出名的git图形化工具还有SourceTree、TortoiseGit、GitHubDesktop、GitKraken、GitUp等,当你熟悉了git命令以后,再去操作这些图形化工具都会变得游刃有余。
    安装工作完成后,还需要一些初始化的设置,才能开始使用git,配置方法见下文。

    4.2.2 在centos中安装git

    在linux中,有可能已经自动安装了git,也有可能没有,当服务器中的某些脚本需要使用git命令时,我们就需要确保服务器上已经安装了git,一般使用1.x版本即可,此处以centos7为例,演示怎样安装git的2.X版本。

    即使你的centos7中默认安装了git,git的版本应该也是1.X,因为默认的yum源中,git的版本就是1.X,到目前为止,这个版本应该算是比较老的版本了,所以,如果你的centos7上没有安装git,而你又需要安装git,可以直接安装git的2.X版本。
    你可以通过编译源码的方式安装git的最新版,也可以通过yum源的方式安装git的2.X版本,此处演示yum源方式的安装与配置,此时,我的centos7上还没有任何版本的git,安装配置过程如下:

    首先,我已经在我的centos7中安装了base源和epel源,因为之后的安装包需要依赖这两个源,base源和epel源的配置分别如下

    # cat /etc/yum.repos.d/aliBase.repo
    [aliBase]
    name=aliBase
    baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-$releasever
     
    # cat /etc/yum.repos.d/aliEpel.repo
    [aliEpel]
    name=aliEpel
    baseurl=https://mirrors.aliyun.com/epel/$releaseverServer/$basearch/
    enabled=1
    gpgcheck=0
    

    上述基础配置工作完成后,我们需要下载一个安装包,这个安装包会自动为我们配置git2.X需要的yum源,你可以从官网推荐的网址中下载,我选择的是针对centos7的安装包,执行如下命令下载并安装

    # wget https://repo.ius.io/ius-release-el7.rpm
    # yum install ius-release-el7.rpm
    

    上述包安装完成后,会自动为我们配置ius仓库,我们可以通过ius仓库安装git2.X版本,命令如下:

    # yum install -y git2u
    

    完成上述操作,即可在终端中使用git命令了。
    上述过程并没有安装默认的图形化客户端,因为大部分linux服务器都不会开启图形化,如果你需要,可以执行如下命令安装gitk(gitk是windows中和mac中默认安装的图形化客户端工具)

    # yum install git2u-gitk
    

    4.2.3 配置用户和邮箱

    如果想要使用git进行版本管理,我们首先要做的就是,设置自己的"用户名"和"用户邮箱",这些信息是必须的,特别是在多人协作时,这些信息也是非常必要的,所以,在完成安装操作以后,我们首先要做的就是设置自己的"用户名"和"用户邮箱",这些信息只需要设置一次,就可以一直正常的使用git,除非你有需要修改这些信息。

    我们可以使用如下两条命令,设置用户名和邮箱

    注:我的系统是win10,你可以打开"Git Bash",然后执行下列命令,也可以使用win10自带的终端(比如power shell)执行如下命令,在Linux、Unix或Mac中,打开系统自带的终端输入如下命令即可。

    $ git config --global user.name "nsthink"
    # 配置git使用用户     
    $ git config --global user.email "ns@nsthink.net"
    # 配置git使用邮箱
    $ git config --global color.ui true
    # 语法高亮
    

    将上述命令中的用户名和邮箱修改成你自己的用户名和邮箱即可,上述命令不言自明,看字面意思就能理解,git config命令是用来对git进行配置操作的一条命令,user.name和user.email分别用来设定用户名和邮箱,至于"--global"选项是什么意思,如下:

    从字面上看,"--global"的意思是"全局的",也就是说,如果我们在设置用户名和用户邮箱的时候,使用了这个选项,那么,当前系统用户(windows系统用户)创建的所有Git仓库都会使用这个用户名和邮箱,除了"--global"选项,还有"--local"选项和"--system"选项,没错,聪明如你一定想到了,我们可以通过这三个选项控制设置作用域的范围,这三个选项的作用域如下:
    git config --system:使对应配置针对系统内所有的用户有效
    git config --global:使对应配置针对当前系统用户的所有仓库生效
    git config --local:使对应配置只针对当前仓库有效
    local选项设置的优先级最高。
    

    如果想要查看对应作用域的设置,可以使用如下命令:

    git config --system --list
    git config --global --list
    git config --local --list
    

    说明:我们在设置用户名和邮箱时,通常会使用"--global"选项,因为这样我们只需要设置一次,当前用户的所有仓库都会使用这些用户名和邮箱信息,即使是当前用户新创建的仓库,也会使用同样的配置,如果使用"--system"选项,可能会影响到系统中的其他系统用户,如果使用"--local"选项,当信息不需要变化时,每次创建新仓库时又都需要重复的为新仓库设置一次,所以,当设置用户名和邮箱时,"--global"选项最常用。

    4.2.3 初始化

    1)初始化工作目录

    #说明:
    我们需要使用git进行版本管理时,要接触的第一个概念就是"仓库",你可以把"仓库"理解成一个目录,只有这个目录中的文件才能被git管理,换句话说就是,如果你想要对某个文件进行版本管理,你就需要把这个文件放入到一个带有git功能的目录中,这个带有git功能的目录就是所谓的git仓库,git仓库的英文为"git repository",后文中所提到"仓库"、"版本库"、"repository"、"repo"其实都是一种东西,我们会不加区分的使用这些名词,它们都表示"仓库",当你把一个文件加入到某个git仓库以后,你对这个文件的所有操作都可以被git记录,从而实现版本管理的目的。
    所以,为了使用git进行版本管理,我们首先要做的,就是创建一个git repository。
    我们可以直接创建一个空的git仓库,也可以将一个已经存在目录转化成git仓库,我们先来看看怎样创建一个全新的、空的git仓库(操作系统为centos7)。
    
    mkdir git_data  #创建目录
    [root@git:~/git_data]# cd git_data
    [root@git:~/git_data]# git init # 初始化
    [root@git:~/git_data]# tree ./.git
    ./.git
    ├── branches
    ├── config
    ├── description
    ├── HEAD
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags
    
    git status #查看工作区状态
    

    隐藏文件介绍:

    branches  # 分支目录
    config # 定义项目特有的配置选项
    descripttion # 仅供git web程序使用
    HEAD # 显示当前的分支
    hooks # 包含git钩子文件
    info # 包含一个全局排除文件(exclude文件)
    objects # 存放所有数据内容,有info和pack两个子文件夹
    refs # 存放指向数据(分支)的提交对象的指针
    index # 保存暂存区信息,在执行git init的时候,这个文件还没有
    

    4.3 Git常规使用

    4.3.1 创建数据-提交数据

    4.3.2 git四种状态

    4.3.3 git基础命令

    4.3.3.1 添加文件

    [root@git:~/git_data]# git status
    # On branch master
    [root@git:~/git_data]# git add a b c
    [root@git:~/git_data]# git add a  #将a文件添加到暂存区
    [root@git:~/git_data]# git status #查看当前仓库的状态
    # On branch master
    #
    # Initial commit
    #
    # Changes to be committed:
    #   (use "git rm --cached <file>..." to unstage)  #使用此选项撤出暂存区
    #
    #	new file:   a
    [root@git:~/git_data]# tree ./.git
    ./.git
    ├── branches
    ├── config
    ├── description
    ├── HEAD
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   └── update.sample
    ├── index   #新生成一个index目录
    ├── info
    │   └── exclude
    ├── objects
    │   ├── e6
    │   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags
    
    10 directories, 15 files
    [root@git:~/git_data]# git add . #使用git add .或者*添加目录中所有改动过的文件到暂存区
    
    ##此时还未被版本控制系统管理起来,还未添加到本地仓库
    

    4.3.3.2 删除文件

    1.先从暂存区撤回到工作区,然后直接删除文件
    [root@git:~/git_data]# git rm --cached c
    [root@git:~/git_data]# rm -f c
    
    2.直接从工作区域和暂存区域一同删除文件命令
    [root@git:~/git_data]# git rm -f b
    

    4.3.3.3 提交到本地仓库

    
    # git commit -m
    [root@git:~/git_data]# git commit -m "commit a" #提交到本地仓库
    [master (root-commit) 63d575c] commit a   #生成一个哈希值
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 a
    
    [root@git:~/git_data]# git status
    # On branch master
    nothing to commit, working directory clean
    

    小结:如何真正意义上通过版本控制系统管理文件

    1.工作目录必须有个代码文件
    2.通过git add file 添加到暂存区域
    3.通过git commit -m "你自己输入的信息" 添加到本地仓库
    
    #### 4.3.3.4 修改文件名称
    ```bash
    git mv old-filename new-filename 
    直接更改文件名称,更改完直接commit提交即可
    

    4.3.3.5 git文件的比对

    git diff #默认比对工作目录和暂存区有什么不同
    git diff --cached 比对暂存区域和本地仓库有什么不同
    
    [root@git:~/git_data]# echo index >a
    [root@git:~/git_data]# cat a 
    index
    [root@git:~/git_data]# git diff
    diff --git a/a b/a
    index e69de29..9015a7a 100644
    --- a/a
    +++ b/a
    @@ -0,0 +1 @@
    +index
    [root@git:~/git_data]# git add a 
    [root@git:~/git_data]# git diff
    [root@git:~/git_data]# git diff --cached
    diff --git a/a b/a
    index e69de29..9015a7a 100644
    --- a/a
    +++ b/a
    @@ -0,0 +1 @@
    +index
    [root@git:~/git_data]# git commit -m "add index"
    [master fc54d42] add index
     1 file changed, 1 insertion(+)
    [root@git:~/git_data]# git diff
    [root@git:~/git_data]# git diff --cached
    

    说明:
    如果某个文件已经被仓库管理,如果再更改此文件,直接需要以下一条命令即可:

    git commit -am "add newfiile"
    
    # git commit #相当于虚拟机的镜像,任何操作都被做了一次快照,可以恢复到任意一个位置
    

    4.3.3.6 查看历史提交信息

    git log #查看历史的git commit快照操作
    
    git log --oneline # 单行显示历史信息
    
    git log --oneline --decorate # 显示当前的指针指向哪里
    
    git log -p # 显示具体内容的变化
    
    git log -1 # 显示最近的一条commit内容 
    
    git reflog # 查看所有的历史操作
    
    git log --oneline --decorate # 查看当前指针的指向(当前的指针指向哪里说明在那个版本上)
    

    4.3.3.6 恢复历史数据

    git reset --hard 824u329  # 回滚数据到某一个提交
    
    [root@git:~/git_data]# git log --oneline
    fc54d42 add index
    63d575c commit a
    [root@git:~/git_data]# git reset --hard 63d575c
    HEAD is now at 63d575c commit a
    

    4.4 Git分支

    4.41 创建及删除分支

      分支即是平行空间,假设你在为某个手机系统研发拍照功能,代码已经完成了80%,但如果将这不完整的代码直接提交到git仓库中,又有可能影响到其他人的工作,此时我们便可以在该软件的项目智商创建一个名叫"拍照功能"的分支,这种分支只会属于你自己,而其他人看不到,等代码编写完成后再与原来的项目主分支合并下即可,这样即能保证代码不丢失,又不影响其他人的工作
    

      一般在实际的项目开发中,我们要尽量保证master分支是非常稳定的,仅用于发布新版本,平时不要随便直接修改里面的数据文件,而工作的时候则可以新建不同的工作分支,等到工作完成后在合并到master分支上面,所以团队的合作分支看起来会像上面图那样。
    [root@git:~/git_data]# git log --oneline --decorate
    63d575c (HEAD, master) commit a #查看分支指向
    [root@git:~/git_data]# git branch testing #创建一个测试分支
    [root@git:~/git_data]# git branch #查看分支
    * master
      testing
    [root@git:~/git_data]# git checkout testing  #切换到testing分支,对应的HEAD指针也指向了testing
    Switched to branch 'testing'
    [root@git:~/git_data]# git branch
      master
    * testing    # *号在哪里就说明当前在哪个分支上
    #也可以直接创建testing分支并切换到testing分支上
    git checkout -b testing
    
    [root@git:~/git_data]# git branch -d testing  #删除testing分支
    

    4.42 代码合并

    思路:

    1,首先在master上创建aaa,bbb,ccc文件,然后再创建testing分支,此时切换到master主干上会发现aaa,bbb,ccc文件均被复制过来了,即会从主干复制一份完整的代码到分支上
    2,切换到master上创建master-eee文件,再切换到testing分支上,创建test-ddd文件,此时会发现master与testing分支的文件相互独立
    3,然后通过merge完成代码的合并
    

    实现步骤:

    [root@git:~/git_data]# touch aaa bbb ccc
    [root@git:~/git_data]# git add aaa bbb ccc
    [root@git:~/git_data]# git commit -m "add aaa bbb ccc "
    
    # 创建testing分支
    [root@git:~/git_data]# git checkout -b testing  #创建并切换到testing分支
    [root@git:~/git_data]# touch test-ddd  #创建test-ddd文件
    [root@git:~/git_data]# git add .  #添加到暂存区
    [root@git:~/git_data]# git commit -m "add newfile test-ddd"  #提交到本地仓库
    [testing b0d3133] add newfile test-ddd
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 test-ddd
    [root@git:~/git_data]# git branch
      master
    * testing
    [root@git:~/git_data]# git log --oneline --decorate  #查看指针
    b0d3133 (HEAD, testing) add newfile test-ddd
    88e8975 (master) add aaa bbb ccc
    63d575c commit a
    [root@git:~/git_data]# git checkout master  #切换到master主干
    Switched to branch 'master'
    [root@git:~/git_data]# git branch
    * master
      testing
    [root@git:~/git_data]# ll  #发现并没有test-ddd文件
    total 0
    -rw-r--r-- 1 root root 0 May 26 20:21 a
    -rw-r--r-- 1 root root 0 May 26 22:19 aaa
    -rw-r--r-- 1 root root 0 May 26 22:19 bbb
    -rw-r--r-- 1 root root 0 May 26 22:19 ccc
    [root@git:~/git_data]# git log --oneline --decorate  #master的指针还是指向最近的一次操作
    88e8975 (HEAD, master) add aaa bbb ccc
    63d575c commit a
    
    #同理在master主干上创建master-eee文件
    [root@git:~/git_data]# touch master-eee
    [root@git:~/git_data]# git add .
    [root@git:~/git_data]# git commit -m "add newfile master-eee"
    [master 0fc1d63] add newfile master-eee
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 master-eee
    [root@git:~/git_data]# git log --oneline --decorate
    0fc1d63 (HEAD, master) add newfile master-eee
    88e8975 add aaa bbb ccc
    63d575c commit a
    
    #代码合并
    [root@git:~/git_data]# git merge testing
    Merge made by the 'recursive' strategy.
     test-ddd | 0
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 test-ddd
    [root@git:~/git_data]# ll
    total 0
    -rw-r--r-- 1 root root 0 May 26 20:21 a
    -rw-r--r-- 1 root root 0 May 26 22:19 aaa
    -rw-r--r-- 1 root root 0 May 26 22:19 bbb
    -rw-r--r-- 1 root root 0 May 26 22:19 ccc
    -rw-r--r-- 1 root root 0 May 26 23:07 master-eee
    -rw-r--r-- 1 root root 0 May 26 23:12 test-ddd
    [root@git:~/git_data]# gitlog --oneline --decorate"
    2f17cc5 (HEAD, master) Merge branch 'testing'
    0fc1d63 add newfile master-eee
    b0d3133 add newfile test-ddd
    88e8975 add aaa bbb ccc
    63d575c commit a
    
    #说明:合并完之后,testing就变成老的代码了,没用了,如果想要开发新的功能可以将原分支删除,重新创建一个分支即可
    [root@git:~/git_data]# git branch -d testing
    Deleted branch testing (was b0d3133).
    

    4.43 代码冲突合并

    [root@git:~/git_data]# git branch
    * master
      testing
    
    # master主干的aaa文件
    [root@git:~/git_data]# cat aaa
    [root@git:~/git_data]# echo master >> aaa
    [root@git:~/git_data]# cat aaa
    master
    [root@git:~/git_data]# git commit -am "modifide aaa master"
    [master 53322f7] modifide aaa master
     1 file changed, 1 insertion(+)
    [root@git:~/git_data]# git status
    # On branch master
    nothing to commit, working directory clean
    
    #testing分支上的aaa文件
    [root@git:~/git_data]# git checkout testing
    Switched to branch 'testing'
    [root@git:~/git_data]# cat aaa
    [root@git:~/git_data]# echo testing >> aaa
    [root@git:~/git_data]# git commit -am "modified add testing"
    [testing 33e4aa4] modified add testing
     1 file changed, 1 insertion(+)
    [root@git:~/git_data]# cat aaa
    testing
    
    
    #合并
    [root@git:~/git_data]# git checkout master
    Switched to branch 'master'
    [root@git:~/git_data]# git merge testing
    Auto-merging aaa
    CONFLICT (content): Merge conflict in aaa
    Automatic merge failed; fix conflicts and then commit the result. #有冲突
    [root@git:~/git_data]# cat aaa 
    <<<<<<< HEAD
    master
    =======
    testing
    >>>>>>> testing
    [root@git:~/git_data]# vim aaa  #编辑aaa文件,删除多余的符号,保留我们想要的内容
    master
    testing
    
    [root@git:~/git_data]# git commit -am "merge testing"
    [master 227b961] merge testing
    [root@git:~/git_data]# git status
    # On branch master
    nothing to commit, working directory clean
    

    4.44 git标签使用

    说明:
    标签也是指向了一次commit提交,是一个里程碑式的标签,回滚打标签直接加标签号,不需要加唯一字符串不好记

    [root@git:~/git_data]# git tag -a v1.0 -m "aaa bbb master testing version v1.0"
    # -a制定标签名字,-m指定说明文字
    [root@git:~/git_data]# git tag
    [root@git:~/git_data]# git tag -a v2.0 0fc1d63 -m "add master-eee version v2.0"
    # 指定某一次的提交为标签
    
    [root@git:~/git_data]# git show v1.0 #查看v1.0的信息,git show 
    tag v1.0
    Tagger: nsthink <ns@nsthink.net>
    Date:   Wed May 27 11:22:31 2020 +0800
    
    aaa bbb master testing version v1.0
    
    # 直接还原数据到v2.0
    [root@git:~/git_data]# git reset --hard v2.0  
    HEAD is now at 0fc1d63 add newfile master-eee
    
    # 删除标签 -d参数
    [root@git:~/git_data]# git tag -d v2.0
    Deleted tag 'v2.0' (was 4d97acf)
    
    # 第五章 github
    ## 5.1 github简介 
    ```bash
    Github顾名思义是一个Git版本库的托管服务,是目前全球最大的软件仓库,拥有上百万的开发者用户,也是软件开发和寻找资源的最佳途径,Github不仅可以托管各种Git版本仓库,还拥有了更美观的Web界面,您的代码文件可以被任何人克隆,使得开发者为开源项贡献代码变得更加容易,当然也可以付费购买私有库,这样高性价比的私有库真的是帮助到了很多团队和企业。
    

    5.2 github使用实例

    1,注册用户-2,配置ssh-key-3,创建项目-4,克隆项目到本地-5,推送新代码到github
    

    第一步:配置ssh-key

    [root@git:~/git_data]# ssh-keygen -t rsa
    [root@git:~/git_data]# cat ~/.ssh/id_rsa.pub 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDirhStoLJjzjQzTgb57atLBkDZvVlIQrZAvG34rG70cLcVatI5vT5qQS+R7qdcJ02iQLYMAbFd0JVKZoyN321nuVkGCtSQ29q1TvwC3i+JVhy2F0ObLWpeW2ZZ3GUt1pqjsyVSEmU5Y/eXuldMMArc/ChM3fWcBXp+kxSjbGUABaDPW6MMM+g/n5kkCvFnO7YMDFHVu5DKdgW8ul/FyawQwoTTF1YBGqWGnm6QbTL3g4rELzd/OVYqg2LqbrENa/A5fzujs5+SNFkMIxvXWiLYetc9aC0j8I4lCAaJEE4/kaYVIteM8YYgwSqYY9e8znDRk9dcKyVa0ZAOmIoO6mBB root@git
    

    第二步:Github中ssh设置

    Settings---SSH and GPG keys---New SSH key
    
    Title名称自定义:git_data,然后将密钥粘贴进去即可
    

    第三步:创建仓库

    右上角New repository--自定义仓库名--SSH
    

    根据GitHub的提示,在本地的git_data仓库下运行命令:

    第四步:本地仓库与远端仓库连接

    [root@git:~/git_data]# git remote add origin git@github.com:michaelni666/git_data.git
    #这时执行git remote,就是先将本地仓库与远端仓库建立一个链接,origin其实就是你为远端仓库所起的名字,一般都是叫origin,其实你也可以要Ceres 或者Earth,git@github.com:michaelni666/git_data.git才是远端仓库的真实地址
    **第五步:推送本地代码到远端**
    [root@git:~/git_data]# git push -u origin master
    #把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
    #由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把#本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
    #推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样
    


    从现在起,只要本地作了提交,就可以通过命令:

    $ git push origin master
    

    把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
    第六步:克隆项目到本地

    [root@git:/tmp]# git clone git@github.com:michaelni666/git_data.git
    Cloning into 'git_data'...
    remote: Enumerating objects: 7, done.
    remote: Counting objects: 100% (7/7), done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 7 (delta 1), reused 7 (delta 1), pack-reused 0
    Receiving objects: 100% (7/7), done.
    Resolving deltas: 100% (1/1), done.
    

    第五章 gitlab

    5.1 gitlab简介

    1)GitLab是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用。
    2)Git的家族成员
    Git:是一种版本控制系统,是一个命令,是一种工具。
    Gitlib:是用于实现Git功能的开发库。
    Github:是一个基于Git实现的在线代码托管仓库,包含一个网站界面,向互联网开放。
    GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业、学校等内部网络搭建git私服。
    3)Gitlab的服务构成
    Nginx:静态web服务器。
    gitlab-shell:用于处理Git命令和修改authorized keys列表。
    gitlab-workhorse: 轻量级的反向代理服务器。
    logrotate:日志文件管理工具。
    postgresql:数据库。
    redis:缓存数据库。
    sidekiq:用于在后台执行队列任务(异步执行)。
    unicorn:An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。
    
    1. GitLab工作流程

      5)常用的网站:
    官网:https://about.gitlab.com/
    国内镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
    

    5.2 gitlab安装环境要求

    1) Centos 6/7
    2) 2GB内存(实验) 生产(至少4G)
    3) 安装包:gitlab-ce-10.2.2-ce
    4) 禁用防火墙,关闭selinux
    

    5.3 gitlab安装部署

    官网安装手册:https://about.gitlab.com/install/#centos-7
    安装包地址:https://packages.gitlab.com/gitlab/gitlab-ce
    # 配置yum源
    [root@git:~]# 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
    
    # 更新本地yum缓存
    [root@git:~]# yum makecache
    
    #安装依赖包
    [root@git:~]# yum install -y curl policycoreutils-python openssh-server
    
    #yum安装
    [root@git:~]# yum install gitlab-ce #自动安装最新版
    [root@git:~]# yum install gitlab-ce-10.2.2-ce.0.e17.x86_64 #安装指定版本
    
    #修改url为本机IP地址
    [root@git:~]# vim /etc/gitlab/gitlab.rb
    external_url 'http://10.0.0.81'
    [root@git:~]# gitlab-ctl reconfigure
    ## 5.3 GitLab常用命令
    gitlab-ctl start       # 启动所有 gitlab 组件;
    gitlab-ctl stop        # 停止所有 gitlab 组件;
    gitlab-ctl stop nginx  # 单独停止某个服务
    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        # 查看日志;
    ## 5.4 GitLab常用目录
    /opt/gitlab/  #gitlab的程序安装目录
    /var/opt/gitlab  #gitlab目录数据目录
    /var/opt/gitlab/git-data #存放仓库数据
    

    5.5 登录GitLab

    1) 在浏览器输入10.0.0.81,定义密码gitlab@23

    2)输入root----gitlab@123进行登陆


    3)自定义log与登陆描述信息

    Navigation bar--Sign in/Sign up pages
    

    5.6 Gitlab使用方法

    (New group)创建组-->(New project)创建组-->创建用户
    

    5.6.1 创建组

    5.6.2 创建项目

    5.6.3 设置ssh_key并推送代码

    [root@git:~/git_data]# git remote remove origin #删除github上的远程仓库
    [root@git:~/git_data]# git remote add origin git@10.0.0.81:test/git_data.git  #添加自己的远程仓库
    [root@git:~/git_data]# git push -u origin master  #推送代码
    The authenticity of host '10.0.0.81 (10.0.0.81)' can't be established.
    ECDSA key fingerprint is SHA256:/62564+0Ae8eMMfBYw299SMutxWrf+s+Eoas2NyUuAQ.
    ECDSA key fingerprint is MD5:0b:20:48:6c:b8:a4:ee:a5:45:8b:cc:64:30:29:56:33.
    Are you sure you want to continue connecting (yes/no)? yes     
    Warning: Permanently added '10.0.0.81' (ECDSA) to the list of known hosts.
    Counting objects: 7, done.
    Compressing objects: 100% (5/5), done.
    Writing objects: 100% (7/7), 570 bytes | 0 bytes/s, done.
    Total 7 (delta 1), reused 0 (delta 0)
    To git@10.0.0.81:test/git_data.git
     * [new branch]      master -> master
    Branch master set up to track remote branch master from origin.
    

    5.6.4 设置dev用户并下载代码

    1)创建一个测试文件并推送到gitlab

    [root@git:~/git_data]# touch test.txt
    [root@git:~/git_data]# git add .
    [root@git:~/git_data]# git commit -m "newfile test.txt"
    [master 017cfc3] newfile test.txt
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 test.txt
    [root@git:~/git_data]# git push -u origin master
    Counting objects: 3, done.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (2/2), 251 bytes | 0 bytes/s, done.
    Total 2 (delta 1), reused 0 (delta 0)
    To git@10.0.0.81:test/git_data.git
       0fc1d63..017cfc3  master -> master
    Branch master set up to track remote branch master from origin.
    

    2)创建一个dev用户


    3)将dev用户添加到test组中并设置权限

    此时我们用dev用户去登陆gitlab即可看到自己账户下有一个test项目

    同理,我们在dev的用户下加入公钥进行ssh认证:

    [root@dev:~]# ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:/y4XonPh38wRvUrXkkCKy8IoD0vV5NRQEtl4b8+F5vo root@jenkins
    The key's randomart image is:
    +---[RSA 2048]----+
    |      +*.        |
    |      o+o        |
    |      o...  ..   |
    |     =   .ooo .. |
    |    . o S..=... .|
    |   . o . oo =. oo|
    |  + . o oo.+ o+o.|
    | . =   .o =.o+oo |
    |  . .    o *E.+  |
    +----[SHA256]-----+
    [root@dev:~]# cat .ssh/id_rsa.pub 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4FoFNDMoznM++Rb5d7M+/R+BC+9ccyAhJD1V0zQfEZolqQCtY+J6HJ8sVH6U3sVWCS7H+XsoypB4XGpHuDgVdHkdneCSVtvqp7u0mgsDN8ZkFFazx2ZgtEIg6bK/ausUKVagIlPXX9l0oDoJTWC7/sX3uUHy2uMFKeDhjCgau34kyoCmDrCVMWlWrwoERO2zwVxBRQVzkPDyI6GjJ83Ku+WIZkQctqHEOjgKSD6bWzrPzIsIUzlb9WCxCQMhwrVlxnTFDU9yfscHAU+POkUOw+jyHpaJO6jDgoJaxbor2MoFaQoG9EGdBNAH/y+//kbivEQpE4BwCjN51xic7pcMd root@jenkins
    

    4)dev用户下载代码

    [root@dev:~]#git clone git@10.0.0.81:test/git_data.git
    Cloning into 'git_data'...
    The authenticity of host '10.0.0.81 (10.0.0.81)' can't be established.
    ECDSA key fingerprint is SHA256:/62564+0Ae8eMMfBYw299SMutxWrf+s+Eoas2NyUuAQ.
    ECDSA key fingerprint is MD5:0b:20:48:6c:b8:a4:ee:a5:45:8b:cc:64:30:29:56:33.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '10.0.0.81' (ECDSA) to the list of known hosts.
    remote: Enumerating objects: 9, done.
    remote: Counting objects: 100% (9/9), done.
    remote: Compressing objects: 100% (7/7), done.
    remote: Total 9 (delta 2), reused 0 (delta 0), pack-reused 0
    Receiving objects: 100% (9/9), done.
    Resolving deltas: 100% (2/2), done.
    [root@dev:~]# ls
    anaconda-ks.cfg  git_data
    

    5)dev用户提交代码

    [root@dev:~/git_data]# touch 123.txt
    [root@dev:~/git_data]# git add .
    [root@dev:~/git_data]# git commit -m "123.txt"
    
    *** Please tell me who you are.
    Run
      git config --global user.email "you@example.com"
      git config --global user.name "Your Name"
    to set your account's default identity.
    Omit --global to set the identity only in this repository.
    
    fatal: unable to auto-detect email address (got 'root@jenkins.(none)')
    [root@dev:~/git_data]# git config --global user.email "dev@example.com"
    [root@dev:~/git_data]# git config --global user.name "dev"
    [root@dev:~/git_data]# git commit -m "123.txt""
    [root@dev:~/git-data]# git checkout -b dev  #创建dev分支
    [root@dev:~/git-data]# git push -u origin dev  #推送dev分支
    

    5.65 master主干保护

    5.66 代码合并

    dev用户提交的代码一般是在dev分支上,并不能直接提交到master主干上,此时dev用户可以将新增的123.txt手动发起merge请求,待管理员审核通过后,即可合并到master上
    

    切换到dev用户下:

    切换到管理员用户:

    问题补充:

    #当我们在网页上进行合并代码之后,我们发现gitlab服务器上并没有新增的123.txt文件,此时我们需要执行git pull命令进行代码拉取,保持最新状态
    [root@git:~/git_data]# ll
    total 0
    -rw-r--r-- 1 root root 0 May 27 12:26 a
    -rw-r--r-- 1 root root 0 May 27 12:26 aaa
    -rw-r--r-- 1 root root 0 May 26 22:19 bbb
    -rw-r--r-- 1 root root 0 May 26 22:19 ccc
    -rw-r--r-- 1 root root 0 May 26 23:07 master-eee
    -rw-r--r-- 1 root root 0 May 30 17:05 test.txt
    [root@git:~/git_data]# git pull
    remote: Enumerating objects: 1, done.
    remote: Counting objects: 100% (1/1), done.
    remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
    Unpacking objects: 100% (1/1), done.
    From 10.0.0.81:test/git-data
       71b3f15..067b713  master     -> origin/master
    Updating 71b3f15..067b713
    Fast-forward
     123.txt | 0
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 123.txt
    [root@git:~/git_data]# ll
    total 0
    -rw-r--r-- 1 root root 0 May 30 19:34 123.txt
    -rw-r--r-- 1 root root 0 May 27 12:26 a
    -rw-r--r-- 1 root root 0 May 27 12:26 aaa
    -rw-r--r-- 1 root root 0 May 26 22:19 bbb
    -rw-r--r-- 1 root root 0 May 26 22:19 ccc
    -rw-r--r-- 1 root root 0 May 26 23:07 master-eee
    -rw-r--r-- 1 root root 0 May 30 17:05 test.txt
    
    在代码合并完之后,原分支要删除掉,如果还需要进行代码更新推送,此时需再次创建新的分支,下载最新的代码进行更新操作
    

    第六章 Jenkins

    6.1 简介

    官网 :https://jenkins.io
    官方文档 :https://jenkins.io/doc/
    安装手册:https://www.jenkins.io/doc/book/installing/
     Jenkins是一个开源的
     Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)基于Java开发的web界面的一种持续集成工具。
     Jenkins是一个工具集,提供了各种各样的插件
     比如获取git上最新的代码
     比如可以帮你编译源代码
     比如可以调用自定义的shell脚本远程执行命令
    
    

    6.2 安装准备

    最低配置: 不少于256M内存,不低于1G磁盘,jdk版本>=8

    # 安装两台服务器,关闭selinux和防火墙
    内存2G 50G+硬盘 //生产环境
    jenkins 10.0.0.82
    nexus 10.0.0.83
    

    6.3 安装部署

    wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
    yum upgrade (如果不能安装成功这一步可以忽略)
    yum install jenkins java-1.8.0-openjdk-devel
    systemctl start jenkins
    netstat -lntp     
    tcp6       0      0 :::8080                 :::*                    LISTEN      3763/java            
    

    6.4 Jenkins相关目录

    [root@jenkins:~]# rpm -ql jenkins
    /etc/init.d/jenkins
    /etc/logrotate.d/jenkins
    /etc/sysconfig/jenkins #配置文件,“端口”,“JENKINS_HOME"等都可以在这里配置
    /usr/lib/jenkins #安装目录,war包会放在这里面
    /usr/lib/jenkins/jenkins.war
    /usr/sbin/rcjenkins
    /var/cache/jenkins
    /var/lib/jenkins #默认的JENKINS_HOME
    /var/log/jenkins #日志目录 
    

    6.5 Jenkins配置

    1) 浏览器输入网址:10.0.0.82:8080
    2) 输入初始密码:

    [root@jenkins:~]# cat /var/lib/jenkins/secrets/initialAdminPassword
    75f54a6f0d284a5f8de3cbbc81984c21
    

    3) 安装插件:
    Jenkins部署完毕,如果不安装插件的话,那它就是一个光杆司令,啥事也做不了
    官方插件下载地址:http://updates.jenkins-ci.org/download/plugins/
    清华地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
    在下载Jenkins插件时比较慢,可以更换国内源Jenkins插件清华大学镜像地址,Update Site中更改
    法一:使用新手引导安装推荐的插件
    法二:可以直接在webUI上安装插件:

    插件管理--可选插件--安装
    

    法三:如果Jenkins所在机器网络限制的原因,无法直接通过【插件管理】直接下载插件,可以通过先下载好插件再上传

    [root@jenkins:~]# cd /var/lib/jenkins/plugins
    # 存放Jenkins插件包的目录
    [root@jenkins download]# tar xf plugins.tar.gz 
    # 解压jenkins插件包
    [root@jenkins download]# cp -a  plugins/* /var/lib/jenkins/plugins/
    #将解压后的文件拷贝到Jenkins存放插件包的目录
    [root@jenkins download]# /etc/init.d/jenkins restart
    #重启
    

    再次查看webUI界面,发现Jenkins插件已经安装完毕

    4) 修改管理员密码:

    admin--设置--密码
    

    5) 修改语言为中文

    到系统管理--插件管理中下载如下插件接口
    Localization: Chinese (Simplified)
    

    6.6 实战-脚本发布PHP代码

    参考链接:
    https://www.jianshu.com/p/5f671aca2b5a

    思路:
    jenkins和gitlab相连接,把项目从gitlab拉取到jenkins本地目录下,然后通过shell脚本自动把代码推送nginx站点目录下实现自动化发布代码
    

    6.61 创建项目

    登录Jenkins, 点击左侧的新建,创建新的构建任务。
    跳转到如下界面。任务名称可以自行设定,但需要全局唯一。输入名称后选择构建一个自由风格的软件项目(其他选项不作介绍)。并点击下方的确定按钮即创建了一个构建任务。之后会自动跳转到该job的配置页面。

    构建-Execute shell测试:

    进行构建:

    查看控制台输出:

    创建一个测试文件

    [root@jenkins:~]# ll /var/lib/jenkins/workspace/freestyle-job/
    total 0
    


    [root@jenkins:~]# ll /var/lib/jenkins/workspace/freestyle-job/
    total 0
    -rw-r--r-- 1 jenkins jenkins 0 Jun  3 23:57 test.txt
    

    6.62 Jenkins获取Git源代码

    第一步:从码云上下载一个html页面的大转盘项目(相当于开发写好的代码)

    大转盘地址:
    https://gitee.com/lovexzq/XingYunDaZhuanPan.git

    [root@git:~]# mkdir ./dzp
    [root@git:~]# cd dzp/
    [root@git:~/dzp]# pwd
    /root/dzp
    [root@git:~/dzp]# unzip lovexzq-XingYunDaZhuanPan-master.zip 
    [root@git:~/dzp]# ll
    total 8
    drwxr-xr-x 2 root root   25 Nov  3  2017 css
    drwxr-xr-x 2 root root   84 Nov  3  2017 img
    drwxr-xr-x 2 root root   41 Nov  3  2017 js
    -rw-r--r-- 1 root root 2170 Nov  3  2017 lottery.html
    -rw-r--r-- 1 root root  113 Nov  3  2017 README.md
    

    第二步:在gitlab上新建一个dzp仓库,并将git本地上的代码上传到dzp仓库中



    gitlab上操作

    [root@git:~/dzp]# git init
    Initialized empty Git repository in /root/dzp/.git/
    [root@git:~/dzp]# git remote add origin git@10.0.0.81:test/dzp.git
    [root@git:~/dzp]# git add .
    [root@git:~/dzp]# git commit -m "Initial commit"
    [master (root-commit) 3c71237] Initial commit
     9 files changed, 9656 insertions(+)
     create mode 100644 README.md
     create mode 100644 css/lottery.css
     create mode 100644 img/20yuan.jpg
     create mode 100644 img/apple.jpg
     create mode 100644 img/iPhone6plus.jpg
     create mode 100644 img/ipadmini.jpg
     create mode 100644 js/jquery.js
     create mode 100644 js/lottery.js
     create mode 100644 lottery.html
    [root@git:~/dzp]# git push -u origin master
    Counting objects: 14, done.
    Compressing objects: 100% (13/13), done.
    Writing objects: 100% (14/14), 103.92 KiB | 0 bytes/s, done.
    Total 14 (delta 2), reused 0 (delta 0)
    To git@10.0.0.81:test/dzp.git
     * [new branch]      master -> master
    Branch master set up to track remote branch master from origin.
    

    查看gitlab上的上传结果

    第三步:模拟dev用户端配置从gitlab获取代码,并修改代码重新上传至gitlab,然后Jenkins从Gitlab获取代码的过程

    
    # 第一步 dev下载代码
    [root@dev:~]#git clone git@10.0.0.81:test/dzp.git
    Cloning into 'dzp'...
    remote: Enumerating objects: 14, done.
    remote: Counting objects: 100% (14/14), done.
    remote: Compressing objects: 100% (13/13), done.
    remote: Total 14 (delta 2), reused 0 (delta 0), pack-reused 0
    Receiving objects: 100% (14/14), 103.92 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (2/2), done.
    [root@dev:~]# ll dzp/
    total 8
    drwxr-xr-x. 2 root root   25 Jun  3 22:33 css
    drwxr-xr-x. 2 root root   84 Jun  3 22:33 img
    drwxr-xr-x. 2 root root   41 Jun  3 22:33 js
    -rw-r--r--. 1 root root 2170 Jun  3 22:33 lottery.html
    -rw-r--r--. 1 root root  113 Jun  3 22:33 README.md
    
    # 第二步 dev修改代码
    [root@dev:~/dzp]# vim lottery.html 
    [root@dev:~/dzp]# git add .
    [root@dev:~/dzp]# git commit -am "modify html"
    [root@dev:~/dzp]# git checkout -b dev
    [root@dev:~/dzp]# git push -u origin dev
    然后在dev账户下发起merge请求,在gitlab的root用户下上合并dev分支内容
    
    # 第三步 Jenkins配置从Gitlab获取代码
    ```bash
    [root@jenkins:~]# ssh-keygen -t rsa
    [root@jenkins ~]# cat .ssh/id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4FoFNDMoznM++Rb5d7M+/R+BC+9ccyAhJD1V0zQfEZolqQCtY+J6HJ8sVH6U3sVWCS7H+XsoypB4XGpHuDgVdHkdneCSVtvqp7u0mgsDN8ZkFFazx2ZgtEIg6bK/ausUKVagIlPXX9l0oDoJTWC7/sX3uUHy2uMFKeDhjCgau34kyoCmDrCVMWlWrwoERO2zwVxBRQVzkPDyI6GjJ83Ku+WIZkQctqHEOjgKSD6bWzrPzIsIUzlb9WCxCQMhwrVlxnTFDU9yfscHAU+POkUOw+jyHpaJO6jDgoJaxbor2MoFaQoG9EGdBNAH/y+//kbivEQpE4BwCjN51xic7pcMd root@jenkins
    ![](https://img2020.cnblogs.com/blog/2012388/202006/2012388-20200603234514834-1356880444.png)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    系统化运维博客
  • 相关阅读:
    windows10下安装zookeeper kafka
    WisDom.Net 框架设计(八) 持久层
    WisDom.Net 框架设计(五) 权限设计
    WisDom.Net 框架设计(二) 服务总线
    业务安全篇-渗透中的表单测试
    【网摘】身在腾讯:浪潮之巅的惶惑与自救
    短链生成
    【读书笔记】——读书之前
    config 设置的两种方式
    ping通但是浏览器打不开网页解决
  • 原文地址:https://www.cnblogs.com/nsthink-666/p/12907115.html
Copyright © 2020-2023  润新知