持续集成

第一章 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)













系统化运维博客
原文地址:https://www.cnblogs.com/nsthink-666/p/12907115.html