CN113568755B - 一种分布式编译系统及分布式编译方法 - Google Patents
一种分布式编译系统及分布式编译方法 Download PDFInfo
- Publication number
- CN113568755B CN113568755B CN202110894307.0A CN202110894307A CN113568755B CN 113568755 B CN113568755 B CN 113568755B CN 202110894307 A CN202110894307 A CN 202110894307A CN 113568755 B CN113568755 B CN 113568755B
- Authority
- CN
- China
- Prior art keywords
- compiling
- server
- environment
- sub
- environment construction
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 70
- 238000010276 construction Methods 0.000 claims abstract description 143
- 230000000977 initiatory effect Effects 0.000 claims description 10
- 238000004891 communication Methods 0.000 claims description 6
- 238000007781 pre-processing Methods 0.000 claims description 4
- 230000008569 process Effects 0.000 description 26
- 230000006870 function Effects 0.000 description 7
- 238000012986 modification Methods 0.000 description 5
- 230000004048 modification Effects 0.000 description 5
- 238000012795 verification Methods 0.000 description 4
- 241001362551 Samba Species 0.000 description 3
- 238000013507 mapping Methods 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 238000012544 monitoring process Methods 0.000 description 3
- 238000012545 processing Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- 241000157302 Bison bison athabascae Species 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000007613 environmental effect Effects 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 238000009434 installation Methods 0.000 description 1
- 230000004807 localization Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000013518 transcription Methods 0.000 description 1
- 230000035897 transcription Effects 0.000 description 1
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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种分布式编译系统及分布式编译方法,其包括:主控单元,用以获取编译信息,生成编译配置文件,并建立编译任务;主服务器,预处理主控单元推送的编译任务,解析编译配置文件,以创建编译任务线程;获取当前编译任务所需参与编译的模块,以生成单元编译任务;根据第一法则对单元编译任务进行分配及调度;子服务器,其获取主服务器分配的单元编译任务,经解析后获取编译信息,据此取得单元编译任务之源码,并向环境构建单元发起环境构建请求,获取环境构建脚本,以执行环境构建并完成编译;环境构建单元,其接收子服务器发送的环境构建请求,经解析后输出环境配置信息,以生成环境构建脚本,并发送给子服务器,籍此实现分布式编译。
Description
技术领域
本发明涉及及编译技术领域,尤其涉及一种分布式编译系统及分布式编译方法。
背景技术
传统Android源码工程的编译方案包括,以单个编服务器执行一个编译任务,依次进行编译、或使用现有的distcc来搭建分布式编译环境。然而由于Android源码的编译过程中同时存在Java的编译和C类语言的编译,而distcc又仅支持C类语言的分布式编译,因此Android的分布式编译获得的效果,不如普通纯C类语言项目明显。
然而随着任务数目的增加,仅能在本机处理的Java编译过程,反而由于机器硬件性能的限制,而拖慢了整体的编译速度,甚至抵消了由distcc分布式编译获取的益处。因此本领域亟待一种技术来解决上述现有技术的缺陷。
为此发明人为了解决上述现有技术的缺陷,考虑通过建立编译环境构建单元,以向所有子服务器提供Android源码编译环境,并通过建立单元编译任务的方式,构建分布式计算。使得任何一台被分配单元编译任务的子服务器,都可在得到源码编译环境后,构建出一个与主服务器相同的编译环境,以此来实现Android源码中对Java模块代码的分布式编译工作,使其不受编译服务器编译环境的限制,可向任何一台子服务器分配Android Java模块编译任务。
发明内容
本发明的主要目的在于提供一种分布式编译系统及分布式编译方法,以解决背景技术中现有技术的至少部分缺陷。
为了实现上述目的,根据本发明的一个方面,提供了一种分布式编译系统,其包括:
主控单元,用以获取编译信息,生成编译配置文件,并建立编译任务;
主服务器,预处理主控单元推送的编译任务,解析编译配置文件,以创建编译任务线程;获取当前编译任务所需参与编译的模块,以生成单元编译任务;根据第一法则对单元编译任务进行分配及调度;
子服务器,其获取主服务器分配的单元编译任务,经解析后获取编译信息,据此取得单元编译任务之源码,并向环境构建单元发起环境构建请求,获取环境构建脚本,以执行环境构建并完成编译;
环境构建单元,其接收子服务器发送的环境构建请求,经解析后输出环境配置信息,以生成环境构建脚本,并发送给子服务器。
在可能的优选实施方式中,所述根据第一法则对单元编译任务进行分配及调度的步骤包括:利用远程SSH轮询多台子服务器,通过调用预置在各个子服务器上的python脚本,获取其工作状态和线程池内的任务量返回给主服务器,主服务器根据当前各个子服务器的任务承载量情况,将单元编译任务向各子服务器分配。
在可能的优选实施方式中,其中所述编译信息包括:平台信息、模块名、模块源码git仓库地址,其中子服务器根据模块源码git仓库地址进行源码的拉取,再根据平台信息,通过socket向环境构建单元发起环境构建请求。
在可能的优选实施方式中,所述子服务器环境构建步骤包括:
步骤E1,子服务器收到单元编译任务,通过socket向环境构建单元发起环境构建请求;
步骤E2,环境构建单元通过socket收到请求,解析请求获取环境配置信息,并找到对应的SDK/JDK信息;
步骤E3,根据步骤E2生成一个环境构建脚本,脚本内容为环境导入的相关指令,并通过SSH发送给子服务器;
步骤E4,通过SSH远程在子服务器上执行环境构建脚本。
在可能的优选实施方式中,所述环境构建脚本在子服务器上执行的步骤包括:在子服务器的临时目录下挂载环境构建单元上对应SDK目录,以映射环境构建单元上指定环境类型的文件目录到子服务器;通过导入子服务器上的临时目录,生成全局的环境变量。
在可能的优选实施方式中,所述环境构建单元包括:环境服务器,Jenkins服务器;其中环境服务器上安装有编译所需依赖工具集,在进行初步程序配置后,可将环境服务器关联到Jenkins服务器上,以完成自动化作业配置;Jenkins服务器触发SDK环境创建任务,以向环境服务器推送SDK脚本供其执行后创建SDK环境,使其可向子服务器提供SDK/JDK编译环境。
本发明第二个方面还提供了一种分布式编译方法,其步骤包括:
S1设置主控单元,以获取编译信息,生成编译配置文件,并建立编译任务;编译配置文件生成后,通过python脚本导入的paramiko模块,获取SSH操作的实例,采用connect方法传入参数IP地址、帐户、密码实现与主服务器建立SSH通讯;
S2设置主服务器,预处理主控单元推送的编译任务,解析编译配置文件,以创建编译任务线程;获取当前编译任务所需参与编译的模块,以生成单元编译任务;根据第一法则对单元编译任务进行分配及调度;
S3设置子服务器,以获取主服务器分配的单元编译任务,经解析后获取编译信息,据此取得单元编译任务之源码,并向环境构建单元发起环境构建请求,获取环境构建脚本,以执行环境构建并完成编译;
S4设置环境构建单元,以接收子服务器发送的环境构建请求,经解析后输出环境配置信息,以生成环境构建脚本,并发送给子服务器;
其中所述环境构建步骤包括:E1子服务器收到单元编译任务,通过socket向环境构建单元发起环境构建请求;E2环境构建单元通过socket收到请求,解析请求获取环境配置信息,并找到对应的SDK/JDK信息;根据步骤E2生成环境构建脚本,脚本内容为环境导入的相关指令,并通过SSH发送给子服务器;通过SSH远程在子服务器上执行环境构建脚本。
在可能的优选实施方式中,所述根据第一法则对单元编译任务进行分配及调度的步骤包括:利用远程SSH轮询多台子服务器,通过调用预置在各个子服务器上的python脚本,获取其工作状态和线程池内的任务量返回给主服务器,主服务器根据当前各个子服务器的任务承载量情况,将单元编译任务向各子服务器分配。
在可能的优选实施方式中,所述编译信息包括:平台信息、模块名、模块源码git仓库地址,其中子服务器根据模块源码git仓库地址进行源码的拉取,再根据平台信息,通过socket向环境构建单元发起环境构建请求。
在可能的优选实施方式中,所述环境构建脚本在子服务器上执行的步骤包括:在子服务器的临时目录下挂载环境构建单元上对应SDK目录,以映射环境构建单元上指定环境类型的文件目录到子服务器;通过导入子服务器上的临时目录,生成全局的环境变量。
本发明提供的该分布式编译系统及分布式编译方法,通过建立编译环境构建单元,以向所有子服务器提供Android源码编译环境,并通过建立单元编译任务的方式,构建分布式计算。使得任何一台被分配单元编译任务的子服务器,都可在得到源码编译环境后,构建出一个与主服务器相同的编译环境,以此来实现Android源码中对Java模块代码的分布式编译工作,使其不受编译服务器编译环境的限制,可向任何一台子服务器分配AndroidJava模块编译任务。
附图说明
构成本申请的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为本发明第一实施例的分布式编译系统结构示意图;
图2为本发明第一实施例的主控单元的项目编译信息采集界面示意图;
图3为本发明第一实施例的主服务器分配编译任务的流程示意图;
图4为本发明第一实施例的子服务器执行分配的单元编译任务的流程示意图;
图5为本发明第一实施例的主服务器解析编译任务所涉项目中所有需要参与编译的模块,以形成单元编译任务的流程示意图;
图6为本发明第一实施例的环境构建单元为子服务器构建环境的流程示意图;
图7为本发明第一实施例的基于环境构建单元创建SDK环境的流程示意图。
图中T为task任务含义。
具体实施方式
下面对本发明的具体实施方式进行详细地说明。以下示例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进。这些都属于本发明的保护范围。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本领域的技术人员更好的理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,在本领域普通技术人员没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明的保护范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。
(一)
如图1至图5所示,本发明第一个方面提供的该分布式编译系统,在优选实施方式下,其包括:
-主控单元
如图2所示,其可以是一个搜集信息的客户端形态,以获取编译项目信息,来生成编译配置文件,并建立编译任务。
具体来说,所述编译项目信息包括:该主控单元可通过UI界面收集所需编译项目的基本信息、主服务器相关信息、版本归档服务器信息、版本发布邮件信息等。其中本实施例下,示例该:
项目基本信息包括:项目名、版本性质、源码clone地址、平台、编译方式;
主服务器信息包括:公共版本编译服务器IP地址、帐户名和密码等;
版本归档服务器信息包括:版本归档地址、帐户名和密码等;
版本发布信息包括:收件人、抄送、发送内容(版本修改点)等;
通过以上收集的编译项目信息,主控单元首先会通过python脚本,把所有编译项目信息整理成一个以节点和键值对形式构成的ini编译配置文件。
编译配置文件生成后,通过python脚本导入的paramiko模块,paramiko.SSHClient()获取SSH操作的实例,connect方法传入参数IP地址、帐户、密码实现与主服务器建立SSH通讯。通过实例中的put方法传入相对应的配置文件所在路径、主服务器目标路径如:(/home/server138/work/build_list/),向主服务器推送此配置文件,一个编译配置文件可以理解为一个编译任务。
-主服务器
主服务器通过监听build_list方式,预处理主控单元推送的编译任务,解析各编译配置文件,以创建编译任务线程;获取当前编译任务所需参与编译的模块,以生成单元编译任,并根据第一法则对单元编译任务进行分配及调度。
其中在示例中,该监听方案包括:使用watchdog.observers导入Observer创建监听服务实例,再使用watchdog.events在Observer服务中schedule创建各类监听,最后调用observer.start()监听启动,监听内容包含文件的一些常规操作增删改查如:on_moved、on_created、on_deleted、on_modified。当客户端有版本编译配置文件推入时,会在on_created触发回调,此时调用主服务器上的编译innovatech_build_system.py中的refresh_build_list()方法,该方法会遍历/home/server138/work/build_list/目录下所有ini编译配置文件,并创建到编译队列中去。如果当前编译队列中无编译任务,那么当前客户端推送过来编译任务会被第一时间执行编译。
其中该预处理主控单元推送的编译任务的过程包括:
步骤A1,通过innovatech_build_system.py中的get_build_list()方法,获取需要编译任务的列队,从列队中获取编译配置文件(编译原则按先进先出执行),调用get_project_info解析编译配置ini文件,通过导入threading模块获取Thread实例调用start()创建一个编译任务的线程,根据编译配置文件中的代码地址和平台信息,复制针对此项目的android源码。
步骤A2,android源码下载完成,根据ini中获取到的项目名、版本性质等,innovatech_build_system.py中调generate_build_scrips.py脚本中的ProductsBuildEnv函数调GetProductEnv方法读取源码中对应项目的配置的参数,再调用GenerateScpipt在源码根目录生成指令脚本,该指令脚本,封装了google原生编译所需要执行的指令,source build/envsetup.sh、lunch(选择板级项目)、kheader。
步骤A3,如图5所示,获取当前编译任务所涉项目中所有需要参与编译的模块,通过调用执行android源码中的build/tools/findleaves.py脚本(如:build/tools/findleaves.py--prune=out/--prune=.repo--prune=.git/home/server138/works/AndroidQ_ITEL/Android.mk),获取所有需要参与编译的模块的路径,并保存到compare_fileslist,此文件用于后续向子服务器分配单元编译任务。
之后获取的所有参与编译的模块路径,innovatech_build_system.py中会调用build_item_module()根据compare_fileslist列表对每个路径下的模块进行解析,并生成ITEM_JOB.config。
解析过程主要是读取模块对应的Android.mk中的相关信息,包括:模块名、模块源码单仓的git地址、模块JDK版本、模块编译生成out对应目录位置、模块中库生成out对应目录位置、编译状态等。
一个ITEM_JOB对应一个模块即一个单元编译任务,同时也支持多个模块添加到一个ITEM_JOB中去,即:多个模块,组合成一个lTEM_JOB。
通过Dependency函数中的write_config_script()方法将解析后的信息写入指定ITEM_JOB.config文件中,并随机生成一个模块lD,生成的每个ITEM_JOB会被存放到源码根目录下schedules目录中。用于接下来的调度和分配。
其中根据第一法则对单元编译任务进行分配及调度过程包括:
利用远程SSH轮询多台子服务器,通过调用预置在各个子服务器上的python脚本,获取其工作状态和线程池内的任务量返回给主服务器,主服务器再根据当前各个子服务器的任务量情况,分配编译任务,再将其拆分成多个单元编译任务分配给多台子服务器建立不同任务的线程池,由此完成整个分布式编译任务。
具体来说,参考图3所示,该第一法则包括:采用innovatech_build_system.py中的check_all_server_status()利用远程SSH轮询配置在server_config_list.ini中的所有子服务器,通过SSH远程调用预置在各个子服务器上的python脚本获取其工作状态和线程池内的任务量返回给主服务器,其中本实施例中该任务量,可依据获取子服务器/home/server2/work/build_list/目录下的ITEM_JOB数量来定义,如果被查询到的子服务器处于空闲或任务量未达到上限,则会被确认为可分配单元编译任务的服务器,获取所有可用服务器数量后。
经innovatech_build_system.py中的create_multi_processing()方法,创建任务调度的进程,并将所有的ITEM_JOB,通过task.put()添加到编译任务队列中,暴露给所有同一网段下的子服务器,这些进程就像是随时待命的士兵,准备着被子服务器拉取并执行任务。一个进程池中可以容纳多个待命的进程,每个子服务器可根据自己当前任务量和处理进度,从task中获取任务。通过task.empty()判断task池中是否为空,如果不为空,则task.get()获取编译任务。
此外本示例中,该任务分配调度优选使用python中的multiprocessing模块,该模块不但支持多进程,其中managers子模块还支持把多进程分布到多台子服务器上。一个服务进程可以作为调度者,将任务分布到其他多个子服务器的多个进程中,依靠managers子模块,可使主服务器与各个子服务器建立网络通信。
具体来说,其中主服务器的实现过程包括:
步骤B1,创建服务进程,建立队列Queue用于进程间的通信,主服务器服务进程创建任务队列task_queue,用来作为传递任务给任务进程的通道,主服务器服务进程创建结果队列result_queue,作为任务进程完成任务后回复主服务器进程的通道。在分布式多进程环境下,必须通过由Queuemanager获得Queue接口来添加任务。
步骤B2,把第一步中建立的队列在网络上注册,暴露给其它进程(子服务器),注册后获得网络队列,相当于本队队列的映像到网络当中。
步骤B3,通过Queuemanager实例获取manager对象,QueueManager.register注册相关的方法名称,绑定端口和验证口令。
步骤B4,调用实例manager.start()启动监管信息通道。
步骤B5,通过管理实例的方法获得通过网络访问的Queue对象,即再把网络队列实体化成可以使用的本地队列。
步骤B6,创建任务到″本地″队列中,自动上传任务到网络队列中,分配给子服务器任务进程进行处理。
其中子服务器的实现过程包括:
步骤C1,使用QueueManager注册用于获取Queue的方法名称,任务进程只能通过名称在网络上获取Queue。
步骤C2,连接服务器验证端口和验证口令与服务进程中完全一致。
步骤C3,网络上获取Queue,进行本地化。
步骤C4,Task队列获取任务,并把结果result队列,回传给主服务器。
-子服务器
子服务器获取主服务器分配的单元编译任务,经解析后获取编译信息,以向环境构建单元发起环境构建请求,获取shell环境构建脚本,并据此执行环境构建。
子服务器通过task.get()获取ITEM_JOB任务后,如图4所示:
步骤D1,解析XXXX-ITEM_JOB.confg,获取需要编译模块的相关编译信息。其中该编译信息包括:平台信息、模块名、模块源码git仓库地址等。其中根据获取源码git仓库地址进行源码的拉取,再根据平台信息,通过socket发起环境构建请求向环境构建单元发起环境构建请求,环境构建单元收到请求后,会根据请求的内容,生成构建脚本,推送给子服务器并远程通过SSH执行脚本,来实现对子服务器的环境进行构建。
步骤D2,子服务器请求client端通过c语言来实现,实现原理和环境构建单元server端类似,通过socket(AF_INET,SOCK_STREAM,0)创建socket连接实例,设置sockaddr_in结构体中相关参数,如:服务器端口号、AF_INET地址族、32位IPv4地址,该设置指向的是server端的IP地址和端口,调用connect函数主动发起对服务器端的连接,连接成功后,通过调用send()发送请求给服务器端。请求内容格式如:平台名称-环境类型-ENV_ID,例如:9832E_ANDROID_5.1-SDK-15。
步骤D3,环境构建单元server端通过recv()函数收取服务请求后,从请求内容中解析出需要构建环境的ID,得到ENV_ID后会通过fopen函数读取/home/work/ENVIRONMENT/env.config配置文件,查询ENV_ID与之相匹配的配置信息。再通过fopen函数生成一个shell环境构建脚本,该脚本通过SSH被推送到子服务器上,被执行后主要完成以下环境构建操作:
步骤D31,映射环境构建单元上指定环境类型的文件目录到子服务器/tmp/ANDROID_5.1_SPRD_9832E_SDK/目录下(指定环境目录根据ENV_ID在evn.config中查询到的配置中获取,如:
SDK_PATH=“/home/work/ENVIRONMENT/SDK_PATH/ANDROID_5.1_SPRD_9832E_SDK/”)。
步骤D32,通过mount映射完成后,再根据子服务器的/tmp/ANDROID_5.1_SPRD_9832E_SDK/目录下的文件,通过export导入ubuntu的全局环境变量。
ANDROID_SDK_HOME=/tmp/ANDROID_5.1_SPRD_9832E_SDK/
export PATH=$PATH:${ANDROID_SDK_HOME}/tools
export PATH=$PATH:$(ANDROID_SDK_HOME}/platform-tools
不同的环境类型,生成的环境导入方法也有所不同,如:JDK环境的导入
JAVA_HOME=/tmp/jdk1.6.0_45
export JAVA_HOME
ANDROID_JAVA_HOME=/tmp/jdk1.6.0_45
export ANDROID_JAVA_HOME
PATH=/tmp/jdk1.6.0_45/bin:$PWD/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/:$PATH
export PATH
-环境构建单元
如图6至图7所示,该环境构建单元接收子服务器发送的环境构建请求,经解析后输出环境配置信息,以生成环境构建脚本,并发送给子服务器。
在示例中,该环境构建过程包括:
步骤E1,子服务器收到单元编译任务,通过socket向环境构建单元发起环境构建请求。如:9832E_ANDROID_5.1-SDK-15。
步骤E2,环境构建单元通过socket收到请求,解析请求,知道环境是9832E平台,android 5.1版本,请求环境的类型为SDK,SDK环境使用的是env.config注册的ENV_ID为15。
步骤E3,环境构建单元解析/home/work/ENVIRONMENT/env.config,获取9832E_ANDROID_5.1的环境配置信息,并找到ENV_ID为15的SDK相关信息
步骤E4,根据步骤E3生成一个shell环境构建脚本,脚本内容为环境导入的相关指令。并通过SSH发送给子服务器。
步骤E5,通过SSH远程在子服务器上执行这个shell脚本。
其中执行环境构建脚本,首先会在子服务器的临时目录下/tmp挂载环境构建单元上对应SDK目录,如://192.168.1.138/SDK_PATH/ANDROID_5.1_SPRD_9832E_SDK/。此时子服务上的/tmp目录,映射了环境构建单元上的/home/work/ENVIRONMENT/SDK_PATH/ANDROID_5.1_SPRD_9832E_SDK/通过导入子服务器上的/tmp/目录,生成全局的环境变量。后续步骤如步骤D32的描述。至此子服务器的环境构建即可完成。
之后各子服务器,使用环境构建单元提供的SDK、JDK环境,来完成主服务器向其分配到的单元编译任务,其中本示例下,该编译工具使用的都是SDK、JDK提供,编译示例方法如下:
item_module_build.py脚本中封装了一系列的编译指令,示例如:
1)R文件生成通过SDK工具中的appt工具生成模块的资源ID文件
(R.java)
2)如果模块中带有aidl文件,通过SDK工具中的aidl将.aidl转成.java文件(如果没有aidl,则跳过这一步)
3)通过JDK工具中的javac编译.java类文件生成class文件;
4)通过SDK工具中的dx命令行脚本生成classes.dex文件;
5)通过SDK工具中的aapt工具生成资源包文件;
6)通过SDK工具中的apkbuilder生成未签名的apk安装文件;
7)通过SDK工具中的jarsigner对未签名的包进行apk签名。
最后将签名后的apk通过网络回传到主服务器android源码对应的out目录位置中去。至此完成对模块的单元编译任务,并使该任务从task中移除,再通过task.get()方法从网络获取新的任务。各个子服务器循环以上步骤,直至主服务器在Queue任务池内创建的所有任务执行完成。
在优选实施方式中,本发明的该分布式编译系统中,该环境构建单元包括:环境服务器,Jenkins服务器;其中所述环境服务器用于向子服务器提供SDK、JDK编译环境,而Jenkins服务器可用于对环境服务器提供的SDK实时更新,及配置自动化作业。
其中该环境服务器配置步骤包括:在环境服务器上安装编译所需依赖工具集,进行初步程序配置,并将环境服务器关联到Jenkins服务器上,以完成自动化作业配置;Jenkins服务器触发SDK环境创建任务,以向环境服务器推送SDK脚本供其执行后创建SDK环境;环境服务器下载对应版本JDK文件,创建JDK环境。
-自动化作业配置
具体来说,该环境服务器,通过ubuntu下执行apt-get install命令安装Android在ubuntu下编译所需依赖工具集,如:git bc bison build-essential curl flex g++-multilib gcc-multilib gnupg gperfimagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-devlibwxgtk3.0-dev libxml2libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc yasm zip zlib1g-dev python samba smbclient openSSH-server。
而该初步程序配置,优选包括:配置SSH,repo环境,git工具及samba工具,如示例中:
配置SSH,通过SSH生成公钥和密钥,用于免密拉取代码服务器上的代码,如果不配置密钥,需要用户手动输入密码。由于所有操作都是由脚本自动完成,没办法应答密码的动态输入。为了解决此问题,环境服务器和子服务器需要建立一种白名单的关系,而这种关系就需要密钥来建立。
配置repo环境,repo脚本由代码服务器提供,只需要将repo脚本放置到一个指定目录下,通过export导入到ubuntu全局环境变量即可,repo的是google提供的一个工具,其实就是一个python脚本,基于git的仓库管理工具。
配置git工具,主要配置git的用户帐户和用户邮件地址,通过git可以从代码服务器拉取代码。
配置samba工具,提供环境服务器环境相关文件的共享,可以将环境配置文件共享到网络,让同一网段内的子服务器能访问,可见子服务器映射环境服务器环境配置文件,基于此共享实现。
当完成上述初步程序配置过程后,将环境服务器关联到Jenkins服务器上,即可以实现Jenkins对环境服务器实现自动化作业。
-基于平台创建SDK环境
具体来说,该SDK环境基于平台创建,示例中可使用Jenkins web端触发指定平台SDK环境创建任务,以向环境服务器/home/env/work/目录推送创建SDK的脚本并执行,脚本执行完成后SDK创建。以下是具体实现示例:
1)Jenkins服务器对环境服务器远程推送并执行build.sh脚本后,
第一步:环境服务器上执行的build.sh脚本中封装的repo init-u、repo sync等命令,从内部代码服务器下载指定平台的Android源码到指定目录;
第二步:通过脚本内封装好的编译命令,对下载好后的源码进行SDK的编译:
第三步:编译完成后会在对应源码的out/host/linux-x86/目录下生成sdk目录,build.sh脚本会对sdk目录进行MD5生成验证码,为后续更新SDK版本做差异化校验用。
2)build.sh脚本会将编译好后的out/host/linux-x86/sdk目录,rsync到/home/work/ENVIRONMENT/SDK_PATH/
如:/home/work/ENVIRONMENT/SDK_PATH/ANDROID_5.1_SPRD_9832E_SDK/目录,此目录可用于发布和被子服务器映射,并将当前生成的SDK信息注册到/home/work/ENVIRONMENT/env.config文件中,追加信息内包含以下内容:
[9832E_ANDROID_5.1_SDK]
ENV_ID=“15”
SDK_VERSION=″v001_20200512″
SDK_PATH
=“/home/work/ENVIRONMENT/SDK_PATH/ANDROID_5.1_SPRD_9832E_SDK/”
SDK_SOURCE_ADDRESS=″git://192.168.1.108/mtk-hj-repositories/platform/manifest″
-基于平台更新SDK环境
具体来说,基于平台更新SDK环境,示例中Jenkins poll scm机制会对gerrit服务器提交的代码进行监听,如果监听到framework/kernel等SDK涉及相关源码文件的修改(SDK涉及的目录范围,需要配置到Jenkins服务器上),会触发此机制。其中该gerrit服务器用于代码提交、审核、入库操作,其为现有技术在此不再赘述。
1)Jenkins服务器配置并绑定gerrit服务器,当gerrit收到修改的代码提交后,Jenkins的poll scm机制,会自动将gerrit提交的代码生成patch,再通过git apply将patch应用到对应环境服务器上平台Android源码相对应的git仓内,再执行SDK的编译。
2)SDK编译完成,将out/host/linux-x86/sdk目录存在差异部分文件通过rsync同步到/home/work/ENVIRONMENT/SDK_PATH/目录下进行归档,并在对env.config注册信息进行更新。
其中关于Jenkins git插件原理说明:
Jenkins配置方法参照Jenkins官网提供的配置文档进行配置即可,在此不赘述。Jenkins的git插件封装了git客户端的操作命令,而git插件只是一个命令配置和解析器,负责将配置的命令转换成git客户端相关的命令,实际的代码摘取工作是由git客户端来完成,插件提供的GUI方式配置请求参数、生成git请求,并调用git客户端对远程git仓库进行操作,因此可具备便捷性、易用性。
-创建JDK环境
相比较SDK环境的创建,JDK环境的创建更为简单。以SUNJDK为例,从官方网站下载SUN JDK文件,为了能使用环境服务器可以提供和支持各种不同版本的JDK,需要从官网下载各种不同版本的JDK。
1)通过官方网站下载JDK bin文件后如:jdk-6u35-linux-x64.bin,使用chmod a+x jdk-6u35-linux-x64.bin对它添加可执行权限,再使用./jdk-6u35-linux-x64.bin进行解压,解压后的jdk1.6.0_45目录通过rsync增量备份到/home/work/ENVIRONMENT/JDK_PATH/目录下,并在env.config文件中注册JDK信息,注册的方式只要在evn.config中追加信息即可,信息内容如下:
[jdk1.6.0_45]
ENV_ID=“12”
JDK_VERSION=“jdk1.6.0_45”
JDK_PATH=“/home/work/ENVIRONMENT/JDK_PATH/jdk1.6.0_45/”
至此环境构建单元的构建完成。可见本方案下的该环境构建单元,相比传统环境的构建方法,即需要通过拷贝副本的形式,到各自需要使用环境的子服务器上进行环境的构建方案相比,灵活性和效率更高,例如:如果100台子服务器都有环境构建的需求,那么现有技术的方案对于处理这个的过程需要重复100次。
而本发明的方案,通过环境服务器提供的各类环境如SDK、JDK等,可做到通过映射可以快速实现子服务器环境的搭建和更新,并实现各个子服务器获取所使用的环境保持绝对的一致性(环境一处更新,处处更新),也不需要通过子服务器拷贝环境副本到本地进行构建,因此效率和灵活性更高。
(二)
本发明第二个方面提供的该分布式编译方法,依赖于实施例一的系统,其实施步骤包括:
S1设置主控单元,以获取编译信息,生成编译配置文件,并建立编译任务;编译配置文件生成后,通过python脚本导入的paramiko模块,获取SSH操作的实例,采用connect方法传入参数IP地址、帐户、密码实现与主服务器建立SSH通讯;
S2设置主服务器,预处理主控单元推送的编译任务,解析编译配置文件,以创建编译任务线程;获取当前编译任务所需参与编译的模块,以生成单元编译任务;根据第一法则对单元编译任务进行分配及调度;
S3设置子服务器,以获取主服务器分配的单元编译任务,经解析后获取编译信息,据此取得单元编译任务之源码,并向环境构建单元发起环境构建请求,获取环境构建脚本,以执行环境构建并完成编译;
S4设置环境构建单元,以接收子服务器发送的环境构建请求,经解析后输出环境配置信息,以生成环境构建脚本,并发送给子服务器;
其中所述环境构建步骤包括:E1子服务器收到单元编译任务,通过socket向环境构建单元发起环境构建请求;E2环境构建单元通过socket收到请求,解析请求获取环境配置信息,并找到对应的SDK/JDK信息;根据步骤E2生成环境构建脚本,脚本内容为环境导入的相关指令,并通过SSH发送给子服务器;通过SSH远程在子服务器上执行环境构建脚本。
其中,所述根据第一法则对单元编译任务进行分配及调度的步骤包括:利用远程SSH轮询多台子服务器,通过调用预置在各个子服务器上的python脚本,获取其工作状态和线程池内的任务量返回给主服务器,主服务器根据当前各个子服务器的任务承载量情况,将单元编译任务向各子服务器分配。
其中所述编译信息包括:平台信息、模块名、模块源码git仓库地址,其中子服务器根据模块源码git仓库地址进行源码的拉取,再根据平台信息,通过socket向环境构建单元发起环境构建请求。
其中所述环境构建脚本在子服务器上执行的步骤包括:在子服务器的临时目录下挂载环境构建单元上对应SDK目录,以映射环境构建单元上指定环境类型的文件目录到子服务器;通过导入子服务器上的临时目录,生成全局的环境变量。
综上所述,本发明的该分布式编译系统及分布式编译方法,通过建立编译环境构建单元,以向所有子服务器提供Android源码编译环境,并通过建立单元编译任务的方式,构建分布式计算。使得任何一台被分配单元编译任务的子服务器,都可在得到源码编译环境后,构建出一个与主服务器相同的编译环境,以此来实现Android源码中对Java模块代码的分布式编译工作,使其不受编译服务器编译环境的限制,可向任何一台子服务器分配Android Java模块编译任务。
以上公开的本发明优选实施例只是用于帮助阐述本发明。优选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本发明的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本发明。本发明仅受权利要求书及其全部范围和等效物的限制,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
本领域技术人员可以理解,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。
此外实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得单片机、芯片或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
此外,本发明实施例的各种不同的实施方式之间也可以进行任意组合,只要其不违背本发明实施例的思想,其同样应当视为本发明实施例所公开的内容。
Claims (9)
1.一种分布式编译系统,其特征在于包括:
主控单元,用以获取编译信息,生成编译配置文件,并建立编译任务;
主服务器,预处理主控单元推送的编译任务,解析编译配置文件,以创建编译任务线程;获取当前编译任务所需参与编译的模块,以生成单元编译任务;根据第一法则对单元编译任务进行分配及调度;
子服务器,其获取主服务器分配的单元编译任务,经解析后获取编译信息,据此取得单元编译任务之源码,并向环境构建单元发起环境构建请求,获取环境构建脚本,以执行环境构建并完成编译;
环境构建单元,其接收子服务器发送的环境构建请求,经解析后输出环境配置信息,以生成环境构建脚本,并发送给子服务器步骤包括:
步骤E1,子服务器收到单元编译任务,通过socket向环境构建单元发起环境构建请求;
步骤E2,环境构建单元通过socket收到请求,解析请求获取环境配置信息,并找到对应的SDK/JDK信息;
步骤E3,根据步骤E2生成一个环境构建脚本,脚本内容为环境导入的相关指令,并通过SSH发送给子服务器;
步骤E4,通过SSH远程在子服务器上执行环境构建脚本。
2.根据权利要求1所述的分布式编译系统,其特征在于,所述根据第一法则对单元编译任务进行分配及调度的步骤包括:利用远程SSH轮询多台子服务器,通过调用预置在各个子服务器上的python脚本,获取其工作状态和线程池内的任务量返回给主服务器,主服务器根据当前各个子服务器的任务承载量情况,将单元编译任务向各子服务器分配。
3.根据权利要求1所述的分布式编译系统,其特征在于,其中所述编译信息包括:平台信息、模块名、模块源码git仓库地址,其中子服务器根据模块源码git仓库地址进行源码的拉取,再根据平台信息,通过socket向环境构建单元发起环境构建请求。
4.根据权利要求1所述的分布式编译系统,其特征在于,所述环境构建脚本在子服务器上执行的步骤包括:在子服务器的临时目录下挂载环境构建单元上对应SDK目录,以映射环境构建单元上指定环境类型的文件目录到子服务器;通过导入子服务器上的临时目录,生成全局的环境变量。
5.根据权利要求1所述的分布式编译系统,其特征在于,所述环境构建单元包括:环境服务器,Jenkins 服务器; 其中环境服务器上安装有编译所需依赖工具集,在进行初步程序配置后,将环境服务器关联到Jenkins 服务器上,以完成自动化作业配置;Jenkins服务器触发SDK环境创建任务,以向环境服务器推送SDK脚本供其执行后创建SDK环境,使其可向子服务器提供SDK/JDK编译环境。
6.一种分布式编译方法,其特征在于,步骤包括:
S1设置主控单元,以获取编译信息,生成编译配置文件,并建立编译任务;编译配置文件生成后,通过python脚本导入的paramiko模块,获取SSH操作的实例,采用connect方法传入参数IP地址、帐户、密码实现与主服务器建立SSH通讯;
S2 设置主服务器,预处理主控单元推送的编译任务,解析编译配置文件,以创建编译任务线程;获取当前编译任务所需参与编译的模块,以生成单元编译任务;根据第一法则对单元编译任务进行分配及调度;
S3 设置子服务器,以获取主服务器分配的单元编译任务,经解析后获取编译信息,据此取得单元编译任务之源码,并向环境构建单元发起环境构建请求,获取环境构建脚本,以执行环境构建并完成编译;
S4 设置环境构建单元,以接收子服务器发送的环境构建请求,经解析后输出环境配置信息,以生成环境构建脚本,并发送给子服务器;
其中所述环境构建步骤包括:E1子服务器收到单元编译任务,通过socket向环境构建单元发起环境构建请求;E2环境构建单元通过socket收到请求,解析请求获取环境配置信息,并找到对应的SDK/JDK信息;根据步骤E2生成环境构建脚本,脚本内容为环境导入的相关指令,并通过SSH发送给子服务器;通过SSH远程在子服务器上执行环境构建脚本。
7.根据权利要求6所述的分布式编译方法,其特征在于,所述根据第一法则对单元编译任务进行分配及调度的步骤包括:利用远程SSH轮询多台子服务器,通过调用预置在各个子服务器上的python脚本,获取其工作状态和线程池内的任务量返回给主服务器,主服务器根据当前各个子服务器的任务承载量情况,将单元编译任务向各子服务器分配。
8.根据权利要求6所述的分布式编译方法,其特征在于,其中所述编译信息包括:平台信息、模块名、模块源码git仓库地址,其中子服务器根据模块源码git仓库地址进行源码的拉取,再根据平台信息,通过socket向环境构建单元发起环境构建请求。
9.根据权利要求6所述的分布式编译方法,其特征在于,所述环境构建脚本在子服务器上执行的步骤包括:在子服务器的临时目录下挂载环境构建单元上对应SDK目录,以映射环境构建单元上指定环境类型的文件目录到子服务器;通过导入子服务器上的临时目录,生成全局的环境变量。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110894307.0A CN113568755B (zh) | 2021-08-04 | 2021-08-04 | 一种分布式编译系统及分布式编译方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110894307.0A CN113568755B (zh) | 2021-08-04 | 2021-08-04 | 一种分布式编译系统及分布式编译方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113568755A CN113568755A (zh) | 2021-10-29 |
CN113568755B true CN113568755B (zh) | 2023-11-17 |
Family
ID=78170441
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110894307.0A Active CN113568755B (zh) | 2021-08-04 | 2021-08-04 | 一种分布式编译系统及分布式编译方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113568755B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106095523A (zh) * | 2016-06-03 | 2016-11-09 | 北京奇虎科技有限公司 | 一种实现安卓编译隔离的方法和系统 |
CN111723394A (zh) * | 2020-04-22 | 2020-09-29 | 北京大学 | 一种动态加载代码库的隐私保护分布式计算方法及系统 |
CN112463123A (zh) * | 2020-11-25 | 2021-03-09 | 北京字跳网络技术有限公司 | 任务编译方法、装置、网络节点、系统及存储介质 |
CN113127016A (zh) * | 2021-04-30 | 2021-07-16 | 平安国际智慧城市科技股份有限公司 | Hdp大数据平台的自动化部署方法、装置、设备及介质 |
CN113190238A (zh) * | 2021-03-26 | 2021-07-30 | 曙光信息产业(北京)有限公司 | 框架的部署方法、装置、计算机设备和存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101255983B1 (ko) * | 2009-07-21 | 2013-04-23 | 한국전자통신연구원 | 컴포넌트 기반 소프트웨어 플랫폼이 탑재된 장치 및 컴포넌트 기반 소프트웨어 플랫폼이 탑재된 장치의 애플리케이션 개체 관리 방법 |
-
2021
- 2021-08-04 CN CN202110894307.0A patent/CN113568755B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106095523A (zh) * | 2016-06-03 | 2016-11-09 | 北京奇虎科技有限公司 | 一种实现安卓编译隔离的方法和系统 |
CN111723394A (zh) * | 2020-04-22 | 2020-09-29 | 北京大学 | 一种动态加载代码库的隐私保护分布式计算方法及系统 |
CN112463123A (zh) * | 2020-11-25 | 2021-03-09 | 北京字跳网络技术有限公司 | 任务编译方法、装置、网络节点、系统及存储介质 |
CN113190238A (zh) * | 2021-03-26 | 2021-07-30 | 曙光信息产业(北京)有限公司 | 框架的部署方法、装置、计算机设备和存储介质 |
CN113127016A (zh) * | 2021-04-30 | 2021-07-16 | 平安国际智慧城市科技股份有限公司 | Hdp大数据平台的自动化部署方法、装置、设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN113568755A (zh) | 2021-10-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Burns et al. | Kubernetes: up and running | |
CN111324571B (zh) | 一种容器集群管理方法、装置及系统 | |
CN107577475B (zh) | 一种数据中心集群系统的软件包管理方法及系统 | |
CA2939379C (en) | Systems and methods for partitioning computing applications to optimize deployment resources | |
US20170153930A1 (en) | Application container runtime | |
US20050223101A1 (en) | Computer-implemented method, system and program product for resolving prerequisites for native applications utilizing an open service gateway initiative ( OSGi) framework | |
CN106569880B (zh) | 一种Android应用间动态共享资源的方法及系统 | |
CN111857801B (zh) | 一种移动应用的构建方法 | |
US20200320034A1 (en) | Service deployment in a cluster of i/o devices | |
Kehrer et al. | TOSCA-based container orchestration on Mesos: two-phase deployment of cloud applications using container-based artifacts | |
CN117112122A (zh) | 一种集群部署方法和装置 | |
Van Der Burg et al. | Disnix: A toolset for distributed deployment | |
CN116028163A (zh) | 一种容器组的动态链接库调度方法、装置及存储介质 | |
CN113608744B (zh) | 一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统 | |
CN115309500A (zh) | 云上微服务架构应用部署和运维管理方法及系统 | |
CN113296795A (zh) | 应用部署方法、装置、设备、存储介质及程序产品 | |
Zimmermann et al. | Self-contained Service Deployment Packages. | |
CN113568755B (zh) | 一种分布式编译系统及分布式编译方法 | |
Solayman et al. | Seamless Integration of DevOps Tools for Provisioning Automation of the IoT Application on Multi-Infrastructures | |
CN113835827A (zh) | 基于容器Docker的应用部署方法、装置及电子设备 | |
CN114035890A (zh) | 一种基于容器技术的ci/cd服务部署方法、装置、设备及介质 | |
Alapati et al. | Cassandra on Docker, Apache Spark, and the Cassandra Cluster Manager | |
Jai | RADIUS: rapid application delivery, installation and upgrade system | |
Lamouchi | Getting Started with Containerization | |
Raheja | Enabling kubernetes for distributed ai processing on edge devices |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |