DevOps在软件开发项目中的实践
2019-12-16蔡建军任女尔魏金津
蔡建军 任女尔 魏金津
摘要:手工式的编译、打包、部署已经不能满足数据资源中心软件项目开发的需求,所以引入DevOps来缩短软件开发交付时间,提高交付质量,协调开发、运维人员的工作。持续集成工具Jenkins可以自动化的从sVN/Git上下载代码、编译、打包、部署,这样省去了很多重复性的工作,提高了效率。Jenkins还可以将应用及其运行环境封装在Docker镜像中,使软件交付变得更加简洁。集成质量管控工具sonar,保证提高交付过程中的质量。
关键词:持续集成;JenkinsDocker
中图分类号:G301.6 文献标识码:A
文章编号:1009-3044(2019)29-0242-03
1概述
数据资源中心现有的软件项目开发中,开发人员从SVN或GitLab上下载最新代码,本地编译、部署、测试,然后手动通过命令行脚本将本地打好的jar或war包手动上传至测试或正式服务器,执行iava-jar或启动Web服务完成部署。项目开发后期因为需求变更频繁,Bug修复极多,需要频繁执行这样重复性的活动。领导与客户也希望能随时看到项目最新的功能与效果。
正式环境部署的项目,经常需要升级,由于客户不希望升级时重启Tomcat,开发人员往往直接将编译完的增量class和jsp文件直接拷人Tomcat路径。这样的操作是很混乱的,也会经常性产生很多错误。
无论是开发还是线上项目升级,一个重大的呼声是减少部署时间以及部署过程中发生的错误,将最新功能及时并且高质量地展现在领导和客户眼前,所以我们引入了DevOps。将自动化贯穿于从构建、测试、打包到部署,以期实现持续交付与部署,提高软件项目开发质量。
微服务项目会开发有很多以jar包形式存在的服务,每个jar包会部署在相同或不同的服务器上。每个服务也会有自己的环境,如果要安装这些环境,是更加烦琐的事情。所以我们引入Docker去封装服务及其运行环境,将封装后的产物作为交付物。
为了在持续交付过程中能保证质量,我们使用代码质量管控工具Sonar。
2DevOps介绍
2.1为什么要DevOps
DevOps(Development和Operations的组合词)是一套实践方法,在保证高质量的前提下缩短系统变更从提交到部署至生产环境的时间,以IT自动化以及持续集成(CI)、持续部署(CD)为基础,基于自动的持续的软件交付流程,使编译、打包、发布、测试等行为能够更高效,更稳定。
很多情况下,项目开发人员在自己电脑上正常运行的程序,部署到正式服务器上却会出现很多问题,这是由于软件开发环境与正式运行环境在配置、环境上存在差异,所以需要确保构建产物一直处在运行环境当中。
开发人员喜欢频繁的发布新代码,运维人员却认为系统变更是充满风险的,要求稳定可靠。部署对系统的变更,质量很重要,保证上生产前通过全部测试。所以DevOps是软件开发、运维、质量保证之间的高度协同,从而在完成频繁部署的同时,提高生产环境的可靠性、稳定性和安全性。
Jenkins与Docker都是在背后支持着DevOps的工具。
2.2为什么要Jenkins
持续集成(Continous Integration)是个简单重复劳动,由人来操作费时费力,使用自动化集成技术能够快速地构建代码,自动地进行测试,从而提高代码的效率和质量,节约大量的人力。
开发人员提交代码到Git,自动进行Maven构建,部署或是打入Docker容器后发布,这一系列自动化过程需要一名协调者,Jenkin就是这名协调者。
Jenkins是一个开源的持续集成软件,扩展性强,可以和大部分软件相结合,比如Maven,Git,Docker。实现无须太多人工干预,减少重复工作,节省时间,保障在任意时间点都可以自动编译、部署、测试和发布软件。
持续集成的目标是为了任何时候都能从Jenkins中获取最近构建成功的程序包,并可随时发布到服务器上。如果能把程序包封装到Docker容器中,自动的发布到服务器上,将更大程度上提高交付效率。
2.3为什么要Docker
数据资源中心不同的应用会依赖一个不同的运行环境,比如JDK版本不同,有的开发语言也不一样,服务器环境也有限制。运维人员要为每一个应用都提供一个运行环境这是很麻烦,很耗费时间的事情。所以我们有必要将服务及其运行环境封装在Docker镜像中,需要发布服务只需根据镜像启动容器即可,交付方式由应有程序转为Docker镜像,更加简洁方便。
Docker是一个开源的容器引擎,Docker容器是与DevOps密切相关的关键技术。Jenkins可以结合Docker实现将服务镜像自动化发布。3使用Jenkins实现自动化构建部署
对于傳统的JavaWeb应用而言,构建所生成的是war包,我们可将此war包部署到Tomcat容器中运行。对于sDringBoot应用而言,构建所生成的是jar包,此iar包还包含了嵌入式的Tomcat容器,可以直接运行。本节我们将通过Jenkins自动部署Jar或War。
1)新建Jenkins任务
Maven项目选择“构建一个maven项目”,普通项目可以选择“构建一个自由风格的软件项目”。然后在源码管理中配置从SVN或Git上下载代码。
2)构建触发器
选择Build periodically,我们可以指定Jenkins在某一时间点定时执行任务,为了减少服务器压力,一般选择在夜里。
3)执行构建
对于Maven项目,只需在Build中执行maven命令即可,而对于传统web项目,可以通过InvokeAnt运行Ant脚本构建。
4)开启免密登录
通常情况下,应用的部署服务器与Jenkins服务器不是同一个,则需要配置两台服务器之间的免密码登录,允许Jenkins通过SSH服务登录到远程机器执行脚本。具体方法这里不再赘述。
5)远程部署到Tomcat
要将编译好的war包发布到tomcat,首先需要安装插件“Deploy to container Plugin”,在构建后操作选择“Deploy war/earto a container”,选择container为tomcat,然后如下图配置tomcat的ip,登录用户名、密码,需部署的war路径等。
这里的用户名和密码必须和远程tomcat的croft目录下的tomcat-user.xml中保持一致,且具有管理员权限。
6)远程执行部署脚本
对于springBoot项目,内嵌tomcat,打出的jar包可以通过java-jar执行。在Post Steps选择send build artifacts over SSH通过Jenkins ssh到目标服务器如下图配置,BUILD_ID=DONT-KILLME是为了解决Jenkins杀死子进程的问题。
4Jenkins结合Docker实现自动化构建部署
我们想让上面Jenkins自动构建并启动Docker容器,这样的流程就是:代码在Git或SVN上,Jenkins下载代码并调用Ma-yen执行构建,Jenkins再将构建生成的程序包封装到Docker镜像中并启动相应的Docker容器,形成相应的测试或生产环境。
4.1Docker的几个概念
1)Dockerfile
Docker为我们提供的脚本文件,可以通过指令编写镜像的构建脚本,使镜像构建自动化。
2)Docker Registry
可以在本地搭建一个镜像注册中心用来管理越来越多的镜像。
4.2Jenkins发布Docker镜像
Jenkins在构建应用程序时也可以生成Docker镜像,并将此
6总结
DevOps的实施大大提高了数据资源中心軟件项目的交付速度与质量,高效的、高质量的、自动化的将最新功能最快速的、持续性的交付给客户和领导,协调开发、运维与测试人员的工作。持续集成工具Jenkins自动化的从Git或SVN上下载代码,编译、打包、部署,并可以设置任务自动执行时间。Jenkins可以集成Sonar在持续交付过程中保证软件的质量,可以将软件构建产物与其运行环境发布成Docker镜像,使交付变得更加简洁。