DevOps是什么?

DevOps的概念
DevOps一词的来自于Development和Operations的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。
DevOps概念早先升温于2009年的欧洲,因传统模式的运维之痛而生。

image-20230822145624823

DevOps是为了填补开发端和运维端之间的信息鸿沟,改善团队之间的协作关系。不过需要澄清的一点是,从开发到运维,中间还有测试环节。DevOps其实包含了三个部分:开发、测试和运维。

image-20230822145724540

换句话说,DevOps希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。专家们总结出了下面这个DevOps能力图,良好的闭环可以大大增加整体的产出

image-20230822145807327

当下所有互联网市场:

image-20230822150043494

敏捷开发:

什么是敏捷开发?
敏捷开发是一种以人为核心,迭代,循序渐进的开发方式。
在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。
加单的说,敏捷开发并不是追求前期完美的设计、完美编码,而是力求在很短的周期内开发出产品核心功能,尽早发布出可用的版本。然后在后续的生产周期内,按照新需求不断迭代升级,完善产品。
image-20230822152545287

产品质量提高

1 自动化测试
2 持续集成/持续交付/持续部署
3 代码质量管理工具
4 程序员鼓励师

CI/CD

什么是 CI ?
CI 即 Continuous Integration 的缩写,中文即持续集成。
持续集成(CI) 是在源代码变更后自动检测、拉取、构建和进行单元测试的过程。
什么是 CD ?*
CD 有两层意思,一层是 Continuous Delivery 持续交付,另一层是 Continuous Deployment 持续布署。
“持续” 这并不意味着“一直在运行”,而是“随时可运行”。
持续交付(CD)意味着软件可以随时发布到生产中,通常是通过自动化将更改推送到临时系统。
持续部署(CD)更进一步,并自动将更改推向生产系统。
持续部署是一个很优秀的方式,可以加速与客户的反馈循环,不再需传统的“发布日”。开发人员可以专注于构建软件,当开发人员在主分支中合并一个提交时,这个分支将被构建、测试,如果一切顺利,则部署到生产环境中。
下面借用GitLab上的一张图描述 CI/CD 工作流程

image-20230822152039695

产品的生命周期

CI:持续集成,将代码提交到代码仓库
gitlab\SVN 版本管理工具

CD:持续交付
CD:持续部署
shell
Jenkins
  • 立项

    • 产品原型图
    • 需求碰撞
  • 市场调研

    • 市场需求
    • 竞争对手
  • 开发(开发环境)

    • 功能拆分

    • 登录功能

    • 注册功能

    • 交易功能

    • 订单功能

    • 购物功能

    • 直播功能

    • 物流功能

    • 产品入库

    • 产品出库

    .......等等

    • 项目排期

    • 项目开发

    • 传统开发(低端公司)

    • 敏捷开发(高端公司、scrum)

    • 项目完成

    • 代码集成(代码仓库:CI:Continunous Integration)

    • 代码质检(sonarqube)

  • 测试(测试环境)

    • 测试用例
    • 性能测试
    • 功能测试(黑盒测试)
    • 白盒测试
    • 自动化测试
  • 运维(预上线环境、生产环境)

    • 代码交付(CD:Continunous Delivery)
    • 代码部署(CD:Continunous Deployment)
    • 服务维护
    • 故障解决
    • 技术支持
    • 自动化运维
  • 消亡(destroy)

增量:

image-20230822153129141

迭代&演讲

image-20230822153221157

环境:

开发环境
测试环境

  • 性能测试环境
  • 功能测试环境

预上线环境\预生产环境\beta环境\staging环境\release环境 (内测)
生产环境

部署代码完成后,把域名给测试人员,在域名是做本地域名解析的情况下,测试人员怎样才能访问网页测试?

公司内部,搭建一个DNS服务器

  • coreDNS
  • Bind9
  • DNSmsq

代码部署:

简单的一句话:就是将开发写好的代码,通过一系列的手段,让它能够成功运行在我们的环境中。
其实我们很早就接触过。
比如:

  • nginx
  • 下载安装包(开发写好的代码)
  • 构建代码
  • 生成配置
  • 编译安装
  • 修改配置
  • 启动程序
  • MySQL
  • wordpress

只不过不同的代码需要不同的环境。

或许有些人绕不过来,当你成为架构师之后,一切皆为中间件,所有的应用,只是为了给我的代码提供一个运行环境而已,那些所谓的应用,都只是我代码的一个小小的依赖而已,或许我需要有个地方存储我的数据,那么作为开发人员,我可以任意选择地方,比如:文件中,world,execl都可以,但是为了产品的性能,安全,使我不得不选择一个当下热门的数据库,再或许,我的代码需要一个web环境,那么我可以自己用前端写一个web环境,然后把我的页面放进去,但是当下也有了很热门web程序,我们为什么不使用呢?

代码发布方式

应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系
统不间断提供服务。
长期以来,业务升级渐渐形成了几个发布策略:蓝绿发布、金丝雀发布和滚动发布,目的是尽可能避
免因发布导致的流量丢失或服务不可用问题。

蓝绿发布、AB发布

项目逻辑上分为AB组,在项目系统时,首先把A组从负载均衡中摘除,进行新版本的部署。B组仍然继续提供服务。

蓝绿部署中,一共有两套系统:一套是正在提供服务系统,标记为“绿色”;另一套是准备发布的系统,标记为“蓝色”。两套系统都是功能完善的,并且正在运行的系统,只是系统版本和对外服务情况不同。在项目系统时,首先把A组从负载均衡中摘除,进行新版本的部署。B组仍然继续提供服务

image-20230822155136710

当A组升级完毕,负载均衡重新接入A组,再把B组从负载列表中摘除,进行新版本的部署。A组重新提供服务

image-20230822155305284

最后,B组也升级完成,负载均衡重新接入B组,此时,AB组版本都已经升级完成,并且都对外提供服务。
特点:

  • 如果出问题,影响范围较大;
  • 发布策略简单;
  • 用户无感知,平滑过渡;
  • 升级/回滚速度快。

缺点:

  • 需要准备正常业务使用资源的两倍以上服务器,防止升级期间单组无法承载业务突发;
  • 短时间内浪费一定资源成本;
  • 基础设施无改动,增大升级稳定性

金丝雀发布(灰度发布)

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。灰度发布是增量发布的一种类型,灰度发布是在原有版本可用的情况下,同时部署一个新版本应用作为“金丝雀”(金丝雀对瓦斯极敏感,矿井工人携带金丝雀,以便及时发发现危险),测试新版本的性能和表现,以保障整体系统稳定的情况下,尽早发现、调整问题。

image-20230822160038954

从负载均衡列表中移除掉“金丝雀”服务器。
升级“金丝雀”应用(排掉原有流量并进行部署)。
对应用进行自动化测试。
将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)。
如果“金丝雀”在线使用测试成功,升级剩余的其他服务器。(否则就回滚)

特点:
保证整体系统稳定性,在初始灰度的时候就可以发现、调整问题,影响范围可控;
新功能逐步评估性能,稳定性和健康状况,如果出问题影响范围很小,相对用户体验也少;
用户无感知,平滑过渡。
缺点:
自动化要求过高(流水线发布)

image-20230822160146515

滚动发布

滚动发布是指每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版本升级新版本。

image-20230822160222677

红色:正在更新的实例
蓝色:更新完成并加入集群的实例
绿色:正在运行的实例
特点:

  • 用户无感知,平滑过渡;
  • 节约资源。

缺点:

  • 部署时间慢,取决于每阶段更新时间;
  • 发布策略较复杂;
  • 无法确定OK的环境,不易回滚。

Git本地仓库

git介绍

是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Torvalds 开始着手开发Git 是为了作为一种过渡方案来替代BitKeeper

分布式版本控制系统

什么是系统?

就是一个应用程序,部署起来,供我们来使用

什么是版本控制?

不管是在企业中,还是我们个人,我们一定都做过版本控制。

比如:

1.写脚本,一遍一遍的修改
2.大学写论文
3.写技术文档
CDN:分布式静态资源缓存系统

Git使用

#本地仓库git
[root@db01 ~]# yum install -y git
#创建站点目录
[root@db01 ~]# mkdir /code
#移动到站点目录
[root@db01 ~]# cd /code
#初始化为本地仓库
[root@db01 ~]# git init .
[root@db01 ~]# ll -a
total 8
drwxr-xr-x 3 root root  52 Aug 22 12:27 .
drwxr-xr-x 3 root root  18 Aug 22 12:23 ..
drwxr-xr-x 8 root root 166 Aug 22 12:18 .git

Git操作场景一:

老板:给我写一个官网
程序猿:一天一夜,写出来了,请CEO过目

#html代码
[root@db01 ~]# vim /code/index.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>代码迭代过程</title>
</head>
<body>
    <div id="demo"></div>
    <script src="src.js"></script>
</body>
</html>
#JS代码
[root@db01 ~]# vim /code/src.js
const string = '老板好,我是程序猿:您让我写的官网页面,它会动'
let n = 1
demo.innerHTML = string.substring(0,n)
setInterval(()=>{
    n+=1
    demo.innerHTML = string.substring(0,n)
},200)

image-20230822165249647

老板:不够醒目,再改改
程序猿:好嘞,花了一周时间,请CEO过目

#html代码
[root@db01 ~]# vim /code/index.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>代码迭代过程</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="demo"></div>
    <script src="src.js"></script>
</body>
</html>
#JS代码
[root@db01 ~]# vim /code/src.js
const string = '老板好,我是程序猿:您让我写的官网页面,它会动'
let n = 1
demo.innerHTML = string.substring(0,n)
setInterval(()=>{
    n+=1
    demo.innerHTML = string.substring(0,n)
},200)
#CSS代码
[root@db01 ~]# vim style.css 
#demo{
border: solid 1px red;
width: 410px;
height: 25px;
background-color: lightpink;
}

image-20230822172256803

这个时候老板说:还是之前的好看,改回去吧。

熊猫头问号表情包_问号_熊猫表情- 发表情- fabiaoqing.com

如果你有了GIT就不用再担心上面的场景了,操作如下:

1.创建写代码的目录
[root@db01 ~]# mkdir /code
2.将目录初始化成git仓库
[root@db01 code]# git init .
3.查看本地仓库状态
[root@db01 code]# git status
# On branch master main
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
4.添加1.0版本官网
#html代码
[root@db01 ~]# vim /code/index.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>代码迭代过程</title>
</head>
<body>
    <div id="demo"></div>
    <script src="src.js"></script>
</body>
</html>
#JS代码
[root@db01 ~]# vim /code/src.js
const string = '老板好,我是程序猿:您让我写的官网页面,它会动'
let n = 1
demo.innerHTML = string.substring(0,n)
setInterval(()=>{
    n+=1
    demo.innerHTML = string.substring(0,n)
},200)
5.添加到本地仓库
[root@xbs code]# ll
total 12
-rw-r--r-- 1 root root 317 Aug 22 17:22 index.html
-rw-r--r-- 1 root root 207 Aug 22 16:50 src.js
-rw-r--r-- 1 root root  89 Aug 22 17:21 style.css
[root@xbs code]# git add .
[root@xbs code]# git commit -m 'v1.2 官网'
[master 4c8a34a] v1.2 官网
 2 files changed, 7 insertions(+)
 create mode 100644 style.css
[root@xbs code]# git log
commit 4c8a34ac569245c2d732c302c4e47aad83a2f70e
Author: Your Name <you@example.com>
Date:   Tue Aug 22 17:42:49 2023 +0800

    v1.2 官网

commit 927c4b19ce2cf9ff096f4895ae3274535df4c741
Author: Your Name <you@example.com>
Date:   Tue Aug 22 16:58:51 2023 +0800

    V1.1 官网

#使用回滚  //回滚1.1版本即可恢复至前一次版本
[root@db01 code]# git reset --hard commit号

#查看git提交日志
git log 用于查看提交历史,主要用于项目的版本追踪和历史查看。
git reflog 用于查看引用历史,主要用于恢复丢失的分支、标签等引用,以及查看引用操作的历史。

Git工作区域切换

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

image-20230823144808537

Workspace:工作区,就是你平时存放项目代码的地方;
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息,一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本;
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换;

本地的三个区域确切的说应该是git仓库中HEAD指向的版本:

image-20230823144939445

Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
.git:存放Git管理信息的目录,初始化仓库的时候自动创建。
Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
Local Repo:本地仓库,一个存放在本地的版本库;HEAD会指示当前的开发分支(branch)。

Git的四种状态

Untracked:未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制。通过git add命令状态变为暂存状态Staged。
Unmodify:文件已经入库,未修改,即版本库中的文件内容与文件夹中完全一致。这种类型的文件有两种去处,如果它被修改,而变为Modified;如果使用git rm命令移出版本库,则成为Untracked文件。
Modified:文件已修改,仅仅是修改,并没有进行其他的操作。这个文件也有两个去处,通过git add命令可进入暂存staged状态;使用git checkout则丢弃修改过的内容,返回unmodify状态。这个git checkout命令即从库中取出文件,覆盖当前修改。
Staged:暂存状态。执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。

# 查看指定文件状态
git status [filename]

# 查看所有文件状态
git status

忽略文件

有些时候,我们不想把文件纳入版本控制中,比如临时文件、设计文件等。此时在主目录下建立“.gitignore”文件,此文件有如下规则:

  • 空行或以“#”开头的行会被忽略。
  • 可以使用Linux通配符。例如:“*”代表任意多个字符。
  • 如果名称的最前面有一个感叹号“!”,则表示例外规则,将不被忽略
*.zip      #过滤所有.zip文件
!*.c       #不过滤.c文件
/mtk/      #过滤整个文件夹

GIT操作场景二:

老板:给我写一个官网
程序猿:花了一天一夜,做出来了,请老板过目

#html
[root@xbs code]# vim index.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>代码迭代过程</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="demo">澳门皇家DC</div>
    <div id="demo2"></div>
    <script src="src.js"></script>
</body>
</html>

#js
[root@xbs code]# vim src.js
const string = '官网内容:澳门首家线上DC,性感荷官在线发牌,快来注册吧.'
let n = 1
demo2.innerHTML = string.substring(0,n)
setInterval(()=>{
    n+=1
    demo2.innerHTML = string.substring(0,n)
},200)

#css
[root@xbs code]# vim style.css
#demo2{
    margin-top: 50px;
}

image-20230823150524494老板:有点丑,我希望背景颜色是yellow,醒目一些。
老板秘书:我觉得不错,要是字体能做彩色的就好了。
程序猿:MMP,你们的意见就不能统一一下么?

对于这种多种决策方案的情况下,就需要使用到Git分支来处理了 //切记创建分支的时候无特殊情况下创建需回到master分支下创建完成后。在切换到相应的分支:
如: master --> a分支创建 ----> git checkout a分支 (代码修改/创建) ------> master ------> b分支创建
不可创建完a分支后,代码修改完成直接创建b分支,这样是在a分支下面创建一个b分支,而不是master下面

老板需求:

## 查看当前分支
[root@xbs code]# git branch
* master
## 创建ceo分支
[root@xbs code]# git branch ceo_branch
[root@xbs code]# git branch
ceo_branch
* master
## 切换分支
[root@xbs code]# git checkout ceo_branch
D src.js
Switched to branch 'ceo_branch'
#查看是否切换成功!!!!
[root@xbs code]# git branch
* ceo_branch
master
#修改代码
--------------------------------------------------------------------------------------------------
[root@xbs code]# vim index.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>代码迭代过程-曾老湿</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="demo">澳门皇家DC</div>
    <div id="demo2"></div>
    <script src="src.js"></script>
</body>
</html>
----------------------------------------------------------------------------------------------------
[root@xbs code]# vim src.js
const string = '官网内容:澳门首家线上DC,性感荷官在线发牌,快来注册吧.'
let n = 1
demo2.innerHTML = string.substring(0,n)
setInterval(()=>{
    n+=1
    demo2.innerHTML = string.substring(0,n)
},200)
----------------------------------------------------------------------------------------------------
[root@xbs code]# vim style.css
body{
  background-color: yellow;
}
#demo2{
    margin-top: 50px;
}
-----------------------------------------------------------------------------------------------------
#上传
[root@xbs code]# git add .
[root@xbs code]# git commit -m 'v1.4 背景修改-官网'

image-20230823151548891

秘书需求:

## 查看当前分支
[root@xbs code]# git branch
ceo_branch
* master
## 创建秘书分支
[root@xbs code]# git branch mishu_branch
[root@xbs code]# git branch
ceo_branch
* master
mishu_branch
## 切换分支
[root@xbs code]# git checkout mishu_branch
D src.js
Switched to branch 'mishu_branch'
#查看是否切换成功!!!!
[root@xbs code]# git branch
ceo_branch
master
* mishu_branch
#修改代码
--------------------------------------------------------------------------------------------------
[root@xbs code]# vim index.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>代码迭代过程</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="demo">澳门皇家DC</div>
    <div id="demo2"></div>
    <script src="src.js"></script>
</body>
</html>
----------------------------------------------------------------------------------------------------
[root@xbs code]# vim src.js
const string = '官网内容:澳门首家线上DC,性感荷官在线发牌,快来注册吧.'
let n = 1
demo2.innerHTML = string.substring(0,n)
setInterval(()=>{
    n+=1
    demo2.innerHTML = string.substring(0,n)
},200)
----------------------------------------------------------------------------------------------------
[root@xbs code]# vim style.css
body{
  background-color: yellow;
}
#demo2{
    margin-top: 50px;
}
#demo2{
    margin-top: 50px;
}
#demo,#demo2 {
    display: block;
    /*渐变背景*/
    background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,
    #ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);
    color: transparent; /*文字填充色为透明*/
    -webkit-text-fill-color: transparent;
    -webkit-background-clip: text;          /*背景剪裁为文字,只将文字显示为背景*/
    background-size: 200% 100%;            /*背景图片向水平方向扩大一倍,这样background-position才有移动与变化的空间*/
    /* 动画 */
    animation: masked-animation 4s infinite linear;
}
@keyframes masked-animation {
    0% {
        background-position: 0 0;   /*background-position 属性设置背景图像的起始位置。*/
    }
    100% {
        background-position: -100% 0;
    }
}
-----------------------------------------------------------------------------------------------------
#上传
[root@xbs code]# git add .
[root@xbs code]# git commit -m 'v1.5 字体修改-官网'

image-20230823152541462

Git操作:场景三(git merge)

老板:昨天夜里我和秘书达成一致了,两个版本都要,我在上面,秘书在下面

程序猿:OK,那我合并一下

git分支合并:
首选,我们需要明确,我们到底要保留哪个分支,毋庸置疑,肯定是master分支。
因为所有的代码,都是在master的基础上去修改的,在企业中也是这样的,首先有一个写好的基础代码框架。
然后拆分不同的功能(不同的分支),那么分支开发完毕,没有太大问题,则可以将分支内容合并到
主干(master)上,即便是出了问题,我们也可以根据提交的版本号进行回滚操作。

## 需要保留的分支,直接切换进去
[root@xbs code]# git checkout master
D src.js
Switched to branch 'master'
[root@db01 code]# git branch
ceo_branch
* master
mishu_branch
## 合并CEO分支
[root@xbs code]# git merge ceo_branch
Updating a78f184..62f622e
Fast-forward
style.css | 3 +++
1 file changed, 3 insertions(+)
## 合并秘书分支
[root@db01 code]# git merge mishu_branch
Auto-merging style.css
Merge made by the 'recursive' strategy.
style.css | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
[root@db01 code]# git status -sb
## master
D src.js
[root@db01 code]# git show
commit 33a0d27f45ce32521778345304b5b1e90b0deac2
Merge: 62f622e f5ed9f8
Author: Your Name <you@example.com>
Date: Wed Aug 23 09:10:00 2023 +0800
Merge branch 'mishu_branch'

image-20230823154741411

那么如果冲突了该如何解决呢,那一定是开发讨论一下,删谁的....
然后修改内容,改完后,重新add然后提交
vim index.html
git add .
git commit -m '解决合并冲突'

分支创建规则

1.按照功能划分
2.按照环境划分
3.按照开发人员划分
4.按照环境和功能划分

image-20230823145436182