什么是DevOps
一个软件的生命周期包括:需求分析阶、设计、开发、测试、上线、维护、升级、废弃。
通过示例说明如下:
1、产品人员进行需求分析
2、设计人员进行软件架构设计和模块设计。
3、每个模块的开发人员并行开发,设计接口、进行编码,并进行单元测试
4、开发完毕,将代码集成部署到测试服务器,测试人员进行测试。
5、测试人员发现bug,提交bug、开发人员修改bug
6、bug修改完毕再次集成、测试。
7、测试完毕,项目上线。
8、运维人员进行安装部署、培训。
9、用户提出问题,返回给运维人员。
10、运维人员反馈给开发人员,开发人员进行问题处理。
11、再次提交测试。
12、测试完毕再次部署升级。
....
最后软件下线。
所以,在整体生命周期中比较核心的两个阶段是:开发阶段、维护阶段,开发阶段的成果是软件开发完成并成功上线,运维阶段则负责对软件进行维护和升级,而运维阶段通常在一个软件的生命周期中占比最多。
提高开发阶段、运维阶段的工作效率是企业在进行软件项目管理的重点。
因此,专家提出了DevOps,DevOps是什么呢?
下边是摘自百度百科的定义:
DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。
DevOps是一个工具吗?
DevOps是一个工作职位吗?
都不是。
DevOps是一种思想理念,它涵盖开发、测试、运维的整个过程。DevOps追求的目标是提高软件开发、测试、运维、运营等各部门的沟通与协作质量,DevOps强调软件开发人员与软件测试、软件运维、质量保障(QA)部门之间有效的沟通与协作,强调通过自动化的方法去管理软件变更、软件集成,使软件从构建到测试、发布更加快捷、可靠,最终按时交付软件。
什么是CI/CD
如何来落地实现DevOps呢?
DevOps兴起于2009年,近年来由于云计算、互联网的发展,促进了DevOps的基础设施及工具链的发展,涌现了一大批优秀的工具,这些工具包括开发、测试、运维的各各领域,例如:GitHub、Docker、Jenkins、Hudson、K8S、Ant/Maven/Gradle、Selenium、QUnit、JMeter等。下图是DevOps相关的工具集:
好的工具有利于DevOps的实施,但并不代表实施DevOps就一定需要去引入一堆工具。
问题的关键:如何解决问题,而不是具体应用工具。
CI/CD 是近年来企业有效实施DevOps的具体方案。
CI/CD 包含了一个 CI 和两个 CD,CI全称 Continuous Integration,表示持续集成,CD包含 Continuous Delivery和 Continuous Deployment,分别是持续交付和持续部署,三者具有前后依赖关系。
CI 持续集成:
持续集成倡导团队成员需要频繁的集成他们的工作,将开发分支合并到主分支,每次集成都通过自动化构建(包括编译、构建、自动化测试)来验证,从而尽快地发现集成中的错误,让产品可以快速迭代,同时还能保持高质量。
CD持续交付:
持续交付将集成后的代码部署到类生产环境(预发布),除了交付到类生产环境之外,还会执行一些集成测试、API测试。持续交付强调的是“交付”,交付给测试、产品验收,不管怎么更新,软件是随时随地可以交付的。
CD持续部署:
在持续交付的基础上由开发人员或运维人员自助式的定期向生产环境部署稳定的构建版本,持续部署的目标是代码在任何时刻都是可部署的,并可自动进入到生产环境。
DevOps实战
技术方案
下图是比较流行的一种CI/CD的技术方案:
下边我们参考该技术方案将学成在线项目使用Docker进行部署。
本次项目部署实战旨在理解CI/CD的流程,考虑Kubernates的复杂性课堂上我们用Jenkins代替Kubernates完成容器部署。
准备环境
准备一台Centos7 虚拟机,安装Docker、jdk、maven,通过Docker容器安装jenkins、Docker私服软件,其它软件为学成在线项目所需要的,如下:
在课堂资料中提供了安装以上软件的虚拟机,使用VMware导入即可使用。
人工部署方式
如果不使用CI/CD则需要人工手动对工程进行测试、打包、部署。使用CI/CD后通过自动化的工具去完成。
下边先演示手动部署方式,之后采用工具进行部署。
项目打包
1、在父工程聚合各模块
首先在父工程添加models,聚合各各模块
<modules>
<module>../xuecheng-plus-base</module>
<module>../xuecheng-plus-checkcode</module>
<module>../xuecheng-plus-gateway</module>
<module>../xuecheng-plus-auth</module>
<module>../xuecheng-plus-content</module>
<module>../xuecheng-plus-learning</module>
<module>../xuecheng-plus-media</module>
<module>../xuecheng-plus-orders</module>
<module>../xuecheng-plus-message-sdk</module>
<module>../xuecheng-plus-search</module>
<module>../xuecheng-plus-system</module>
</modules>
2、配置打包插件
使用springboot打包插件进行打包,在需要打可执行包的工程中配置spring-boot-maven-plugin插件否则报 “jar中没有主清单属性” 。
注意:在要打可执行jar包的工程中配置该插件。
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
说明:
配置了springboot打包插件即可在maven窗口显示如下:
功能说明:
- build-info:生成项目的构建信息文件 build-info.properties
- repackage:这个是默认 goal,在 mvn package 执行之后,这个命令再次打包生成可执行的 jar,同时将 mvn package 生成的 jar 重命名为 *.origin
- run:这个可以用来运行 Spring Boot 应用
- start:这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理
- stop:这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理
在父工程执行:clean install -DskipTests -f pom.xml 对所有工程进行打包
打包完成可在本地通过java -jar 运行jar包观察是否可以正常运行。
下边测试验证码服务:
进入验证码服务的target目录,cmd运行:
java -Dfile.encoding=utf-8 -jar xuecheng-plus-checkcode-0.0.1-SNAPSHOT.jar
如下图:
使用httpclient测试申请验证码:
### 申请验证码
POST localhost:63075/checkcode/pic
部署到Linux
将打成的jar包拷贝到Linux,生成镜像,并创建容器。
1、编写Dockerfile文件
#进入目录 cd /data/soft/
#创建目录 mkdir checkcode
cd checkcode/
#创建并编辑文件 vi Dockerfile
#把下面的内容复制到文件中
# :wq 保存文件并退出
# rz 上传文件, 把jar包传上去
# ll 查看当前目录中的文件
#下面开始创建镜像
#查看正在运行的镜像 docker ps
#查看所有容器 docker ps -a
#创建镜像 docker build -t checkcode:1.0 .
#说明: docker build -t 镜像名:版本 .
#镜像名是不能重复的, 如果重复创建失败, 删除后重试
# docker rm xuecheng-plus-checkcode
#下面开始创建容器
#创建容器 docker run --name xuecheng-plus-checkcode -p 63075:63075 -idt checkcode:1.0
#查看容器 docker images
#查看容器的日志 docker logs -f xuecheng-plus-checkcode
FROM java:8u20
MAINTAINER docker_maven docker_maven@email.com
WORKDIR /ROOT
ADD xuecheng-plus-checkcode-0.0.1-SNAPSHOT.jar xuecheng-plus-checkcode.jar
CMD ["java", "-version"]
ENTRYPOINT ["java", "-Dfile.encoding=utf-8","-jar", "xuecheng-plus-checkcode.jar"]
EXPOSE 63075
再次测试
### 申请验证码
POST 192.168.101.65:63075/checkcode/pic