DevOps、CI/CD流水线、Jenkins_Docker案例
微服务(Orchestration)架构 - 开发流水线与 DevOps 工具集
课程地址:18微服务orchestration架构—开发流水线与-devops-工具集
ppt给的要求三选一,我看来看去也就只有第一条能做而且是最简单的了:介绍 CI/CD Pipeline 原理、使用工具与案例。
一、DevOps(开发与运维 – Development and Operations)
一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护。大致由软件开发工程师、软件测试工程师,软件运维工程师这三种程序员来负责这个过程。
软件交付模型依次有瀑布模型、敏捷开发模型和DevOps模型。瀑布模型
瀑布模型是最早期的软件交付模型,就是等一个阶段所有工作完成之后,再进入下一个阶段。它的软件开发流程是这样的:软件开发人员花费数周和数月编写代码,然后将代码交给QA(质量保障)团队进行测试,然后将最终的发布版交给运维团队去部署。所有的这三个阶段,即开发,测试,部署。
但是,项目不可能是单向运作的。客户也是有需求的。产品也是会有问题的,需要改进的。随着时间推移,用户对系统的需求不断增加,与此同时,给的时间周期却越来越少。在这个情况下,笨重迟缓的瀑布式开发已经不合时宜了。于是就发展出新的软件交付模型——“敏捷开发(Agile Development)”。
敏捷开发
敏捷开发能应对快速变化需求。每次开发一个部分就进行测试,然后再进行下一轮开发。通过重复交替进行开发和测试,可以帮助更快地发现问题,产品被更快地交付到用户手中,团队可以更快地得到用户的反馈,从而进行更快地响应。
而且,DevOps小步快跑的形式带来的版本变化是比较小的,风险会更小。即使出现问题,修复起来也会相对容易一些。
虽然敏捷开发大幅提升了软件开发的效率和版本更新的速度,但是它的效果仅限于开发环节。运维的部署部分还是没有参与其中。
DevOps
DevOps一次词的来自于Development和Operations的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。不过需要澄清的一点是,从开发到运维,中间还有测试环节。DevOps其实包含了三个部分:开发、测试和运维。
快速的部署其实可以帮助更快地发现问题,产品被更快地交付到用户手中,团队可以更快地得到用户的反馈,从而进行更快地相应。而且,DevOps小步快跑的形式带来的变化是比较小的,出现问题的偏差每次都不会太大,修复起来也会相对容易一些。
在DevOps的流程下,运维人员会在项目开发期间就介入到开发过程中,了解开发人员使用的系统架构和技术路线,从而制定适当的运维方案。而开发人员也会在运维的初期参与到系统部署中,并提供系统部署的优化建议。
下图可见DevOps贯穿了软件全生命周期,而不仅限于开发阶段。
DevOps与虚拟化、容器、微服务
微服务就是将一个提供多种服务整体产品进行拆分,拆成各自提供不同服务的多个个体。微服务架构下,不同的工程师可以对各自负责的模块进行处理,例如开发、测试、部署、迭代。
虚拟化就是一种敏捷的云计算服务。它从硬件上,将一个系统“划分”为多个系统,系统之间相互隔离,为微服务提供便利。
容器不是划分为不同的操作系统,而是在操作系统上划分为不同的“运行环境”(Container),占用资源更少,部署速度更快。
虚拟化和容器,其实为DevOps提供了很好的前提条件。开发环境和部署环境都可以更好地隔离了,减小了相互之间的影响。
二、什么是 CI/CD 流水线?
有两个词经常会伴随着DevOps出现,那就是CI和CD。CI是Continuous Integration(持续集成),而CD对应Continuous Delivery(持续交付)或Continuous Deployment(持续部署)。三者关系如下图所示:
参考持续集成、持续交付、持续部署(CI/CD)简介 给产品经理讲讲,什么是持续交付和 DevOps 敏捷开发、持续集成/交付(CI/CD)、DevOps学习笔记
持续集成(CI – Continuous Integration)
在传统软件开发过程中,代码集成一般是在项目结束阶段一次性将所有开发人员的代码整合起来,这个整合过程花费大量时间和人力。而在持续集成(CI)方式下,代码集成每天都在发生,每次只需要花费几分钟的时间。
不同的开发人员各自编写自己负责部分的代码,然后上传到源代码库中合并, CI 服务器负责构建软件并测试是否能正常运行,将测试结果反馈给开发人员。
集成的代码即使通过了测试、能够成功的工作,也仍然不能直接投产,因为它还没有在类似生产环境中测试和验证以表明能够工作。
持续交付(CD – Continuous Delivery )
持续交付是在持续集成的基础上,将集成后的代码部署到更贴近真实运行的环境(类生产环境,production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。
我们可以从每个环境的测试中获得新的反馈,如果出现了错误,我们可以更容易的理解问题到底在哪里,并且在代码进入生产环境之前修复它们。如果代码没有问题,可以继续手动部署到生产环境中。
持续交付并不是指软件每一个改动都要尽快部署到产品环境中,它指的是任何的代码修改都可以在任何时候实施部署。这里强调的是:
- 手动部署
- 有部署的能力,但不一定部署
持续部署(CD – Continuous Deployment)
持续部署则是在持续交付的基础上,把部署到生产环境的这个过程自动化。
这里强调的是:
-
持续部署是自动的
-
持续部署是持续交付的最高阶段
三、工具
代码管理(SCM):GitHub、GitLab、SubVersion
构建工具:Ant、Gradle、maven
持续集成(CI):Travis、Jenkins、Drone
容器:Docker、LXC、第三方厂商如AWS
编排:Kubernetes、Core、Apache Mesos、DC/OS
服务注册与发现:Zookeeper、etcd、Consul
日志管理:ELK、Logentries
应用服务器:Tomcat、JBoss
Web服务器:Apache、Nginx、IIS
数据库:MySQL、Oracle、PostgreSQL等关系型数据库;cassandra、mongoDB、redis等NoSQL数据库
工具、CI/CD、DevOps的关系:通过技术工具链完成持续集成CI、持续交付CD、用户反馈和系统优化的整合,实现跨团队的无缝协作(DevOps).
根据实际需要,选择合适的工具组合起来构建CI/CD流水线
- Docker + Gogs + Jenkins + MYSQL + Nginx
- Docker + GitLab + Drone + Nginx
- …
四、使用Jenkins、Docker构建CI/CD流水线
到目前为止,我们已经了解了 CI/CD 流水线及其工作原理,还有相关的一些工具。接下来我们将介绍如何使用 Jenkins 构建CI/CD流水线,并自动化整个过程。
参考使用Jenkins+docker 部署springboot项目
我们的目标是要将软件开发生命周期的整个过程都自动化,即从开发人员向代码库中提交代码开始,到将此代码投入生产环境中使用为止,全部自动化完成。
这个案例是使用码云+jenkins+docker来部署springboot项目
- 码云:基于Git的代码托管和研发协作平台,是一个供开发人员提交代码的仓库。
- Jenkins :持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台,可安装各种插件处理任何类型的构建或持续集成。
- docker:保证开发环境和生产环境一致,方便部署。
开始构建CI/CD流水线
1、springboot项目
首先写一个最简单的只有响应"hello spring boot"的springboot项目,编写Dockerfile:
#FROM openjdk:8-jdk-alpine #基与jdk1.8
FROM hub.c.163.com/dwyane/openjdk:8
VOLUME /tmp #挂载容器的位置, 容易找到
ADD docker-springboot-1.0-SNAPSHOT.jar app.jar #宿主机器的jar文件 移动到 容器的jar文件
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
#容器执行的命令
上传到码云上此项目的git地址上
2、安装和配置Jenkins
安装
- Jenkins是基于Java语言开发的,所以需要先安装JDK〔Java development kit〕Java开发组件。
- 这里通过tomcat来启动Jenkins,因此先安装tomcat。
- 到官网https://jenkins.io/download/ 下载Jenkins的war包,war包需要配置Tomcat服务器才能运行访问,因此复制war包到tomcat的webapps目录下,启动tomcat
解锁
打开Jenkins后会提示解锁Jenkins,复制 /Users/Shared/Jenkins/Home/secrets/initialAdminPassword
文件内容到页面的Administrator password
栏中
$ cat /Users/Shared/Jenkins/Home/secrets/initialAdminPassword
设置用户
普通的设置用户名、密码之类的
安装默认插件
然后提示安装插件,选择默认的安装,等待安装完成。
全局配置
点击 >系统设置>全局工具配置,配置maven、JDK、Docker、git的路径
3、使用Jenkins部署项目到docker
事先安装好docker。
在jenkins页面新建*风格的软件项目
。
在源码管理
中,添加git仓库和用户名、密码配置,并且选择代码分支(这里是master)
在构建
步骤中,添加2个步骤
- 1.
*maven
选择maven版本(上面的全局配置中配的maven),添加maven打包命令
clean install -Dmaven.test.skip=true
- 2.
执行shell
添加shell:
mvn docker:build #构建docker镜像
echo "当前docker 镜像:"
docker images | grep dockerspringboot
echo "启动容器----->"
docker run -p 8080:8080 -d dockerspringboot
echo "启动服务成功!"
4、执行构建并启动服务
上面配置完成后,到Jenkins的Web主页,选择配置好的项目,菜单中点击立即构建
,看到左边菜单里有执行的进度条,点进去后可以看到执行日志,如果启动服务成功,则可以到浏览器访问localhost:8080
5、改造shell脚本
如果下次构建该项目的时候,docker镜像和服务已存在,需要先删除镜像和服务
# 先删除之前的容器
echo "remobe old container"
docker ps -a | grep dockerspringboot | awk '{print $1}'| xargs docker rm -f
# 删除之前的镜像
echo "romove old image"
docker rmi dockerspringboot
# 构建镜像
mvn docker:build
# 打印当前镜像
echo "current docker images"
docker images | grep dockerspringboot
# 启动容器
echo "start container"
docker run -p 8001:8001 -d dockerspringboot
# 打印当前容器
echo "current container"
docker ps -a | grep dockerspringboot
echo "star service success!"
上一篇: DevOps实战(4) GitLab部署