APP下载

以持续集成方式进行系统自动化部署

2015-12-02

华东师范大学学报(自然科学版) 2015年1期
关键词:复旦大学代码部署

高 珺

(1.复旦大学校园信息化办公室,上海 200433;2.复旦大学计算机科学技术学院,上海 200433)

0 引 言

随着信息技术的发展,以及高校对于信息化工作的逐步重视.目前,许多高校都在进行大规模的信息化建设.对于部分起步较早的高校而言,以及开始进入开发、维护、升级并举的阶段.

对于有些应用,需要对用户的新需求做出及时的反馈;对于解决的问题,在测试之后需要及时部署到正式服务器中.在传统的部署流程中,重新部署服务器是一个比较复杂的过程.牵涉到停止服务、更新系统、重启系统等多个步骤.在整个部署过程中,还需要尽量减少对用户的影响,避免出现用户在使用服务时意外中止的情况.以往,要执行此操作,可能需要提前发布系统更新通知,或者挑选用户不使用系统的凌晨进行操作.对于经常更新的系统,无论采取上述的何种方案,都是一个费时费力的过程.

复旦大学的网络教学平台eLearning基于在欧美高校广泛使用的开源软件Sakai[1].同时,根据国内高校的使用情况,发布了Sakai共享版[2].为了及时将新功能提供给用户,及时发布解决问题的补丁,需要将更新的内容发布到Sakai共享版的测试服务器、eLearning校内测试服务器和正式服务器、以及协助云南大学部署的测试服务器上.为了简化更新部署流程,我们探索了一条自动化的持续集成、发布方案.

从源代码角度来看,所有Sakai相关的代码都通过分布式版本控制软件Mercurial进行管理,不同的部署对象使用不同的分支.对于Sakai共享版,使用default分支;对于eLearning系统及其测试服务器,使用fudan分支;对于协助云南大学部署的测试系统,使用ynu分支.

从服务器角度来看,Sakai共享版和云南大学测试系统,均只使用一台服务器;eLearning系统正式服务器使用4个Tomcat节点,测试服务器使用2个Tomcat节点,部署时,需要更新这6台服务上的代码.

假设在代码级别进行了一个更新,如果希望在所有的相关服务器上看到效果,总共需要对8台服务器进行重新部署操作.即使不考虑中断用户操作的问题,也需要对这8台服务器依次进行8次类似的更新代码、编译、停止服务器、部署、启动服务器操作.考虑到遗留代码可能与新代码存在冲突,需要进行完整部署.要完成这一系列操作,需要耗费相当长的时间.而在整个过程中,工作人员需要守候在计算机前,进行操作和监控.

1 解决方案

1.1 持续集成工具与Jenkins

持续集成(Continuous Integration)最早是源自极限编程(Extreme Programming)的概念[3].用来减少繁复的部署过程,通过预先设置好的策略,对于周期性的或触发性的更新、迭代进行自动化操作.Jenkins[http://jenkins-ci.org]是目前使用较为广泛的开源持续集成工具,拥有大量的第三方插件,可以与许多常见软件共同使用.

在复旦大学的Sakai相关部署中,使用了分布式版本控制软件Mercurial,自动编译工具Apache Maven,Linux服务器.通过Jenkins的不同插件,可以有效地将这些工具结合起来.

相对于传统的crontab进行计划任务的方式,使用Jenkins可以更加易于配置.例如,在配置的直观性、其它辅助程序调用(如集成失败后的email通知)方面有为明显.

图1是目前已配置的Jenkins任务截图,可以从途中非常清晰地看到各个任务的运行状态.

图1 Jenkins任务一览

1.2 分析部署流程

如果要使用持续集成方案,首先必须对现有的手动操作进行分析,然后再通过编写相应的配置,将其转为自动化的过程.

以复旦大学的Sakai相关部署为例,分析需要进行自动化的过程.

(1)Sakai共享版测试服务

从版本控制系统中获取最新的default分支代码?编译?单元测试?停止应用服务器?部署应用服务器?启动应用服务器

(2)复旦大学eLearning系统

从版本控制系统中获取最新的fudan分支代码?编译?单元测试?停止测试服务器?部署测试服务器?启动测试服务器?停止正式服务器?部署正式服务器?启动正式服务器

其中测试服务器相关的操作要依次在2个节点上进行;正式服务器相关的操作需要依次在4个节点上进行.在测试服务器启动后,应当先检查服务是否正常启动.如果启动不正常,应当终止后续的正式服务器部署.以免影响正式服务器提供正常服务.

(3)云南大学Sakai测试系统

从版本控制系统中获取最新的ynu分支代码?编译?单元测试?停止应用服务器?部署应用服务器?启动应用服务器

1.3 配置部署策略

1.3.1 分析流程

仔细分析上述过程之后,可以发现,对于上述3种情况,都可以将其划分为代码相关过程(获取代码、编译、单元测试)和部署相关过程(停止、部署、启动服务器)两个部分.其中,后者可能根据实际情况会进行多次.将这2个部分作为可配置的子任务进行配置,将带来很大的灵活性,并为将来可能出现的类似需求提供解决的模板.

同样,对于上述这样的类似应用,在配置过程中应尽量使用模板化的配置方式,将共有部分提取出来,而把特定的内容(如代码分支,目标服务器地址,目标部署路径等)通过配置文件的形式进行分离.提高配置的重用性.

1.3.2 代码相关流程

在获取代码时,由于本文中的例子中都是使用Mercurial进行代码控制,所以,可以直接通过Jenkins的Mercurial插件进行配置.

在编译时,考虑到不同版本的代码可能会出现功能冲突,比较稳妥的方式是使用完全编译的方式.这种方式虽然在耗时上会高于增量编译,但是为了目标代码的稳定性,相应时间上的损耗是可以接受的.

1.3.3 部署相关流程

在部署服务器的过程中,都由停止、部署、启动三个过程组成,这就为模板化提供了方便,只需要将不同的脚本在配置文件中设置好.然后在Jenkins中通过调用配置文件中的相应属性值执行即可解决问题.

在实践中,为了避免旧代码与新代码同时存在时可能发生的冲突,在执行部署操作前,会增加一个额外的步骤,将目标服务器中的旧编译结果全部删除,然后在部署环节中使用新的编译结果进行部署.由此来避免可能的冲突.

对于eLearning服务器的部署中,需要对4台服务器进行更新.在Jenkins配置中,将单个服务器的配置以模板的方式进行,然后将不同服务器的特定属性(如IP地址,部署位置等)设置在配置文件中,进行相应的管理.然后,在部署时,对4台服务器进行依次部署,避免整个服务中止响应的情况.

在停止、启动服务阶段,为了保证操作成功完成,需要增加相应的检查步骤.具体的操作为,在停止命令执行后,检查相应的服务端口是否停止服务;在启动命令执行后,检查相应的服务首页是否可以正常获取.在这个过程中,考虑到服务器的停止、启动需要一定时间,需要根据具体情况,为相应的检查步骤设定一个最长等待时间来进行判断.

1.3.4 其它考虑的问题

对于集成的频率,对于一般的更新只需要每天一次就可以基本满足实际需要.对于需要紧急部署的安全补丁,可以通过手动执行的方式进行.由于并不是每天都有代码更新,所以,在计划执行时,还需要检验版本库中的代码有没有进行相应的更新.只有在代码有更新时,才执行相关部署过程.

对于代码编译,如果直接在应用服务器上进行,那就意味着在服务器中留有应用的源代码,这本身是没有必要的.在本文的实践中,使用单一服务器进行所有的代码编译.然后通过SSH方式将编译完成的结果发送到目标服务器的指定位置.

对于代码部署时可能造成用户中断操作的问题,目前的解决方案是通过观察系统的用户登录习惯,选择几乎没有用户使用的凌晨3、4点进行更新操作.考虑到案例中只有eLearning服务器提供正式服务,并且是依次进行的,再加上eLearning采用了支持单点登录的方式进行多节点部署,在进行重启服务器的过程中(小于5 min),不会给用户带来较大影响.

2 今后的工作

2.1 集成虚拟机操作

在本文提到的案例中,所有的服务器都是以VMWare虚拟机的形式进行部署.这就为今后结合虚拟机的特点,提高虚拟机利用效率带来了可能.例如,在假期中,由于系统负载比较小,eLearning系统并不需要同时开启4台应用服务器.此时,可以只通过2台应用服务器提供服务,而关闭另外2台应用服务器作为备用服务器.然后,在代码更新时,先通过虚拟机的管理API打开备用服务器,然后执行相关自动集成操作,再通过管理API关闭虚拟机.

由此,即节省了虚拟机集群的资源,同时由保证了备用服务器可以在需要的时候随时可以开机成为正式服务器.

2.2 避免中断用户操作

在进行应用服务器重新部署时,可能会导致已经在线的用户操作中断的情况,虽然这个问题可以通过选择低谷时间、负载均衡和单点登录等方式解决大部分问题,但仍旧无法避免此问题的产生.

如果要完全避免此问题,需要应用服务器方面提供接口,用来判断不同节点中的在线人数,再通过负载均衡策略,依次等待服务器中的用户退出,然后更新相应的空闲节点.如果遇到用户长时间在线不退出的情况,可能会导致整个过程等待很长时间,甚至产生不同节点之间的功能不一致的情况.所以,仍需要进一步设计相关的更新策略.

3 结束语

通过对复旦大学Sakai相关服务器的持续集成探索,可以发现采用持续集成方式可以将繁琐的日程更新、部署应用系统的过程大大简化,减轻系统维护人员的工作量.希望我们的探索能够给面临同样需求的兄弟高校带来参考.

[1] 高珺.复旦大学:以Sakai设计网络教学平台[J].中国教育网络,2013(5):62-64.

[2] 高珺,宓詠.基于开源软件的高校网络教学平台建设与推广[J].武汉大学学报,2012(S1):271-276.

[3] KENT B,CYNTHIA A.Extreme Programming Explained:Embracing Change[M].2nd ed USA:Addison-Wesley Educational Publishers Inc,2004.

展开全文▼
展开全文▼

猜你喜欢

复旦大学代码部署
一种基于Kubernetes的Web应用部署与配置系统
晋城:安排部署 统防统治
部署
复旦大学附属中山医院整形外科简介
复旦大学附属中山医院整形外科简介
创世代码
创世代码
创世代码
创世代码
部署“萨德”意欲何为?