CN113608744B - 一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统 - Google Patents
一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统 Download PDFInfo
- Publication number
- CN113608744B CN113608744B CN202110893937.6A CN202110893937A CN113608744B CN 113608744 B CN113608744 B CN 113608744B CN 202110893937 A CN202110893937 A CN 202110893937A CN 113608744 B CN113608744 B CN 113608744B
- Authority
- CN
- China
- Prior art keywords
- environment
- server
- compiling
- sdk
- sub
- 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
- 238000010276 construction Methods 0.000 title claims abstract description 79
- 238000000034 method Methods 0.000 title claims abstract description 63
- 238000012795 verification Methods 0.000 claims description 10
- 238000013507 mapping Methods 0.000 claims description 8
- 241001362551 Samba Species 0.000 claims description 6
- 230000007246 mechanism Effects 0.000 claims description 6
- 230000006837 decompression Effects 0.000 claims description 3
- 230000008569 process Effects 0.000 description 27
- 230000006870 function Effects 0.000 description 7
- 238000012986 modification Methods 0.000 description 5
- 230000004048 modification Effects 0.000 description 5
- 238000012544 monitoring process Methods 0.000 description 4
- 238000004891 communication Methods 0.000 description 3
- 238000012545 processing Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 2
- 230000000977 initiatory effect Effects 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
- 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
- 238000005516 engineering process Methods 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
- 238000007781 pre-processing Methods 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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/451—Code distribution
-
- 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
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/457—Communication
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统,其中该方法步骤包括:在环境服务器上安装编译所需依赖工具集,进行初步程序配置,并将环境服务器关联到Jenkins服务器上;Jenkins服务器触发SDK环境创建任务,以向环境服务器推送创建SDK脚本供其执行后建立SDK环境;配置环境服务器获取对应版本JDK文件,创建JDK环境。
Description
技术领域
本发明涉及及编译技术领域,尤其涉及一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统。
背景技术
传统Android源码工程的编译方案包括,以单个编服务器执行一个编译任务,依次进行编译、或使用现有的distcc来搭建分布式编译环境。然而由于Android源码的编译过程中同时存在Java的编译和C类语言的编译,而distcc又仅支持C类语言的分布式编译,因此Android的分布式编译获得的效果,不如普通纯C类语言项目明显。
然而随着任务数目的增加,仅能在本机处理的Java编译过程,反而由于机器硬件性能的限制,而拖慢了整体的编译速度,甚至抵消了由distcc分布式编译获取的益处。因此本领域亟待一种技术来解决上述现有技术的缺陷。
为此发明人为了解决上述现有技术的缺陷,考虑通过建立编译环境构建单元,以向所有子服务器提供Android源码编译环境,并通过建立单元编译任务的方式,构建分布式计算。使得任何一台被分配单元编译任务的子服务器,都可在得到源码编译环境后,构建出一个与主服务器相同的编译环境,以此来实现Android源码中对Java模块代码的分布式编译工作,使其不受编译服务器编译环境的限制,可向任何一台子服务器分配Android Java模块编译任务。
发明内容
本发明的主要目的在于提供一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统,以解决背景技术中现有技术的至少部分缺陷。
为了实现上述目的,根据本发明的第一个方面,提供了一种用于执行分布式编译的环境构建单元的建立方法,其步骤包括:在环境服务器上安装编译所需依赖工具集,进行初步程序配置,并将环境服务器关联到Jenkins服务器上;Jenkins服务器触发SDK环境创建任务,以向环境服务器推送创建SDK脚本供其执行后建立SDK环境;配置环境服务器获取对应版本JDK文件,创建JDK环境。
在可能的优选实施方式中,所述初步程序配置步骤包括:配置SSH,通过SSH生成公钥和密钥;配置repo环境,将repo脚本放置到指定目录下,通过export导入到ubuntu全局环境变量;配置git工具,包括配置git的用户帐户和用户邮件地址,以供通过git从代码服务器拉取代码;配置samba工具,提供环境服务器环境相关文件的共享,将环境配置文件共享到网络,让同一网段内的子服务器能访问,以供子服务器映射环境服务器环境配置文件。
在可能的优选实施方式中,环境服务器执行创建SDK脚本建立SDK环境的步骤包括:环境服务器上执行build.sh脚本中封装的包括repo init-u、repo sync命令,从代码服务器下载指定平台的Android源码到指定目录;通过build.sh脚本内封装好的编译命令,对下载好后的Android源码进行SDK的编译;编译完成后会在Android源码的对应目录下生成sdk目录,build.sh脚本会对sdk目录进行MD5生成验证码,为后续更新SDK版本做差异化校验;build.sh脚本将编译好后的sdk目录同步到目标目录,此目标目录用于发布和被子服务器映射,并将当前生成的SDK信息注册到环境变量配置文件中。
在可能的优选实施方式中,步骤还包括:Jenkins服务器对gerrit服务器提交的代码进行监听,当涉及Android源码文件修改时更新SDK环境。
在可能的优选实施方式中,更新SDK环境步骤包括:Jenkins服务器配置并绑定gerrit服务器,当gerrit服务器收到修改的代码提交后,Jenkins服务器利用poll scm机制,将gerrit服务器提交的代码生成patch,再通过git apply将patch应用到对应环境服务器上平台Android源码相对应的git仓内,再执行SDK的编译;当SDK编译完成后,将out/host/linux-x86/sdk目录存在差异部分文件同步到/home/work/ENVIRONMENT/SDK_PATH/目录下进行归档,并对环境变量配置文件注册信息进行更新。
在可能的优选实施方式中,所述JDK环境创建步骤包括:环境服务器获取JDK bin文件后,使用配置工具对其添加可执行权限,再进行解压,解压后的JDK目录通过增量备份到/home/work/ENVIRONMENT/JDK_PATH/目录下,并在环境变量配置文件中注册JDK信息。
为了实现上述目的,根据本发明的第二个方面,还提供了一种分布式编译系统,通过环境构建单元来为子服务器构建指定编译环境,其包括:采用上述用于执行分布式编译的环境构建单元的建立方法,来配置环境构建单元;子服务器向环境服务器发起环境构建请求,环境服务器收到请求并进行解析,以生成环境构建脚本,并推送回子服务器;环境服务器与子服务器通信,以远程操控子服务器执行环境构建脚本,直至子服务器完成编译环境的构建。
在可能的优选实施方式中,所述环境服务器解析环境构建请求的步骤包括:环境服务器析环境构建请求,获取环境ID,据此读取环境变量配置文件,查询匹配的配置信息,据此生成环境构建脚本。
在可能的优选实施方式中,所述子服务器执行环境构建脚本构建编译环境的步骤包括:根据环境ID在环境变量配置文件中查询到指定环境类型的文件目录;映射环境服务器上指定环境类型的文件目录到子服务器目标目录下;根据子服务器的目标目录下的文件,通过export导入ubuntu的全局环境变量。
本发明提供的该用于执行分布式编译的环境构建单元的建立方法及分布式编译系统,通过建立编译环境构建单元,以向所有子服务器提供Android源码编译环境,并通过建立单元编译任务的方式,构建分布式计算。使得任何一台被分配单元编译任务的子服务器,都可在得到源码编译环境后,构建出一个与主服务器相同的编译环境,以此来实现Android源码中对Java模块代码的分布式编译工作,使其不受编译服务器编译环境的限制,可向任何一台子服务器分配Android Java模块编译任务。
附图说明
构成本申请的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为本发明第一、二实施例的结构示意图;
图2为本发明第一实施例的基于环境构建单元创建SDK环境的流程示意图;
图3为发明第一实施例的环境构建单元为子服务器构建环境的流程示意图;
图4为本发明第二实施例的主控单元的项目编译信息采集界面示意图;
图5为本发明第二实施例的主服务器分配编译任务的流程示意图;
图6为本发明第二实施例的子服务器执行分配的单元编译任务的流程示意图;
图7为本发明第二实施例的主服务器解析编译任务所涉项目中所有需要参与编译的模块,以形成单元编译任务的流程示意图。
图中T为task任务含义。
具体实施方式
下面对本发明的具体实施方式进行详细地说明。以下示例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进。这些都属于本发明的保护范围。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本领域的技术人员更好的理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,在本领域普通技术人员没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明的保护范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。
(一)
请参阅图1至图3所述,本发明提供的用于执行分布式编译的环境构建单元的建立方法,在优选实施方式下,其步骤包括:在环境服务器上安装编译所需依赖工具集,进行初步程序配置,并将环境服务器关联到Jenkins服务器上;Jenkins服务器触发SDK环境创建任务,以向环境服务器推送创建SDK脚本供其执行后建立SDK环境;配置环境服务器获取对应版本JDK文件,创建JDK环境。
其中,所述初步程序配置步骤包括:配置SSH,通过SSH生成公钥和密钥;配置repo环境,将repo脚本放置到指定目录下,通过export导入到ubuntu全局环境变量;配置git工具,包括配置git的用户帐户和用户邮件地址,以供通过git从代码服务器拉取代码;配置samba工具,提供环境服务器环境相关文件的共享,将环境配置文件共享到网络,让同一网段内的子服务器能访问,以供子服务器映射环境服务器环境配置文件。
其中,环境服务器执行创建SDK脚本建立SDK环境的步骤包括:环境服务器上执行build.sh脚本中封装的包括repo init-u、repo sync命令,从代码服务器下载指定平台的Android源码到指定目录;通过build.sh脚本内封装好的编译命令,对下载好后的Android源码进行SDK的编译;编译完成后会在Android源码的对应目录下生成sdk目录,build.sh脚本会对sdk目录进行MD5生成验证码,为后续更新SDK版本做差异化校验;build.sh脚本将编译好后的sdk目录同步到目标目录,此目标目录用于发布和被子服务器映射,并将当前生成的SDK信息注册到环境变量配置文件中。
其中,步骤还包括:Jenkins服务器对gerrit服务器提交的代码进行监听,当涉及Android源码文件修改时更新SDK环境。
其中,更新SDK环境步骤包括:Jenk ins服务器配置并绑定gerrit服务器,当gerrit服务器收到修改的代码提交后,Jenkins服务器利用poll scm机制,将gerrit服务器提交的代码生成patch,再通过git apply将patch应用到对应环境服务器上平台Android源码相对应的git仓内,再执行SDK的编译;当SDK编译完成后,将out/host/linux-x86/sdk目录存在差异部分文件同步到/home/work/ENVIRONMENT/SDK_PATH/目录下进行归档,并对环境变量配置文件注册信息进行更新。
其中,所述JDK环境创建步骤包括:环境服务器获取JDK bin文件后,使用配置工具对其添加可执行权限,再进行解压,解压后的JDK目录通过增量备份到/home/work/ENVIRONMENT/JDK_PATH/目录下,并在环境变量配置文件中注册JDK信息。
具体来说,如图1所示,在优选实施方式中,本发明的该环境构建单元包括:环境服务器,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 gperf imagemagick lib32ncurses5-devlib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-devlibssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsyncschedtool squashfs-tools xsltproc yasm zip zlib1g-dev python samba smbclientopenSSH-server。
而该初步程序配置,优选包括:配置SSH,repo环境,git工具及samba工具,如示例中:
配置SSH,通过SSH生成公钥和密钥,用于免密拉取代码服务器上的代码,如果不配置密钥,需要用户手动输入密码。由于所有操作都是由脚本自动完成,没办法应答密码的动态输入。为了解决此问题,环境服务器和子服务器需要建立一种白名单的关系,而这种关系就需要密钥来建立。
配置repo环境,repo脚本由代码服务器提供,只需要将repo脚本放置到一个指定目录下,通过export导入到ubuntu全局环境变量即可,repo的是google提供的一个工具,其实就是一个python脚本,基于git的仓库管理工具。
配置git工具,主要配置git的用户帐户和用户邮件地址,通过git可以从代码服务器拉取代码。
配置samba工具,提供环境服务器环境相关文件的共享,可以将环境配置文件共享到网络,让同一网段内的子服务器能访问,可见子服务器映射环境服务器环境配置文件,基于此共享实现。
当完成上述初步程序配置过程后,将环境服务器关联到Jenkins服务器上,即可以实现Jenkins对环境服务器实现自动化作业。
-基于平台创建SDK环境
具体来说,如图2所示,该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环境
具体来说,如图2所示,基于平台更新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/ENVlRONMENT/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等,可做到通过映射可以快速实现子服务器环境的搭建和更新,并实现各个子服务器获取所使用的环境保持绝对的一致性(环境一处更新,处处更新),也不需要通过子服务器拷贝环境副本到本地进行构建,因此效率和灵活性更高。
(二)
请参阅图1、图3至图7所示,本发明的第二个方面,还提供了一种分布式编译系统,其通过环境构建单元来为子服务器构建指定编译环境,其中,该环境构建单元采用如实施例一中所述的用于执行分布式编译的环境构建单元的建立方法,来配置环境构建单元;而后子服务器向环境服务器发起环境构建请求,环境服务器收到请求并进行解析,以生成环境构建脚本,并推送回子服务器;之后环境服务器与子服务器通信,以远程操控子服务器执行环境构建脚本,直至子服务器完成编译环境的构建。
其中,所述环境服务器解析环境构建请求的步骤包括:环境服务器析环境构建请求,获取环境ID,据此读取环境变量配置文件,查询匹配的配置信息,据此生成环境构建脚本。
其中,所述子服务器执行环境构建脚本构建编译环境的步骤包括:根据环境ID在环境变量配置文件中查询到指定环境类型的文件目录;映射环境服务器上指定环境类型的文件目录到子服务器目标目录下;根据子服务器的目标目录下的文件,通过export导入ubuntu的全局环境变量。
具体来说,为了示例该分布式编译系统的优选构成及运行原理,并结合现有技术,在另一优选实施例中,该系统构成包括:
-主控单元
如图4所示,其可以是一个搜集信息的客户端形态,以获取编译项目信息,来生成编译配置文件,并建立编译任务。
具体来说,所述编译项目信息包括:该主控单元可通过UI界面收集所需编译项目的基本信息、主服务器相关信息、版本归档服务器信息、版本发布邮件信息等。其中本实施例下,示例该:
项目基本信息包括:项目名、版本性质、源码clone地址、平台、编译方式;
主服务器信息包括:公共版本编译服务器IP地址、帐户名和密码等;
版本归档服务器信息包括:版本归档地址、帐户名和密码等;
版本发布信息包括:收件人、抄送、发送内容(版本修改点)等;
通过以上收集的编译项目信息,主控单元首先会通过python脚本,把所有编译项目信息整理成一个以节点和键值对形式构成的ini编译配置文件。
编译配置文件生成后,通过python脚本导入的paramiko模块,paramiko.SSHClient()获取SSH操作的实例,connect方法传入参数IP地址、帐户、密码实现与主服务器建立SSH通讯。通过实例中的put方法传入相对应的配置文件所在路径、主服务器目标路径如:(/home/server138/work/build_list/),向主服务器推送此配置文件,一个编译配置文件可以理解为一个编译任务。
-主服务器
如图5所示,主服务器通过监听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,如图7所示,获取当前编译任务所涉项目中所有需要参与编译的模块,通过调用执行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中去,即:多个模块,组合成一个ITEM_JOB。
通过Dependency函数中的write_config_script()方法将解析后的信息写入指定ITEM_JOB.config文件中,并随机生成一个模块ID,生成的每个ITEM_JOB会被存放到源码根目录下schedules目录中。用于接下来的调度和分配。
其中根据第一法则对单元编译任务进行分配及调度过程包括:
利用远程SSH轮询多台子服务器,通过调用预置在各个子服务器上的python脚本,获取其工作状态和线程池内的任务量返回给主服务器,主服务器再根据当前各个子服务器的任务量情况,分配编译任务,再将其拆分成多个单元编译任务分配给多台子服务器建立不同任务的线程池,由此完成整个分布式编译任务。
具体来说,该第一法则包括:采用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任务后,如图6所示:
步骤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
-环境构建单元
如实施例1所述的该环境构建单元,其中该环境构建单元接收子服务器发送的环境构建请求,经解析后输出环境配置信息,以生成环境构建脚本,并发送给子服务器。
在示例中,该环境构建过程包括:
步骤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任务池内创建的所有任务执行完成。
综上所述,本发明的该用于执行分布式编译的环境构建单元的建立方法及分布式编译系统,通过建立编译环境构建单元,以向所有子服务器提供Android源码编译环境,并通过建立单元编译任务的方式,构建分布式计算。使得任何一台被分配单元编译任务的子服务器,都可在得到源码编译环境后,构建出一个与主服务器相同的编译环境,以此来实现Android源码中对Java模块代码的分布式编译工作,使其不受编译服务器编译环境的限制,可向任何一台子服务器分配Android Java模块编译任务。
以上公开的本发明优选实施例只是用于帮助阐述本发明。优选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本发明的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本发明。本发明仅受权利要求书及其全部范围和等效物的限制,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
本领域技术人员可以理解,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。
此外实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得单片机、芯片或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
此外,本发明实施例的各种不同的实施方式之间也可以进行任意组合,只要其不违背本发明实施例的思想,其同样应当视为本发明实施例所公开的内容。
Claims (8)
1.一种分布式编译系统,通过环境构建单元来为子服务器构建指定编译环境,其特征在于包括:采用用于执行分布式编译的环境构建单元的建立方法,来配置环境构建单元;子服务器向环境服务器发起环境构建请求,环境服务器收到请求并进行解析,以生成环境构建脚本,并推送回子服务器;环境服务器与子服务器通信,以远程操控子服务器执行环境构建脚本,直至子服务器完成编译环境的构建,其中,所述用于执行分布式编译的环境构建单元的建立方法,步骤包括:在环境服务器上安装编译所需依赖工具集,进行初步程序配置,并将环境服务器关联到Jenkins 服务器上;Jenkins服务器触发SDK环境创建任务,以向环境服务器推送创建SDK脚本供其执行后建立SDK环境;配置环境服务器获取对应版本JDK文件,创建JDK环境。
2.根据权利要求1所述的分布式编译系统,其特征在于,所述环境服务器解析环境构建请求的步骤包括:环境服务器解析环境构建请求,获取环境ID,据此读取环境变量配置文件,查询匹配的配置信息,据此生成环境构建脚本。
3.根据权利要求2所述的分布式编译系统,其特征在于,所述子服务器执行环境构建脚本构建编译环境的步骤包括:根据环境ID在环境变量配置文件中查询到指定环境类型的文件目录;映射环境服务器上指定环境类型的文件目录到子服务器目标目录下;根据子服务器的目标目录下的文件,通过export导入ubuntu的全局环境变量。
4.根据权利要求1所述的分布式编译系统,其特征在于,所述初步程序配置步骤包括:配置SSH,通过SSH生成公钥和密钥;配置repo环境,将repo脚本放置到指定目录下,通过export导入到ubuntu全局环境变量;配置git工具,包括配置git的用户帐户和用户邮件地址,以供通过git从代码服务器拉取代码;配置samba工具,提供环境服务器环境相关文件的共享,将环境配置文件共享到网络,让同一网段内的子服务器能访问,以供子服务器映射环境服务器环境配置文件。
5.根据权利要求1所述的分布式编译系统,其特征在于,环境服务器执行创建SDK脚本建立SDK环境的步骤包括:环境服务器上执行build.sh脚本中封装的包括repo init -u 、repo sync命令,从代码服务器下载指定平台的Android源码到指定目录;通过build.sh脚本内封装好的编译命令,对下载好后的Android源码进行SDK的编译;编译完成后会在Android源码的对应目录下生成sdk目录,build.sh脚本会对sdk目录进行MD5生成验证码,为后续更新SDK版本做差异化校验;build.sh脚本将编译好后的sdk目录同步到目标目录,此目标目录用于发布和被子服务器映射,并将当前生成的SDK信息注册到环境变量配置文件中。
6.根据权利要求1所述的分布式编译系统,其特征在于,所述用于执行分布式编译的环境构建单元的建立方法的步骤还包括:Jenkins服务器对gerrit服务器提交的代码进行监听,当涉及Android源码文件修改时更新SDK环境。
7.根据权利要求1所述的分布式编译系统,其特征在于,更新SDK环境步骤包括:Jenkins服务器配置并绑定gerrit服务器,当gerrit服务器收到修改的代码提交后,Jenkins服务器利用poll scm机制,将gerrit服务器提交的代码生成patch,再通过gitapply将patch应用到对应环境服务器上平台Android源码相对应的git仓内,再执行SDK的编译;当SDK编译完成后,将out/host/linux-x86/sdk目录存在差异部分文件同步到/home/work/ENVIRONMENT/SDK_PATH/目录下进行归档,并对环境变量配置文件注册信息进行更新。
8.根据权利要求1所述的分布式编译系统,其特征在于,所述JDK环境创建步骤包括:环境服务器获取JDK bin文件后,使用配置工具对其添加可执行权限,再进行解压,解压后的JDK目录通过增量备份到/home/work/ENVIRONMENT/JDK_PATH/目录下,并在环境变量配置文件中注册JDK信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110893937.6A CN113608744B (zh) | 2021-08-04 | 2021-08-04 | 一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110893937.6A CN113608744B (zh) | 2021-08-04 | 2021-08-04 | 一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113608744A CN113608744A (zh) | 2021-11-05 |
CN113608744B true CN113608744B (zh) | 2024-02-23 |
Family
ID=78306932
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110893937.6A Active CN113608744B (zh) | 2021-08-04 | 2021-08-04 | 一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113608744B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114047920A (zh) * | 2021-11-15 | 2022-02-15 | 宝宝巴士股份有限公司 | 一种基于Jenkins和Gradle的安卓App分布式编译方法 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105653287A (zh) * | 2015-12-31 | 2016-06-08 | 北京元心科技有限公司 | 一种程序自动版本发布方法和装置 |
CN106648786A (zh) * | 2016-12-28 | 2017-05-10 | 深圳Tcl数字技术有限公司 | Android应用程序构建方法及系统 |
CN106815052A (zh) * | 2017-01-10 | 2017-06-09 | 南威软件股份有限公司 | 一种适配多环境配置的快速部署系统的方法 |
CN108614699A (zh) * | 2016-12-20 | 2018-10-02 | 航天信息股份有限公司 | 一种在windows系统上持续集成Android项目的方法和系统 |
CN108628735A (zh) * | 2017-03-22 | 2018-10-09 | 腾讯科技(深圳)有限公司 | 应用的自动化测试方法和系统 |
US10698733B1 (en) * | 2016-09-02 | 2020-06-30 | Intuit Inc. | Integrated system to distribute and execute complex applications |
CN112463123A (zh) * | 2020-11-25 | 2021-03-09 | 北京字跳网络技术有限公司 | 任务编译方法、装置、网络节点、系统及存储介质 |
-
2021
- 2021-08-04 CN CN202110893937.6A patent/CN113608744B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105653287A (zh) * | 2015-12-31 | 2016-06-08 | 北京元心科技有限公司 | 一种程序自动版本发布方法和装置 |
US10698733B1 (en) * | 2016-09-02 | 2020-06-30 | Intuit Inc. | Integrated system to distribute and execute complex applications |
CN108614699A (zh) * | 2016-12-20 | 2018-10-02 | 航天信息股份有限公司 | 一种在windows系统上持续集成Android项目的方法和系统 |
CN106648786A (zh) * | 2016-12-28 | 2017-05-10 | 深圳Tcl数字技术有限公司 | Android应用程序构建方法及系统 |
CN106815052A (zh) * | 2017-01-10 | 2017-06-09 | 南威软件股份有限公司 | 一种适配多环境配置的快速部署系统的方法 |
CN108628735A (zh) * | 2017-03-22 | 2018-10-09 | 腾讯科技(深圳)有限公司 | 应用的自动化测试方法和系统 |
CN112463123A (zh) * | 2020-11-25 | 2021-03-09 | 北京字跳网络技术有限公司 | 任务编译方法、装置、网络节点、系统及存储介质 |
Non-Patent Citations (2)
Title |
---|
ACI (automated Continuous Integration) using Jenkins: Key for successful embedded Software development;Nikita Seth et al.;《2015 2nd International Conference on Recent Advances in Engineering & Computational Sciences (RAECS)》;全文 * |
基于Jenkins的持续集成系统研究;陈迪;《电子测试》;第1卷(第8期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN113608744A (zh) | 2021-11-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107577475B (zh) | 一种数据中心集群系统的软件包管理方法及系统 | |
US20160269227A1 (en) | System and method for configuration management service | |
US9916137B2 (en) | Rest service source code generation | |
US20050223101A1 (en) | Computer-implemented method, system and program product for resolving prerequisites for native applications utilizing an open service gateway initiative ( OSGi) framework | |
WO2014138895A1 (en) | Systems and methods for partitioning computing applications to optimize deployment resources | |
US20170153930A1 (en) | Application container runtime | |
CN106569880B (zh) | 一种Android应用间动态共享资源的方法及系统 | |
CN111857801B (zh) | 一种移动应用的构建方法 | |
CN111800452A (zh) | 在输入/输出设备集群中的服务部署 | |
Van Der Burg et al. | Disnix: A toolset for distributed deployment | |
CN113608744B (zh) | 一种用于执行分布式编译的环境构建单元的建立方法及分布式编译系统 | |
CN116028163A (zh) | 一种容器组的动态链接库调度方法、装置及存储介质 | |
US20240220220A1 (en) | Method, apparatus, and computer-readable medium for intelligent execution of a solution on a computer network | |
CN113296795A (zh) | 应用部署方法、装置、设备、存储介质及程序产品 | |
CN113568755B (zh) | 一种分布式编译系统及分布式编译方法 | |
Solayman et al. | Seamless Integration of DevOps Tools for Provisioning Automation of the IoT Application on Multi-Infrastructures | |
KR102131669B1 (ko) | 데이터 연계 시스템 | |
CN114035890A (zh) | 一种基于容器技术的ci/cd服务部署方法、装置、设备及介质 | |
CN114327770A (zh) | 容器集群管理系统及方法 | |
CN113835827A (zh) | 基于容器Docker的应用部署方法、装置及电子设备 | |
KR102485154B1 (ko) | 전력 통신 서비스 | |
CN113485816B (zh) | 定时调度任务的部署方法、装置、设备及存储介质 | |
US20240256247A1 (en) | Systems and methods for declarative composition of infrastructure components of a software product definition for automated end to end deployment | |
Mustafa | Microservices vs. Monolithic | |
Jai | RADIUS: rapid application delivery, installation and upgrade system |
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 |