工具篇-聊聊Devops
1.简介
Devops
简而言之是一个思想或者是一个理论,主要阐述是开发 测试 运维一体化
Devops
是一种重视软件开发人员(Dev)和软件运维人员(Ops)之间的沟通合作的文化
通过一些自动化软件(这里我用的是Jekins
)来自动化""软件交付"和"架构变更"的流程,从而使项目构建,测试,发布更加的快捷,频繁,可靠。
下图则是对Devops
更好的阐述,如下:
关于上图阐述如下:
-
当来了一个需求(
Plan
),那么开发人员就会根据需求进行编码(code
) -
当编码完成就会去构建项目(
build
),构建完成之后就需要进行测试(test
) -
当测试完成后就会去进行发布(
release
),发布完成就会去进行部署(deploy
) -
当部署完成就会去进行运维(
operate
),运维后回去进行项目的监控(monitor
) -
当在项目监控的过程中产生新的需求或者甲方提出新的需求,这样就会进入上述流程,从而形成一个闭环
在早期开发中,尤其是在敏捷开发过程中如果按照早期开发和部署分开的形式去进行工作,对于软件的交付和部署肯定不能够按时交付的
Devops
就是使用一系列的工程方法和工具来提交效率,让上图的闭环循环的自动化转动起来也就是说开发人员只需要关注编码,在保证编码质量的前提下,让构建到监控均自动化运转起来
在一些公司(这里以我当前所在公司为例)中,开发流程大体如下图所示:
未命名文件 (1)其中持续集成系统采用的就是
Jekins
技术栈
2.工具
上述阐述了Devops
,那么到底通过什么样的工具,是Devops
理论变得实际可行,下图就阐述了通过什么样的工具去实现Devops
理论
虽然工具有很多,要想全部掌握也不大可能,同时实际开发中用的只是其中的一部分,如下:
- 版本控制工具采用
Git
- 项目管理工具采用
Maven
- 单元测试工具采用
JUint
- 持续集成工具采用
Jekins
- 项目部署运维工具采用
Docker
- 监控工具采用
ELK
3.实现
3.1 前提
接下来就来实现一个Devops
的实际案例,在实际案例之前需要准备以下工具:
为了更加让Devops
落地,这里我们采用Java
的SpringBoot
项目进行测试,当然也可以采用Vue
项目。大体流程如下:
- 将开发的代码提交到
gitee
上 -
jekins
就会去监测master
分支代码是否发生改变 - 一旦发生改变,就去执行
mvn clean package
命令 - 执行完成就会将打成的
jar
封装成一个Docker
镜像,并且推送到开发环境的服务器 - 开发环境的服务器就会执行一个
shell
脚本,去创建容器运行
具体如下图所示:
image-202103161105447453.2 实操
3.2.1 构建项目
项目的pom.xml
内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wangzh</groupId>
<artifactId>devops-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>devops-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
构建Controller
,具体如下:
package com.wangzh.devops.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping
public String test() {
return "这是一个测试" + Math.random();
}
}
3.2.2 Dockerfile
由于想要把自己的项目最后封装成一个Docker
镜像,因此需要构建一个Dockerfile
文件
这里不再构建手动构建Dockerfile
文件,而是通过DockerMaven
插件去帮我们构建
至于
DockerMaven
插件的使用可以参考之前的博客
将DockerMaven
插件添加到pom.xml
中,具体如下:
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件, 官网: https://github. com/spotify/docker-maven-plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--imaname是将要创建的镜像名称--> <imageName>${project.artifactId}:${project.version}
</imageName>
<baseImage>jdk1.8</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--docker主机ip,也就是生产环境的ip,到时候换成自己的ip即可-->
<dockerHost>http://172.16.0.154:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
3.2.3 推送到Gitee
将当前项目代码推送到gitee
,当然你也可以将项目推送到gitlab
或者github
都是一样
image-20210316112256042关于
git
相关内容,这里不再赘述
3.2.4 Jekins构建
当把代码推送到了gitee
后,就可以使用Jekins
去检测gitee
仓库master分支代码,具体操作如下:
-
登录
image-20210316122109361jekins
- 构建任务
选择新建任务
image-20210316122157968
选择构建一个maven项目
image-20210317091815477
进入配置界面,进行配置,如下:
描述
image-20210317092119245 image-20210317092316001
源码管理
image-20210317092658957构建触发器
image-20210317093316552H/2 * * * *
这个属于
Build
image-20210317093615878
Post Steps
这个步骤是用来选择构建后要执行什么样的命令,这里选择执行
shell
命令# 远程登录宿主机 之所以远程登录 是因为我这个jekins是docker方式安装 # 这种方式安装无法执行宿主机的脚本,所以需要远程登录 ssh wangzh@172.16.0.154 -tt << remotessh # 执行宿主机的脚本 关于脚本这里我就不写了,可以按照自己的想法去写 sh /data/dev-ops/publish.sh #退出容器 echo "finished!" exit ###退出远程机器 remotessh ###结尾
构建完成选择保存即可,返回控制面板就会看到新创建的任务
image-20210317094355971
3.2.5 构建任务
当任务创建完成,就会每隔2
分钟去检查master
分支代码是否改变,如果有就会去构建
由于这里任务刚创建,因此我们点击手动构建。如下:
image-20210317094612274 image-20210317094638986在构建过程种可以查看构建日志,从而判断是否报错
image-20210317094823314 image-20210317094923906通过日志发现 镜像构建成功
image-20210317095453333此时这个时候去服务器查看,是否存在该镜像,如下所示,是存在的
image-20210317095653685这样就实现了持续集成,如果想要发布,就需要结合之前的命令在加上自己写的脚本,就可以做到自动部署
3.3 总结
上述操作中,只是做了集成和部署,当然也可以把监控和测试也做成自动化,只不过就需要写自动化测试脚本。这里只是一个皮毛,如果想要深入研究,就需要结合具体场景给出具体方案