APP下载

基于Jenkins和Docker容器技术在数字化电站项目自动化部署的研究及应用

2020-04-05蔡永健路云菲邬远祥唐海涛

计算机时代 2020年2期

蔡永健 路云菲 邬远祥 唐海涛

摘  要: 随着信息技术飞速发展,工程项目发展多元化,工程数字化管理系統日趋复杂,系统软件更新迭代日益频繁,而传统人工手动部署软件会耗费大量人力成本。为了提高软件研发及交付效率,文章基于持续集成引擎Jenkins和容器引擎Docker提出一种自动化部署的解决方案,并在数字化智能电站系统上应用,在其系统软件研发交付过程中实现开发环境、测试环境、生产环境的快速自动化部署,对于提高软件研发效率和项目按时履约具有重要的推进作用。

关键词: Jenkins; Docker; 容器化; 自动化部署

中图分类号:TP399          文献标识码:A    文章编号:1006-8228(2020)02-77-04

Research and application of technologies of Jenkins and Docker container in

automatic deployment of digital power station

Cai Yongjian1,2, Lu Yunfei1,2, Wu Yuanxiang1,2,3,4, Tang Haitao1,2,3

(1.Powerchina Huadong Engineering Corporation Limited, Hangzhou, Zhejiang 311122, China;

2.Zhejiang Huadong Engineering Digital Technology Co., Ltd.;

3.Digital City CIM Technology Zhejiang Engineering Research Center; 4.Zhejiang Engineering Digital Research Center)

Abstract: With the rapid development of information technology, diversified engineering projects, engineering digital management systems are becoming more and more complex, and system software update iterations are becoming more frequent. Traditional manual deployment of software will take up a lot of labor costs. In order to improve software R&D and delivery efficiency, this paper uses continuous integration engine Jenkins and container engine Docker to propose an automated deployment solution and apply it on the digital intelligent power plant system to realize rapid and automatic deployment of the development environment, test environment and production environment during the system software development and delivery process, which plays an important role in promoting software R&D efficiency and guaranteeing project performance on time.

Key words: Jenkins; Docker; containerization; automatic deployment

0 引言

随着软件系统功能逻辑复杂化、更新频繁化的发展进程,手动部署的方式可能导致交付滞后的问题,自动化部署技术应运而生,并已经成为绝大多数公司软件研发的标准配置。我们公司的主要产品为工程数字化管理软件,采用Jenkins和Docker技术完成自动化部署任务。Docker容器化技术[1]具有轻量化、跨平台、消除线上线下环境差异等特性;持续集成引擎Jenkins[2]具备开源、易上手、插件丰富等优势,这两者结合提供了一种高效的自动化部署解决方案。

数字化抽水蓄能电站是水电工程运维期管理系统,由于水电站建设周期长、参与单位多等特点,其管理系统具有功能高度复杂化、开发迭代频率高的特征,基于Jenkins+Docker容器技术的自动化[3]部署方案在很大程度上提高了其研发的效率,为项目履约提供了技术保障,同时,也为公司能够快速抢占市场份额提供了重要的技术支撑。

1 Docker 简介

1.1 Docker的概念

Docker使用Google公司推出的Go语言开发实现,基于Linux内核的Cgroup和Namespace,以及AUFS类的UnionFS等技术,对进程做封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它进程,因此称为容器[4]。Docker在容器的基础上进一步封装,从文件系统、网络互联到进程隔离,极大地简化了容器的创建和维护,使得Docker技术比虚拟机技术更为轻便和快捷。

1.2 Docker的优势

⑴ 更高效的利用系统资源

相比于传统虚拟化技术,由于Docker容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高,无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,一个相同配置的主机,往往可以运行更多数量的应用。

⑵ 更快速的启动速度

传统虚拟机技术启动服务往往需要数分钟,而Docker容器直接运行于宿主机内核,无需启动完整的操作系统,因此可以做到秒级甚至是毫秒级的启动速度,可以达到用户无感知的平滑升级。大大地节约了开发、测试、部署的时间。

⑶ 一致的运行环境

软件开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境的不一致,导致有些bug并未在开发过程中被发现。而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境的一致性,从而不会再出现“这段代码在我机器上没有问题”此类问题。

⑷ 迁移更高效

由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,其运行结果是一致的。因此用户可以很轻易的将一个平台运行的服务,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况发生。

⑸ 维护和扩展更轻松

Docker的分层存储技术,使得镜像重复部分的复用更为容易,也使得镜像的维护更新更加简单,基于基础镜像进一步扩展也变得更加容易。此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以在生产环境使用,又可以作为基础进一步定制,大大地降低了应用服务的镜像制作成本[5]。

2 Jenkins简介

2.1 Jenkins的概念

Jenkins是基于Java开发的一种可扩展的开源持续集成引擎,用于监控持续重复的工作,是业内比较常用的软件自动化工具之一。

持续集成是在开发阶段对项目进行持续性自动化编译、测试,以达到控制代码质量的目的。其具备即时发现问题,追踪问题、修复问题的机制,改变了在所有代碼编写完成后才提交给QA部门的传统方法。每次集成都通过自动化的构建来验证,及早发现集成错误,在研发过程中可极大减少集成导致的问题。

2.2 Jenkins的优势

⑴ 跨平台

支持几乎所有的平台,可在Windows,Ubuntu/Debian,RedHat/Fedora/CentOS,MacOSX等常见的操作系统下运行。

⑵ 易于配置

Jenkins可以通过友好的webGUI轻松设置和配置,其中包括即时错误检查和内置帮助。不需要手动编辑xml配置文件,虽然Jenkins也支持手动修改xml配置文件。

⑶ 插件丰富

Jenkins拥有数以千计的插件,几乎集成了所有自动化相关的工具,由于Jenkins可以通过插件架构进行扩展,为其提供了无限可能。在项目构建后,Jenkins也提供了邮件反馈形式,可以将构建结果及时告知相关人员。

3 自动化部署方案

3.1 环境搭建

自动化部署硬件环境包含一台Jenkins持续集成服务器、一台DockerRegistry 私有镜像仓库服务器、一台GitLab代码仓库服务器和多台应用服务器,应确保在整个网络中Jenkins服务器可以访问其他服务器,应用服务器能直接访问Docker Registry服务器。其次,Jenkins服务器需要安装Docker容器引擎软件并实现登录Docker Registry认证。

3.2 工作原理

开发人员在Gitlab服务器创建一个Project,确定各部署环境对应分支并将Jenkins服务器的SSH key加入到GitLab的SSHKey管理中心,确保Jenkins有权限访问GitLab并可获取代码。在Jenkins中配置相关的参数:如BuildTriggers中轮询GitLab分支的间隔时间、SSH remote hosts中的SSH sites远程服务器登录配置、Extended E-mail Notification 中的参数等,保证自动化部署流程的实现。

Jenkins服务器每个任务都会根据Build Triggers中的配置定时轮询GitLab代码分支,当检测到GitLab分支上有代码变动时就会触发一系列的动作:自动拉取代码、编译代码、构建镜像、上传镜像至镜像仓库。构建完成后再调用远程服务器的脚本完成软件更新,最后调用邮件功能,将结果发送给研发人员和项目负责人,主流程如下图1所示。

4 自动化部署实践

4.1 项目描述

数字化抽水蓄能电站管理系统是水电站全生命周期的项目管理系统,通过收集实体电站全过程管理数据,采用三维可视化技术,实现物理电站和虚拟电站在全过程管理数据的一一对应,实现“一站式”电站的工程管理、资产管理、生产管理、安全管理、运检管理、资料管理等功能,为管理层的决策提供技术支持,保证电站的安全、优质、经济运行,提高企业效益[6]。

4.2 项目实践

项目采用前后端分离的方式开发,前端采用Facebook和Instagram开源的React框架,后端使用微服务架构,采用Java和Python两种语言,前后端采用Restful API接口进行数据交互。

对于Python应用,在Jenkins中配置shell脚本,利用自定义的Dockerfile文件将代码及其运行所需环境封装到Docker镜像中,上传至Docker Registry,调用SSH插件功能执行远程服务器上的更新脚本,下载最新镜像,利用docker-compose容器编排工具完成迭代。

对于Java应用,Jenkins会调用Maven工具将代码编译打包成Jar包,通过SCP命令上传至应用服务器,调用Java镜像启动容器执行java-jar命令完成软件更新。

前端代码使用Nodejs编译成静态的文件,采用Nginx托管,Jenkins将源代码下载到本地并通过Node镜像启动容器将代码编译成可部署的静态文件,将编译后的代码推送到远端Nginx服务器完成部署。最后将构建结果通过E-mail发送至开发人员和研发负责人。在更新的过程中,Jenkins也会根据配置执行代码扫描和单元测试,执行结果如图2和图3所示。

软件研发过程中使用不同的分支管理不同环境的源代码,开发人员将代码提交到dev分支上,Jenkins轮询机制会检测到COMMITID变更而触发构建,执行特定的脚本完成软件更新,期间自动执行单元测试并反馈运行结果。自测通过后合并代码到test分支,jenkins完成自动化部署到测试环境,QA团队开始测试工作。

数字化抽水蓄能电站系统一共有15个功能模块,每个模块平均构建300次,人工部署时,更新一次需要大概5-10分钟,如果操作错误则花费更长时间。而自动化部署每次构建平均只耗時1分30秒,并保证每次更新的一致性,减少了因人为失误导致的更新滞后问题,部署结果如图4所示。根据以上数据粗略估算,自动化部署技术为该项目运维节省时长可达600小时,而且,Docker镜像也保证了各服务器上运行环境的一致性,加快项目研发进度,节约人力资源。

5 结束语

本文重点介绍了基于Jenkins和Docker容器技术在软件研发过程中自动化部署的实现方案,并概述了在数字化抽水蓄能电站项目上的实践情况。基于以上论述可看出,该技术对项目持续集成、持续交付方面有很大的提升作用,在很大程度上减少了开发、测试、运维部门由于系统环境差异引起的矛盾,为项目履约提供了技术保障。同时,也可以为公司DevOps[7]发展提供理论依据和实践成果,能在一定程度上为微服务架构[8]项目在私有云、公有云自动化部署积累宝贵的经验;更为公司今后实现自动化运维计划提供了宝贵的经验。

参考文献(References):

[1] James Turnbull.《第一本Docker书》.人民邮电出版社 2014-12[1-15]

[2] 周莹,欧中红,李俊.基于Jenkins的持续集成自动部署研究[J].计算机与数字工程,2016.2.

[3] 杨洪娇.基于Docker的高校网站自动部署应用[J].无线互联科技,2017.

[4] 蔡志强.基于Docker技术的容器隔离性分析[J].电子世界,2017.

[5] 刘国乐,余彦峰.浅析Docker容器技术[J].保密科学技术,2017.10.

[6] 钱玉莲,王金峰,王国光,邓新星.数字化设计在仙居抽水蓄能电站中的应用[J].2018.2.

[7] 黄璜,张贺,邵栋.自动化工具对中国DevOps实践的影响[J].软件学报.

[8] 王方旭.基于Spring Cloud和Docker的微服务架构设计[J].中国信息化,2018.3.