基于Jenkins持续集成部署研究与实现
2021-12-17程宁戴远泉
程宁,戴远泉
(湖北轻工职业技术学院,湖北武汉,430070)
0 引言
近年来,随着软件开发复杂度的不断提高,传统的瀑布式开发流程存在着明显的不足。在项目开发过程中,由于存在需求层面的不断变更,导致采用瀑布式开发流程既无法控制业务需求的变更,又抑制了反馈的周期阈值,随之而来的可能项目开发延期甚至于失败。因此,如何更好地协同工作、缩短软件开发周期并提高软件产品开发的质量,已经成为软件从业人员不可回避的问题。
持续集成正是针对这一类问题的一种软件开发实践。持续集成鼓励团队开发成员经常集成编译、构件、部署、测试和发布工作,并且每次集成都是自动化实现的。通过持续集成的引入,降低了软件开发风险,提高代码质量,使项目管理人员能更好地了解项目的开发进度,从而使团队能够更快地开发内聚的软件。
1 持续集成的概述
■1.1 持续集成定义
持续集成(Continuous Integration,英文缩写CI),是软件开发流程中一系列的最佳实践,指在开发阶段对项目进行持续性自动化编译、测试,以达到控制代码质量的手段。持续集成可以理解是一种系统研发的迭代,通过一次又一次将代码上传到代码仓库、进行集成测试和功能测试,从而实现项目与产品的迭代。由于整个过程是一个全自动的代码编译、发布、测试的过程,从而可以使问题尽早暴露和解决。通过运用持续集成技术,可使系统能时刻处于可工作状态,在任意时间都可以发布和部署。
持续集成包含自动化构建和自动化测试。自动化构建可以在持续的基础上收到反馈并进行改进,有利于减少开发的重复过程,缩短开发周期和降低费用和工作量。自动化测试解决了传统手工测试中存在的高重复性测试工作,能更加充分的测试系统中的各个单元,其对单元测试较为依赖。测试覆盖率越高,单元测试越准确,越能体现持续集成的效果。因此,持续集成能提高交付效率和交付软件的质量。
■1.2 持续集成系统的组成
一个完整的持续集成系统必须包括以下几项。
(1)一个自动构建过程,包括自动编译、分发、部署和测试等。
(2)一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时,其为构建过程的素材库。
(3)一个持续集成服务器。Jenkins就是一款配置简单且使用方便的持续集成服务器。
■1.3 持续集成工作流程
实现持续集成需要用到版本控制软件、构建工具和持续集成软件等工具。其工作流程如下所述。
(1)当开发人员需要进行源代码的版本更新时,通过版本控制软件的账号和密码认证,以及对应在的代码仓库权限的判断后,开发人员将更新的源代码提交到远程的代码仓库中。
(2)当持续集成服务器检测到代码变更后,会立即触发构建过程,从远程的代码仓库中拉取源代码,然后构建工具对源代码进行编译代码、运行单元测试、执行代码分析,打包成二进制包等工作。
(3)构建工作完成后,会触发自动化测试工具执行自动化测试,通过自动化测试来验证集成是否成功。
(4)测试完成和评审通过后,从其部署到生产环境中。
2 持续集成方案应用案例
■2.1 案例设计
本案例以Docker作为基础设施环境,整合Git+Maven +Jenkins实现构建持续集成的解决方案。在本方案中,Git作为版本管理服务器,Maven作为项目管理工具、Jenkins作为持续集成服务器。
(1)Docker:Docker作为一个开源的应用容器引擎,可以将开发人员的代码运行环境、配置文件共同打包到一个可移值的容器中,可随时发布到任意机器上,由于容器完全采用沙箱机制,利于开发者和运维人员进行使用。
(2)GitHub:GitHub是面向开源及私有软件项目的托管平台,具有基于Web服务的管理界面,通过管理界面可以为开发者和管理者提供代码仓库服务,以实现创建、访问、上传、更新服务。
(3)Maven:Maven是目前较流行的软件工程管理工具。基于项目对象模型(POM)的理念,可以从项目的各个环节进行管理和控制,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。
(4)Jenkins:Jenkins是一个开源的、功能强大可扩展的持续集成工具,是基于Java开发的可视化WEB平台,对于允许持续集成和持续交付的项目而方,无论采用何种平台,充分能处理任意类型程序的构建或持续集成。
(5)Docker仓库:Docker仓库是用来集中存储Docker镜像的地方。Docker镜像是Docker容器运行的基础,可以理解为Docker镜像是静态的定义,而Docker容器是镜像运行的实例。
■2.2 案例实现
(1)安装基础环境
Docker内核基于Linux,因此本案例使用Centos7作为宿主机操作系统,Docker的版本选择20.10.6。
(2)安装JDK+Maven
下载的JDK和Maven安装包,并进行安装。安装完成后,通过修改/etc/profile文件,添加如下环境变量后,重启系统或利用source /etc/profile命令使配置生效。
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_162
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
export M2_HOME=/usr/local/maven3
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
(3)配置GitHub
①拉取gogs和mysql镜像,利用获取的镜像创建容器,可在拉取镜像前通过配置镜像加速器提高拉取速度。
# docker pull gogs/gogs:latest
# docker pull mysql:latest
# docker run -d -p 3000:3000 --name mygogs gogs/gogs:latest
# docker run -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=000000 --name mygogs-mysql mysql:latest
②进入mygogs-mysql容器,并建立gogs数据库。
# docker exec -it mygogs-mysql /bin/bash
root@01370d705e5c:/# mysql -uroot -p000000
mysql> create database gogs; //建立gogs数据库
③配置Gogs服务,并新增仓库名为hbliti的仓库,如图1所示。
图1 hbliti仓库
④执行如下命令设置GitHub。
# git clone http://192.168.5.102:3000/hbliti/hbliti.git
(4)Jenkins配置
①在利用Jenkins部署过程中,需要安装相应的插件,可进入“插件管理”,依次安装 “docker-build-step”、“Maven Integration”和“Deploy to container”插件。
②新建Maven项目,由于项目利用Git完成代码托管,利用Jenkins实现代码版本控制,因此需要在Jenkins的Git插件中设定代码仓库的账号和部署分支。并设置SCM,SCM可设定轮询时间,包括定时轮询和循环轮询,本例设置为“H/1 * * * *”,如图2所示。
图2 配置构建触发器
说明:“H/1 * * * *”表示一分钟构建一次,各参数代表的含义如下。
n 第1个“*”表示分钟,取值为0~59。
n 第2个“*”表示小时,取值为0~23。
n 第3个“*”表示一个月的第几天,取值为1~31。
n 第4个“*”表示第几月,取值为1~12。
n 第5个“*”表示一周中的第几天,取值为0~7,其中,0和7代表的都是周日。
③通过“构建环境”选项卡,修改“Build”栏目信息,配置构建环境,如图3所示。其中pom.xml是Maven项目的核心构建文件,构建时要指明文件的路径。
图3 配置构建环境
④将Maven项目上传到Git仓库中,上传时需通过git的账号和密码的认证。代码如下:
# git init
# git add test-maven
# git config --global user.email “hbliti@qq.com”
# git config --global user.name “hbliti”
# git commit -m “first hbliti commit”
# git remote add origin http://192.168.51.100:3000/ hbliti/hbliti.git
# git push -u origin master
⑤通过上述操作,可以实现当Git仓库中部署分支的代码发生更新变化后,Jenkins会自动对新代码进行项目构建。构建完成后,为区分构建版本,可利用Docker tag命令增加版本号信息重命名镜像,利用docker push命令将镜像上传至镜像仓库中。
3 结语
本文通过介绍传统的瀑布式开发在当前软件开发中存在问题,对持续集成及持续集成的工作进行介绍,并设计了一种以Docker作为基础设施环境,整合Git+Maven+ Jenkins实现构建持续集成的解决方案并加以实现。希望本文的研究结果能为相关软件开发团队引入持续集成带来实际的借鉴价值。