CN101957778A - 软件持续集成的方法、装置和系统 - Google Patents
软件持续集成的方法、装置和系统 Download PDFInfo
- Publication number
- CN101957778A CN101957778A CN2010102904801A CN201010290480A CN101957778A CN 101957778 A CN101957778 A CN 101957778A CN 2010102904801 A CN2010102904801 A CN 2010102904801A CN 201010290480 A CN201010290480 A CN 201010290480A CN 101957778 A CN101957778 A CN 101957778A
- Authority
- CN
- China
- Prior art keywords
- agency
- subtask
- subtasking
- master control
- supervisor
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5055—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering software capabilities, i.e. software resources associated or available to the machine
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Hardware Redundancy (AREA)
Abstract
本发明公开了一种软件持续集成的方法,包括:接收并管理CI主控发送的CI子任务;根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行当前管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理,使所述目的CI代理执行所述可执行子任务,所述至少两个CI代理为通用计算单元。本发明还公开了一种软件持续集成的装置,包括:可执行子任务接收模块;目的CI代理确定模块;本发明通过向为通用计算单元的目的CI代理发送可执行子任务,增加了执行CI子任务的CI代理的可选性。该系统各装置之间的通信采用动态注册机制,实现了CI主控机和CI代理的动态热插拔和水平扩展,从而有效地提高了系统的扩展性。
Description
技术领域
本发明涉及持续集成技术领域,特别涉及一种软件持续集成的方法、装置和系统。
背景技术
CI(Continuous Integration,持续集成)是一种自动化的软件创建与测试过程,在软件开发项目中,CI系统将每个CI任务分解成多个CI子任务,如将对某软件的CI任务分解成获取最新代码、编译代码、打包、发布、安装、自动测试、质量检测和数据度量等CI子任务,通过不断的执行CI子任务,可尽早地发现软件缺陷,并对其进行修复。由此可见,不同的CI系统的优劣可对于软件的开发效率和投入成本造成不同的影响。
现有的CI系统如图1所示,主要由CI主控和CI代理组成,其对软件进行CI的主要步骤为:首先,用户向某一CI主控下发CI任务;然后,该CI主控将该CI任务分解成多个CI子任务,并将该CI子任务下发至相应的CI代理执行,其中每个CI代理负责执行的CI任务类型是固定的;最后,由该相应的CI代理执行该CI子任务,并将执行结果返回CI主控。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:
现有的持续集成系统中,由于CI代理负责执行的CI任务类型是固定的,CI主控只能下发固定的CI任务至相应的CI代理,没有选择的可能性,从而CI代理资源的共享程度低,资源利用率低下。
发明内容
本发明实施例提供了一种软件持续集成的方法,以实现CI代理间的负载分担,提高CI代理的利用率。
一方面,本发明实施例提供一种软件持续集成的方法,包括:
接收并管理CI主控发送的CI子任务;
根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行当前管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理,使所述目的CI代理执行所述可执行子任务,所述至少两个CI代理为通用计算单元。
本发明实施例还提供了一种软件持续集成的装置,所述装置包括:
可执行子任务接收模块,用于接收并管理CI主控发送的CI子任务;
目的CI代理确定模块,用于根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行当前管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理,使所述目的CI代理执行所述可执行子任务,所述至少两个CI代理为通用计算单元。
本发明实施例还提供了一种软件持续集成的系统,包括:至少两个CI主控、CI管理机、至少两个CI代理,所述至少两个CI代理为通用计算单元;
所述CI主控用于接收用户下发的CI任务,将所述CI任务分解成至少两项CI子任务,向所述CI管理机发送当前可执行的CI子任务;
所述CI管理机用于接收并管理所述CI主控发送的CI子任务;根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行自身管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理;
所述CI代理为所述CI管理机确定的目的CI代理时,用于接收并执行所述CI管理机发送的当前可执行子任务。
可见,本实施例通过根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理,实现CI代理间的负载分担,提高CI代理的利用率以及持续集成的效率。
附图说明
图1是现有技术中CI系统的结构示意图;
图2是本发明实施例1中提供的软件持续集成的方法流程图;
图3是本发明实施例2中提供的软件持续集成的方法流程图;
图4是本发明实施例3中提供的软件持续集成的方法流程图;
图5是本发明实施例4中提供的第一种CI管理机的结构示意流程图;
图6是本发明实施例4中提供的第二种CI管理机的结构示意流程图;
图7是本发明实施例4中提供的第三种CI管理机的结构示意流程图;
图8是本发明实施例5中提供的软件持续集成系统的结构示意流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例1
如图2所示,本发明实施例提供了一种软件持续集成的方法,该方法包括以下步骤:
S101:接收CI主控发送的CI子任务;
S102:根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行当前管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理,使所述目的CI代理执行所述可执行子任务,所述至少两个CI代理为通用计算单元。
本实施例中,当前管理的至少一个CI子任务中的当前可执行子任务,可以是当前接收的所述CI子任务,也可以是之前接收的CI子任务。
可见,本实施例通过根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理,实现CI代理间的负载分担,提高CI代理的利用率以及持续集成的效率;通过CI管理机接收并管理一个或多个CI主控发送的CI子任务,并由CI管理机将自身当前管理的至少一个CI子任务中的当前可执行子任务发送给CI代理处理,进而支持CI主控间的并发任务控制。
实施例2
如图3所示,本发明实施例提供了一种软件持续集成的方法,该方法包括以下步骤:
S201:CI管理机接收CI主控和CI代理发送的注册请求;
具体的,CI主控和CI代理启动时,以心跳的形式发送向CI管理机注册请求,与CI管理机建立通讯连接,CI管理机中将产生一个由所有向其注册的CI代理组成的CI代理资源池,资源池中的CI代理为通用的计算单元。
其中,CI主控发送的注册请求的请求信息中包括CI主控间的子任务依赖关系和其指定的CI代理类型,不同类型的CI代理可以支持不同操作系统和特殊CI任务。
S202:CI管理机接收CI主控和CI代理发送的注册请求,根据至少两个CI主控发送的注册请求,获取至少两个CI主控间的子任务依赖关系和至少两个CI主控指定的CI代理类型;根据至少两个CI代理发送的注册请求,获取所述CI代理的类型,将至少两个CI代理按其类型组织成不同的CI代理资源组。
具体的,CI管理机根据至少两个CI主控发送的注册请求,获取至少两个CI主控间的子任务依赖关系和至少两个CI主控指定的CI代理类型,生成子任务依赖关系表和在线CI代理类型表;CI管理机根据至少两个CI代理发送的注册请求,获取所述CI代理的类型,将至少两个CI代理按其类型组织成不同的CI代理资源组,将CI代理类型相同的CI代理划分在同一个CI代理资源组中。
S203:用户发送CI任务到CI主控;
具体的,用户可以通过Web(网络)或GUI(Graphical User Interface,图形用户接口)发送CI任务到CI主控;
例如,用户需要更新其正在开发的S1软件,即把对S1新开发产生的内容与当前的S1软件的内容集成起来,则其可通过Web将向CI主控发送对软件S1的CI任务。
S204:CI主控将接收到的CI任务分解为多个CI子任务,并将该多个CI子任务缓存至主控任务队列;
例如,当CI主控A接收到用户发送的针对软件S1的CI任务a后,对该CI任务a进行分解,得到三个CI子任务a1、a2和a3,该三个CI子任务分别为:获取软件A的最新代码、安装该新代码和对该新代码进行自动测试;然后CI主控将上述三个CI子任务缓存至主控任务队列L1。
其中,缓存队列用于存储由CI主控分解得到的CI子任务。
S205:CI主控将当前可执行的CI子任务从主控任务队列取出,并指定当前可执行的CI子任务的子任务权值;
具体的,CI主控从主控任务队列中缓存的CI子任务中获取当前可执行的CI子任务,并根据执行该CI子任务所需的CPU和内存来制定子任务权值。
其中,子任务权值,用于表示CI子任务的任务量,子任务权值越大,表示该CI子任务的任务量越大,则用于执行该CI子任务所需的计算资源越多;子任务权值越小,表示该CI子任务的任务量越小,则用于执行该CI子任务所需的计算资源越少;其中,计算资源包括执行CI子任务所需的内存和执行设备的CPU资源。可执行子任务,是指其执行不依赖于其他CI子任务的执行结果即可执行的CI子任务,和/或当前其需要依赖的其他CI子任务的执行结果已产生的CI子任务;其中,其他CI子任务即可以是属于同一个主控的CI子任务,也可以是属于不同主控的CI子任务。
例如,主控任务队列L1中缓存了三个CI子任务a1、a2和a3,分别为获取软件A的最新代码、安装该新代码和对该新代码进行自动测试,其中,CI子任务a1,即获取软件A的最新代码,是当前可执行的CI子任务;CI子任务a2,即安装该新代码,需要依赖CI子任务a1的执行结果;CI子任务a3,即对该新代码进行自动测试,需要依赖主控B中的CI子任务b1才能执行。则CI主控A从主控任务队列L1中获取的当前可执行的CI子任务为a1。当主控任务队列中的CI子任务的执行依赖于其所在CI主控中的其他CI子任务的执行结果时,CI主控查询该其他CI子任务的执行结果,如果该其他子任务已执行完,则该CI子任务为当前可执行的CI子任务。
当主控任务队列中的CI子任务的执行依赖于其他CI主控中的其他CI子任务的执行结果时,CI主控向CI管理机发送查询信息,通过查询CI管理机中的依赖CI子任务执行状态表,获取该CI子任务依赖的其他CI主控中的其他CI子任务的执行状态,如果该其他CI子任务已执行完,则该CI子任务为可执行子任务;如果该其他子任务未执行,则该CI子任务为当前不可执行的CI子任务,此时,CI子任务需等待其他CI子任务顺序执行完毕后,方可执行;优选的,如果其他CI子任务未执行,也可由CI管理机优先执行该其他CI子任务。
S206:CI主控将当前可执行的CI子任务发送至CI管理机;
具体的,CI主控将当前可执行的CI子任务信息缓存至主控下发队列,排队等待下发至CI管理机,该CI子任务信息中至少包括可执行子任务及其子任务权值;
例如,CI主控A将当前可执行的CI子任务a1及其子任务权值发送至CI管理机,而子任务a2和a3则继续缓存在该主控任务队列L1中,直至其依赖的CI子任务执行完毕,使其成为当前可执行的CI子任务后方可执行。
S207:CI管理机接收CI主控发送的CI子任务;
具体的,CI管理机接收CI子任务后,将其缓存至管理机任务队列,并排队等待将该CI子任务下发至CI代理,使其执行该CI子任务。
其中,CI管理机从管理机任务队列中取出自身当前可执行的CI子任务,简称为当前可执行子任务;
S208:CI管理机根据所述CI主控指定的CI代理类型,确定目的CI代理资源组;
具体的,CI管理机查询在线CI代理类型表,获取发送该可执行子任务CI主控的CI代理类型。查询各CI代理资源组,确定与该CI代理类型相同的CI代理资源组,该资源组为目的CI代理资源组。
S209:CI管理机在当前管理的CI代理资源池中的CI代理均处于在线通信状态时,根据所述至少两个CI代理返回的空闲状态查询响应,获取至少两个CI代理的计算资源闲置状态;
具体的,由于CI管理机定时向CI代理发送心跳轮询查询,获取的在线通信状态,CI代理收到心跳查询信息后向CI管理机发送心跳响应信息,其返回的心跳响应信息中,包含其当前的计算资源闲置状态。
S210:根据所述至少两个CI代理的计算资源闲置状态生成所述至少两个CI代理的空闲计算资源权值,如果当前CI代理的空闲计算资源权值大于或等于所述可执行子任务的子任务权值,则所述当前CI代理为目的CI代理。
具体的,CI管理机根据CI代理发送的计算资源闲置状态,得到CI代理的空闲资源权值。CI管理机判断该空闲资源权值是否大于或等于可执行子任务的子任务权值,如果是,则该CI代理为可选目的CI代理,CI管理机从可选目的代理中确定目的CI代理。优选的,CI管理机可通过在可选CI代理中随机选择一个CI代理作为目的CI代理;也可以为了更好的完成可执行子任务,选择可选CI代理中空闲资源权值最大的CI代理作为目的CI代理。
其中,目的CI代理是指其空闲资源权值大于或等于可执行子任务的CI子任务权值的CI代理。空闲计算资源的权值,用于表示CI代理当前的计算能力,空闲资源权值越大,CI代理当前的计算能力越强,则CI代理可执行子任务的任务量越大;空闲资源权值越小,CI代理当前的计算能力越弱,则CI代理可执行子任务的任务量越小,优选的,可根据CI代理当前的存储容量和其处理速度来制定其空闲资源权值。
S211:CI管理机将当前可执行子任务发送给目的CI代理;
具体的,CI管理机将可执行子任务缓存至管理机下发队列,排队等待下发至目的CI代理。
优选的,可根据可执行子任务的优先级下发可执行子任务。
S212:目的CI代理接收可执行子任务;
具体的,目的CI代理将可执行子任务缓存至CI代理任务队列,排队等待执行。
S213:目的CI代理将任务执行结果发送至CI管理机;并备份该任务执行结果,生成任务执行日志;
具体的,目的CI代理将任务执行结果缓存至CI代理上传队列,排队等待上传至CI管理机;优选的,可采用单独的存储设备对任务执行结果进行备份,用户可直接访问该存储设备查询任务执行结果,或通过发下查询命令至CI主控,由CI主控查询任务执行结果。
S214:CI管理机接收所述目的CI代理发送的所述可执行子任务的执行结果;
S215:CI管理机将接收到的执行结果发送给CI主控;
S216:CI管理机根据所述至少两个CI主控间的子任务依赖关系,判断是否有其他CI主控的子任务的执行依赖所述执行结果,如果有,则记录所述执行结果;
具体的,CI管理机将接收到的执行结果发送给CI主控后,查询CI主控注册表,判断当前是否有其他主控子任务的执行需要依赖所述执行结果,如果有,则依赖CI子任务执行状态表中记录该可执行子任务的执行结果,以便CI主控通过查询该依赖CI子任务执行状态表,从而确定该主控可执行子任务。
其中,CI主控注册表中记载了CI主空间的子任务依赖。
例如,CI管理机中存在一CI主控注册表T1,该表T1中记载了通过CI管理机下发CI任务的CI主控间的CI子任务依赖关系,如表T1所示:
表T1:
CI主控A | a3依赖b1 |
CI主控B | b1依赖c5 |
CI主控C | c3依赖a1 |
当CI管理机接收到CI主控A的CI子任务a1的执行结果,查询CI主控注册表T1,可知CI主控C中的子任务c3依赖a1的执行结果,则CI管理机在依赖CI子任务执行状态表中记录该可执行子任务的执行结果,当CI主控C在查询该依赖CI子任务执行状态表时,可获取到a1已执行完,则CI主控C确定c3为可执行子任务。
通过由CI管理机确定主控间子任务的依赖,使具有子任务依赖关系的主控及时的获取执行结果,从而有效地提高了主控的任务执行效率,减少了持续集成所需的时间。
S217:其他CI主控发送获取所述执行结果的请求;
具体的,当其他CI主控中存在依赖该执行结果的子任务时,其他CI主控通过发送获取执行结果的请求,获取该执行结果,当该可执行子任务的执行结果执行完毕时,则该依赖于该执行结果的子任务即为可执行子任务。
S218:CI管理机响应所述其他CI主控发送的获取所述执行结果的请求,使所述其他CI主控根据所述执行结果确定并发送当前可执行的CI子任务。
S219:向CI主控和CI代理发送心跳握手消息,以检测CI主控和CI代理的通信状态;当检测到所述目的CI代理通信状态异常,将所述目的CI代理未完成的可执行子任务重新发送给待执行所述可执行子任务的目的CI代理。
其中,使可执行任务失败存在多种原因,例如CI代理执行该可执行任务失败,或CI任务与CI代理间的在线通信状态异常导致信息丢失。
具体的,CI管理机重新发送可执行子任务至同一目的CI代理,或根据S206步骤确定一个新的目的CI代理,并将所述可执行子任务发送至新的目的CI代理,具体方式可根据可执行任务失败原因而定,本实施并不限定。通过CI管理机对可执行任务的重新发送,确保了CI子任务的执行。
优选的,当CI管理机可预设一时间阀值,当可执行任务后在预设时间阀值内未收到执行结果,即判定当前可执行任务执行失败,其中预设时间值大于或等于当前可执行任务执行时间和CI管理机与CI代理间的通信时间之和。
可见,本实施例通过根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理,实现CI代理间的负载分担,提高CI代理的利用率以及持续集成的效率;通过CI管理机接收并管理一个或多个CI主控发送的CI子任务,并由CI管理机将自身当前管理的至少一个CI子任务中的当前可执行子任务发送给CI代理处理,进而支持CI主控间的并发任务控制。
实施例3
如图4所示,本发明实施例还提供了一种软件持续集成的方法,该方法包括以下步骤:
步骤S301~S304与实施例3中S201~S204相同,详见实施例3,此处不再赘述。
S305:CI主控向CI管理机发送空闲计算资源权值的获取请求;
S306:CI管理机响应所述获取请求,将所述空闲计算资源权值发送给所述CI主控;
具体的,CI管理机在当前管理的CI代理资源池中的CI代理均处于在线通信状态时,根据所述至少两个CI代理返回的空闲状态查询响应,获取至少两个CI代理的计算资源闲置状态;根据所述至少两个CI代理的计算资源闲置状态生成所述至少两个CI代理的空闲计算资源权值。
S307:CI主控根据所述空闲计算资源权值确定目的CI代理;
具体的,CI主控判断该空闲资源权值是否大于或等于可执行子任务的子任务权值,如果是,则该CI代理为可选目的CI代理,CI主控从可选目的代理中确定目的CI代理。优选的,CI主控可通过在可选CI代理中随机选择一个CI代理作为目的CI代理;也可以为了更好的完成可执行子任务,选择可选CI代理中空闲资源权值最大的CI代理作为目的CI代理。
S308:CI主控将其当前可执行的CI子任务发送给根据所述空闲计算资源权值确定的目的CI代理执行;
S309:目的CI代理接收该可执行子任务执行,并将执行结果返回CI主控。
本实施例通过CI主控向CI管理机发送空闲计算资源权值的获取请求;CI管理机响应该获取请求,将所述空闲计算资源权值发送给所述CI主控,由CI主控直接下发可执行任务至目的CI代理,减少了CI管理机的负荷,进一步提高了可执行任务的执行效率。
实施例4
如图5所示,本发明实施例还提供了一种CI管理机,包括:
可执行子任务接收模块401,用于接收并管理CI主控发送的CI子任务;
目的CI代理确定模块402,用于根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行当前管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理,使所述目的CI代理执行所述可执行子任务,所述至少两个CI代理为通用计算单元。
如图6所示,在一种实现方式下,本发明实施例提供的CI管理机中,目的CI代理确定模块402可以包括:
计算资源闲置状态获取单元4021,用于在当前管理的CI代理资源池中的CI代理均处于在线通信状态时,根据该至少两个CI代理返回的空闲状态查询响应,获取至少两个CI代理的计算资源闲置状态;
第一目的CI代理确定单元4022,用于根据该至少两个CI代理的计算资源闲置状态生成该至少两个CI代理的空闲计算资源权值,如果当前CI代理的空闲计算资源权值大于或等于该可执行子任务的子任务权值,则该当前CI代理为目的CI代理。
以及,如图6所示,本发明实施例的CI管理机还可以包括:
空闲计算资源权值获取请求接收模块403,用于接收该CI主控发送的该空闲计算资源权值的获取请求;
空闲计算资源权值获取请求响应模块404,用于响应该获取请求,将对应的空闲计算资源权值发送给该CI主控,使该CI主控将其当前可执行的CI子任务发送给根据该空闲计算资源权值确定的目的CI代理执行。
以及,如图6所示,本发明实施例的CI管理机还可以包括:
注册请求接收模块405,用于接收CI主控和CI代理发送的注册请求;
CI代理类型获取模块406,用于根据至少两个CI主控发送的注册请求,获取至少两个CI主控间的子任务依赖关系和所述至少两个CI主控指定的CI代理类型;
CI代理资源组管理模块407,用于根据至少两个CI代理发送的注册请求,获取该CI代理的类型,将至少两个CI代理按其类型组织成不同的CI代理资源组。
以及,如图6所示,本发明实施例的CI管理机还可以包括:
执行结果接收模块408,用于接收该目的CI代理发送的该可执行子任务的执行结果;
执行结果记录模块409,用于根据该至少两个CI主控间的子任务依赖关系,判断是否有其他CI主控的子任务的执行依赖该执行结果,如果有,则记录该执行结果;
执行结果获取请求响应模块410,用于响应该其他CI主控发送的获取该执行结果的请求,使该其他CI主控根据所述执行结果确定并发送其当前可执行的CI子任务。
以及,如图6所示,本发明实施例的CI管理机还可以包括:
通信状态检测模块411,用于向CI主控和CI代理发送心跳握手消息,以检测CI主控和CI代理的通信状态;
可执行子任务重发模块412,用于当检测到该目的CI代理通信状态异常,将该目的CI代理未完成的可执行子任务重新发送给待执行该可执行子任务的目的CI代理。
如图7所示,在另一种实现方式下,本发明实施例提供的CI管理机中,目的CI代理确定模块402可以包括:
目的CI代理资源组确定单元4023,用于根据该CI主控指定的CI代理类型,确定目的CI代理资源组;
第二目的CI代理确定单元4024,用于在该目的CI代理资源组中,根据该目的CI代理资源组中的CI代理的在线通信状态、所述CI代理的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理。
具体的,如果该目的CI代理资源组中的CI代理均处于在线通信状态时,根据该CI代理返回的空闲状态查询响应,获取CI代理的计算资源闲置状态,根据该CI代理的计算资源闲置状态生成该CI代理的空闲计算资源权值,如果当前CI代理的空闲计算资源权值大于或等于该可执行子任务的子任务权值,则该当前CI代理为目的CI代理。
CI代理的计算资源由该CI代理运行时各方面的参数决定,本实施例中主要选取较重要的几项,包括:CPU资源和内存资源,则CI代理的计算资源的闲置状态可以用该CI代理当前可用的CUP资源及其可用的内存资源来表征。
优选的,为了方便在系统运行过程中针对不同的应用对各个参数的比例进行适当调整,CI管理机为各参数设定不同的常量系数,用来表示各个参数的重要程度,则CI代理的空闲计算资源权值可以通过公式描述为:
CI代理权值=R1*free_cpu+R2*free_memory
其中,free_cpu表示CI代理当前可用的CUP资源,R1为CUP资源常量系数,free_memory表示CI代理当前可用的内存资源,R2为内存资源常量系数。
本实施例通过根据可执行子任务的子任务权值和CI代理空闲资源权值为其确定目的CI代理,实现CI代理间的负载分担,提高CI代理的利用率,提高了持续集成的效率;通过CI管理机同时接受所有CI子任务,并将CI子任务发送给CI代理,进而实现了CI主控间对CI代理的并发控制;并且由于CI代理为通用的计算单元,使有利于实现任务的增减,无需修改CI主控和CI代理,进而增强了系统可扩展性。通过CI主控向CI管理机发送空闲计算资源权值的获取请求;CI管理机响应该获取请求,将所述空闲计算资源权值发送给所述CI主控,由CI主控直接下发可执行任务至目的CI代理,减少了CI管理机的负荷,进一步提高了可执行任务的执行效率。
实施例5
如图8所示,本发明实施例还提供了一种软件持续集成的系统,该系统包括:至少两个CI主控501、CI管理机502、至少两个CI代理503,所述至少两个CI代理为通用计算单元;
该CI主控501用于接收用户下发的CI任务,将所述CI任务分解成至少两项CI子任务,向所述CI管理机发送当前可执行的CI子任务;
该CI管理机502,用于接收并管理所述CI主控501发送的CI子任务;根据当前管理的CI代理资源池中至少两个CI代理503的在线通信状态、所述至少两个CI代理503的计算资源闲置状态,确定执行自身管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理;
具体的,在当前管理的CI代理资源池中的CI代理503均处于在线通信状态时,CI管理机502根据所述至少两个CI代理503返回的空闲状态查询响应,获取至少两个CI代理503的计算资源闲置状态;CI管理机502根据所述至少两个CI代理503的计算资源闲置状态生成所述至少两个CI代理503的空闲计算资源权值,如果当前CI代理503的空闲计算资源权值大于或等于所述可执行子任务的子任务权值,则所述当前CI代理503为目的CI代理。
该CI代理为CI管理机502确定的目的CI代理时,用于接收并执行CI管理机502发送的可执行子任务。
所述CI主控501,还用于向所述CI管理机502发送注册请求;
所述CI代理503,还用于向所述CI管理机502发送注册请求;
所述CI管理机502,还用于接收所述CI主控501发送的注册请求,根据至少两个CI主控501发送的注册请求,获取至少两个CI主控501间的子任务依赖关系和至少两个CI主控501指定的CI代理类型;接收所述CI代理503发送的注册请求,根据至少两个CI代理503发送的注册请求,获取所述至少两个CI代理503的类型,将至少两个CI代理503按其类型组织成不同的CI代理资源组。
CI主控501,还用于向CI管理机502发送的所述空闲计算资源权值的获取请求;
CI管理机502还用于,响应所述获取请求,将所述空闲计算资源权值发送给所述CI主控501,使所述CI主控501将其当前可执行的CI子任务发送给根据所述空闲计算资源权值确定的目的CI代理执行。
该CI代理503为CI管理机502确定的目的CI代理时,还用于向CI主控501发送该可执行任务的执行结果;
CI管理机502还用于,接收所述目的CI代理发送的所述可执行子任务的执行结果;根据所述至少两个CI主控501间的子任务依赖关系,判断是否有其他CI主控501的子任务的执行依赖所述执行结果,如果有,则记录所述执行结果;
CI主控501,还用于向CI管理机502发送执行结果获取请求;
CI管理机502,还用于响应所述其他CI主控501发送的获取所述执行结果的请求,使所述其他CI主控501根据所述执行结果确定并发送当前可执行的CI子任务。
CI管理机502,还用于根据所述CI主控501指定的CI代理类型,确定目的CI代理资源组;
在所述目的CI代理资源组中,根据所述目的CI代理资源组中的CI代理503的在线通信状态、CI代理503的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理。
CI管理机502,用于向CI主控501和CI代理503发送心跳握手消息,以检测CI主控501和CI代理的在线通信状态;当检测到所述目的CI代理通信状态异常,将所述目的CI代理未完成的可执行子任务重新发送给待执行所述可执行子任务的目的CI代理。
在不同实现方式下,所述CI主控、CI管理机、CI代理分别部署于不同的计算节点,或者组合部署于同一计算节点。换言之,本发明实施例的软件持续集成的系统,既可以配置为不同角色部署在不同环境中,也可以统一部署在同一个环境中。
可见,本实施例通过根据可执行子任务的子任务权值和CI代理空闲资源权值为其确定目的CI代理,本实施例通过根据该可执行子任务和CI代理资源确定执行该可执行子任务的目的CI代理,实现CI代理间的负载分担,提高CI代理的利用率,提高了持续集成的效率;通过CI管理机同时接受所有CI子任务,并将CI子任务发送给CI代理,进而实现了CI主控间对CI代理的并发控制。
进一步的,本发明实施例中,通过心跳注册通信机制和并发任务控制管理,达到CI主控和CI Agent都可以动态增删而不影响整个系统的可用性。
本实施例提供的装置、系统,具体可以,与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (16)
1.一种软件持续集成的方法,其特征在于,所述方法包括:
接收并管理CI主控发送的CI子任务;
根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行当前管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理,使所述目的CI代理执行所述可执行子任务,所述至少两个CI代理为通用计算单元。
2.根据权利要求1所述方法,其特征在于,所述根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理,包括:
在当前管理的CI代理资源池中的至少两个CI代理均处于在线通信状态时,根据所述至少两个CI代理返回的空闲状态查询响应,获取至少两个CI代理的计算资源闲置状态;
根据所述至少两个CI代理的计算资源闲置状态生成所述至少两个CI代理的空闲计算资源权值,如果当前CI代理的空闲计算资源权值大于或等于所述可执行子任务的子任务权值,则所述当前CI代理为目的CI代理。
3.根据权利要求2所述方法,其特征在于,所述方法还包括:
接收所述CI主控发送的所述空闲计算资源权值的获取请求;
响应所述获取请求,将所述空闲计算资源权值发送给所述CI主控,使所述CI主控将其当前可执行的CI子任务发送给根据所述空闲计算资源权值确定的目的CI代理执行。
4.根据权利要求1所述方法,其特征在于,所述接收CI主控发送的可执行子任务之前,所述方法还包括:
接收CI主控和CI代理发送的注册请求;
根据至少两个CI主控发送的注册请求,获取所述至少两个CI主控间的子任务依赖关系和所述至少两个CI主控指定的CI代理类型;
根据至少两个CI代理发送的注册请求,获取所述至少两个CI代理的类型,将所述至少两个CI代理按其类型组织成不同的CI代理资源组。
5.根据权利要求4所述方法,其特征在于,所述根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行当前管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述可执行子任务发送至所述目的CI代理,使所述目的CI代理执行所述可执行子任务,所述CI代理为通用计算单元之后,所述方法还包括:
接收所述目的CI代理发送的所述可执行子任务的执行结果;
根据所述至少两个CI主控间的子任务依赖关系,判断是否有其他CI主控的子任务的执行依赖所述执行结果,如果有,则记录所述执行结果;
响应所述其他CI主控发送的获取所述执行结果的请求,使所述其他CI主控根据所述执行结果确定并发送当前可执行的CI子任务。
6.根据权利要求4所述方法,其特征在于,所述接收CI主控发送的可执行子任务之后,所述方法还包括;
根据所述CI主控指定的CI代理类型,确定目的CI代理资源组;
所述根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理,包括:
在所述目的CI代理资源组中,根据所述目的CI代理资源组中的CI代理的在线通信状态、所述CI代理的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理。
7.根据权利要求1所述方法,其特征在于,所述方法还包括:
向CI主控和CI代理发送心跳握手消息,以检测所述CI主控和所述CI代理的通信状态;当检测到所述目的CI代理通信状态异常,将所述目的CI代理未完成的可执行子任务重新发送给待执行所述可执行子任务的目的CI代理。
8.一种CI管理机,其特征在于,所述CI管理机包括:
可执行子任务接收模块,用于接收并管理CI主控发送的CI子任务;
目的CI代理确定模块,用于根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行当前管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述可执行子任务发送至所述目的CI代理,使所述目的CI代理执行所述可执行子任务,所述至少两个CI代理为通用计算单元。
9.根据权利要求8所述CI管理机,其特征在于,所述目的CI代理确定模块包括:
计算资源闲置状态获取单元,用于在当前管理的CI代理资源池中的至少两个CI代理均处于在线通信状态时,根据所述至少两个CI代理返回的空闲状态查询响应,获取至少两个CI代理的计算资源闲置状态;
第一目的CI代理确定单元,用于根据所述至少两个CI代理的计算资源闲置状态生成所述至少两个CI代理的空闲计算资源权值,如果当前CI代理的空闲计算资源权值大于或等于所述可执行子任务的子任务权值,则所述当前CI代理为目的CI代理。
10.根据权利要求9所述CI管理机,其特征在于,所述CI管理机还包括:
空闲计算资源权值获取请求接收模块,用于接收所述CI主控发送的所述空闲计算资源权值的获取请求;
空闲计算资源权值获取请求响应模块,用于响应所述获取请求,将所述空闲计算资源权值发送给所述CI主控,使所述CI主控将其当前可执行的CI子任务发送给根据所述空闲计算资源权值确定的目的CI代理执行。
11.根据权利要求8所述CI管理机,其特征在于,所述CI管理机还包括:
注册请求接收模块,用于接收CI主控和CI代理发送的注册请求;
CI代理类型获取模块,用于根据至少两个CI主控发送的注册请求,获取所述至少两个CI主控间的子任务依赖关系和所述至少两个CI主控指定的CI代理类型;
CI代理资源组管理模块,用于根据至少两个CI代理发送的注册请求,获取所述至少两个CI代理的类型,将所述至少两个CI代理按其类型组织成不同的CI代理资源组。
12.根据权利要求11所述CI管理机,其特征在于,所述CI管理机还包括:
执行结果接收模块,用于接收所述目的CI代理发送的所述可执行子任务的执行结果;
执行结果记录模块,用于根据所述至少两个CI主控间的子任务依赖关系,判断是否有其他CI主控的子任务的执行依赖所述执行结果,如果有,则记录所述执行结果;
执行结果获取请求响应模块,用于响应所述其他CI主控发送的获取所述执行结果的请求,使所述其他CI主控根据所述执行结果确定并发送当前可执行的CI子任务。
13.根据权利要求11所述CI管理机,其特征在于,所述目的CI代理确定模块包括:
目的CI代理资源组确定单元,用于根据所述CI主控指定的CI代理类型,确定目的CI代理资源组;
第二目的CI代理确定单元,用于在所述目的CI代理资源组中,根据所述目的CI代理资源组中的CI代理的在线通信状态、所述CI代理的计算资源闲置状态,确定执行所述可执行子任务的目的CI代理。
14.根据权利要求8所述CI管理机,其特征在于,所述CI管理机还包括:
通信状态检测模块,用于向CI主控和CI代理发送心跳握手消息,以检测所述CI主控和所述CI代理的通信状态;
可执行子任务重发模块,用于当检测到所述目的CI代理通信状态异常,将所述目的CI代理未完成的可执行子任务重新发送给待执行所述可执行子任务的目的CI代理。
15.一种软件持续集成的系统,其特征在于,所述系统包括:至少两个CI主控、CI管理机、至少两个CI代理,所述至少两个CI代理为通用计算单元;
所述CI主控用于接收用户下发的CI任务,将所述CI任务分解成至少两项CI子任务,向所述CI管理机发送当前可执行的CI子任务;
所述CI管理机用于接收并管理所述CI主控发送的CI子任务;根据当前管理的CI代理资源池中至少两个CI代理的在线通信状态、所述至少两个CI代理的计算资源闲置状态,确定执行自身管理的至少一个CI子任务中的当前可执行子任务的目的CI代理,并将所述当前可执行子任务发送至所述目的CI代理;
所述CI代理为所述CI管理机确定的目的CI代理时,用于接收并执行所述CI管理机发送的当前可执行子任务。
16.根据权利要求13所述的系统,其特征在于,所述系统还包括:
所述CI主控,还用于向所述CI管理机发送注册请求;
所述CI代理,还用于向所述CI管理机发送注册请求;
所述CI管理机,还用于接收所述CI主控发送的注册请求,根据至少两个CI主控发送的注册请求,获取所述至少两个CI主控间的子任务依赖关系和所述至少两个CI主控指定的CI代理类型;接收所述CI代理发送的注册请求,根据至少两个CI代理发送的注册请求,获取所述至少两个CI代理的类型,将所述至少两个CI代理按其类型组织成不同的CI代理资源组。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010102904801A CN101957778B (zh) | 2010-09-19 | 2010-09-19 | 软件持续集成的方法、装置和系统 |
PCT/CN2011/075091 WO2011144132A1 (zh) | 2010-09-19 | 2011-06-01 | 软件持续集成的方法、装置和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010102904801A CN101957778B (zh) | 2010-09-19 | 2010-09-19 | 软件持续集成的方法、装置和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101957778A true CN101957778A (zh) | 2011-01-26 |
CN101957778B CN101957778B (zh) | 2012-11-21 |
Family
ID=43485118
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010102904801A Expired - Fee Related CN101957778B (zh) | 2010-09-19 | 2010-09-19 | 软件持续集成的方法、装置和系统 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN101957778B (zh) |
WO (1) | WO2011144132A1 (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2011144132A1 (zh) * | 2010-09-19 | 2011-11-24 | 华为技术有限公司 | 软件持续集成的方法、装置和系统 |
CN103577907A (zh) * | 2012-07-24 | 2014-02-12 | 阿里巴巴集团控股有限公司 | 一种持续集成测试方法和系统 |
CN104778032A (zh) * | 2014-01-09 | 2015-07-15 | 阿尔卡特朗讯 | 一种用于进行持续集成的方法和设备 |
CN108388988A (zh) * | 2018-02-26 | 2018-08-10 | 深圳智乾区块链科技有限公司 | 基于区块链的协同办公方法、系统及计算机可读存储介质 |
CN109032769A (zh) * | 2017-06-08 | 2018-12-18 | 中国移动通信集团浙江有限公司 | 一种基于容器的持续集成ci任务处理方法及装置 |
CN109240810A (zh) * | 2018-08-03 | 2019-01-18 | 腾讯科技(深圳)有限公司 | 任务处理方法、装置及存储介质 |
CN110018951A (zh) * | 2018-01-10 | 2019-07-16 | 武汉斗鱼网络科技有限公司 | 一种js代码的测试方法、存储介质、设备和系统 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104298588B (zh) * | 2013-07-16 | 2017-09-08 | 阿里巴巴集团控股有限公司 | 一种持续集成的实现方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101359295A (zh) * | 2007-08-01 | 2009-02-04 | 阿里巴巴集团控股有限公司 | 一种批量任务调度分配方法及系统 |
CN101515232A (zh) * | 2008-02-21 | 2009-08-26 | 卓望数码技术(深圳)有限公司 | 一种软件持续集成系统及方法 |
US20100114830A1 (en) * | 2008-11-06 | 2010-05-06 | Amadeus S.A.S | Method of integrating in real time large volumes of updates in a database |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100499907C (zh) * | 2003-11-28 | 2009-06-10 | 中兴通讯股份有限公司 | 第三代移动通信用户接纳控制系统及处理方法 |
CN101957778B (zh) * | 2010-09-19 | 2012-11-21 | 华为技术有限公司 | 软件持续集成的方法、装置和系统 |
-
2010
- 2010-09-19 CN CN2010102904801A patent/CN101957778B/zh not_active Expired - Fee Related
-
2011
- 2011-06-01 WO PCT/CN2011/075091 patent/WO2011144132A1/zh active Application Filing
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101359295A (zh) * | 2007-08-01 | 2009-02-04 | 阿里巴巴集团控股有限公司 | 一种批量任务调度分配方法及系统 |
CN101515232A (zh) * | 2008-02-21 | 2009-08-26 | 卓望数码技术(深圳)有限公司 | 一种软件持续集成系统及方法 |
US20100114830A1 (en) * | 2008-11-06 | 2010-05-06 | Amadeus S.A.S | Method of integrating in real time large volumes of updates in a database |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2011144132A1 (zh) * | 2010-09-19 | 2011-11-24 | 华为技术有限公司 | 软件持续集成的方法、装置和系统 |
CN103577907A (zh) * | 2012-07-24 | 2014-02-12 | 阿里巴巴集团控股有限公司 | 一种持续集成测试方法和系统 |
CN103577907B (zh) * | 2012-07-24 | 2016-12-07 | 阿里巴巴集团控股有限公司 | 一种持续集成测试方法和系统 |
CN104778032A (zh) * | 2014-01-09 | 2015-07-15 | 阿尔卡特朗讯 | 一种用于进行持续集成的方法和设备 |
CN109032769A (zh) * | 2017-06-08 | 2018-12-18 | 中国移动通信集团浙江有限公司 | 一种基于容器的持续集成ci任务处理方法及装置 |
CN109032769B (zh) * | 2017-06-08 | 2020-09-11 | 中国移动通信集团浙江有限公司 | 一种基于容器的持续集成ci任务处理方法及装置 |
CN110018951A (zh) * | 2018-01-10 | 2019-07-16 | 武汉斗鱼网络科技有限公司 | 一种js代码的测试方法、存储介质、设备和系统 |
CN108388988A (zh) * | 2018-02-26 | 2018-08-10 | 深圳智乾区块链科技有限公司 | 基于区块链的协同办公方法、系统及计算机可读存储介质 |
CN108388988B (zh) * | 2018-02-26 | 2021-07-06 | 深圳智乾区块链科技有限公司 | 基于区块链的协同办公方法、系统及计算机可读存储介质 |
CN109240810A (zh) * | 2018-08-03 | 2019-01-18 | 腾讯科技(深圳)有限公司 | 任务处理方法、装置及存储介质 |
CN109240810B (zh) * | 2018-08-03 | 2021-02-23 | 腾讯科技(深圳)有限公司 | 任务处理方法、装置及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN101957778B (zh) | 2012-11-21 |
WO2011144132A1 (zh) | 2011-11-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101957778B (zh) | 软件持续集成的方法、装置和系统 | |
US7287179B2 (en) | Autonomic failover of grid-based services | |
US8051170B2 (en) | Distributed computing based on multiple nodes with determined capacity selectively joining resource groups having resource requirements | |
US8055933B2 (en) | Dynamic updating of failover policies for increased application availability | |
CN108205541B (zh) | 分布式网络爬虫任务的调度方法及装置 | |
CN101449263B (zh) | 用于实例化网络上的服务的以计算机实现的方法和装备 | |
US20080195755A1 (en) | Method and apparatus for load balancing with server state change awareness | |
US20070180453A1 (en) | On demand application scheduling in a heterogeneous workload environment | |
JP2015011716A (ja) | グリッドコンピューティングシステムの遊休リソースによるタスク実行 | |
CN103593242A (zh) | 基于Yarn框架的资源共享控制系统 | |
CN108900626B (zh) | 一种云环境下数据存储方法、装置及系统 | |
CN111240806B (zh) | 一种分布式容器镜像构建调度方法 | |
US11354152B2 (en) | Self-evolving microservices | |
Li et al. | Amoeba: Qos-awareness and reduced resource usage of microservices with serverless computing | |
CN111343262B (zh) | 分布式集群登录方法、装置、设备和存储介质 | |
CN102063330A (zh) | 一种大规模并行程序性能数据采集方法 | |
CN106796537B (zh) | 计算集群中的分布式组件 | |
US8832215B2 (en) | Load-balancing in replication engine of directory server | |
CN106095483A (zh) | 服务的自动化部署方法及装置 | |
CN112148430A (zh) | 一种虚拟网络功能的虚拟机在线安全迁移的方法 | |
CN111290712B (zh) | 块设备创建方法、装置、云计算管理系统及存储介质 | |
CN1584850A (zh) | 被动式远程判断系统状态的方法 | |
CN114020218B (zh) | 混合重复数据删除调度方法及系统 | |
CN112711606A (zh) | 数据库访问方法、装置、计算机设备和存储介质 | |
CN103034570B (zh) | 基于故障转移的应用资源获取 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20121121 Termination date: 20130919 |