首页> 中国专利> 一种基于管理者和工作者架构的支持多平台的自动化编译方法

一种基于管理者和工作者架构的支持多平台的自动化编译方法

摘要

本发明涉及自动化编译系统领域,具体为一种基于管理者和工作者架构的支持多平台的自动化编译系统及方法,相当于一对多,即一个管理者,多个工作者,在管理端,指定编译产品、选项、版本、平台等信息,管理者向各个编译工作者发送编译指令,各编译工作者收到编译指令,解码后执行,各编译工作者汇报编译进行状态,工作者通报编译结果,并把编译结果发到指定位置,管理者解码编译结果,并进行提示,使用C/S架构和TCP协议,系统分为管理者、多个工作者、共享目录等部分,管理者和工作使用json数据格式进行交互传输编译命令和状态进度和结果信息,工作者运行在不同的CPU平台机器上,共享目录可与版本管理系统关联实现版本控制。

著录项

  • 公开/公告号CN112306492A

    专利类型发明专利

  • 公开/公告日2021-02-02

    原文格式PDF

  • 申请/专利权人 泰山信息科技有限公司;

    申请/专利号CN202011036539.4

  • 发明设计人 崔海东;王方帅;柳鲲鹏;

    申请日2020-09-27

  • 分类号G06F8/41(20180101);

  • 代理机构11530 北京高航知识产权代理有限公司;

  • 代理人乔浩刚

  • 地址 271000 山东省泰安市泰山区明堂路泰山软件园1-4层

  • 入库时间 2023-06-19 09:46:20

说明书

技术领域

本发明涉及自动化编译系统领域,具体为一种基于管理者和工作者架构的支持多平台的自动化编译方法。

背景技术

本发明主要为实现在多种不同国产平台上快速编译程序而产生。

国产化OS适配了多种指令集不同的CPU,为了编译不同平台程序,必须在不同机器上进行编译,需要如下步骤:

1、向目标机器复制代码;

2、在目标机器上编译;

3、把编译结果复制到一个目录;

4、提交编译结果到SVN;

对于多种不同平台的机器,上述操作需要重复多次,编译过程可能时间较长,而且操作出错的可能性很大。为了解决这个问题,需要实现一种快速、统一的在多平台电脑上编译目标程序的方法,避免人工操作,保证编译结果的正确性,提高编译效率。

当前技术的缺点:

1.当前国产平台缺少完善的版本管理系统支持,无法安装SVN等版本控制软件,不能在本地直接下载代码,需要手动复制或从远程存储设备复制代码,然后手动执行编译脚本进行编译,操作需要花费较长的时间,且在手动操作过程中容易出现问题,导致源码或编译结果不完整、不正确。

2.编译完成后,需要手动复制输出的目标文件其它位置,如测试目录、SVN上传目录,需要在每个平台上都操作一次,这个手工步骤同样比较花时间且容易出错。多平台的情况下,会产生多个相同名称的目标文件,上传时容易混淆,如上传到错误的目录,上传了错误的文件。

专业术语解释:

管理者:指用于配置和分发源文件信息、编译信息、目标文件保存信息的程序。

工作者:指用于接收相关信息进行源文件下载、编译的程序。

多平台:指Amd64、Arm64、Mips64等不同的CPU架构,不同平台需要使用不同的编译器进行编译。

编译:利用编译器从源语言产生目标程序的过程,目前支持C++、Java代码编译。

版本管理系统:指提供文件控制、保留文件历史修改记录,可追踪文件变更的管理系统,是软件配置管理的核心工具。

发明内容

(一)解决的技术问题

针对现有技术的不足,本发明提供了一种减少操作时间和步骤,提高结果的准确性的基于管理者和工作者架构的支持多平台的自动化编译方法。

(二)技术方案

为实现上述目的,本发明提供如下技术方案:本发明的一种基于管理者和工作者架构的支持多平台的自动化编译方法,包括以下步骤:

步骤1、工作者机器启动自动化编译服务,开始监听并准备接收编译命令;

步骤2、管理者机器更新需要编译的代码到共享目录;

步骤3、管理者根据配置,向各工作者发出编译命令,内容包括:

a)代码地址。

b)需要编译的程序。

c)编译结果存放地址。

d)编译需要的工作目录、编译脚本名称、编译参数、输出的目标文件名称和路径。

e)访问共享目录需要的账号信息。

步骤4、工作者收到编译命令,并反馈编译请求,使用不同的端口下载代码到本地编译目录。

步骤5、工作者进行编译。

步骤6、工作者将编译结果传送到指定地址。

步骤7、工作者通知管理者,已完成编译和具体的成功、失败信息。

本发明改进有,所述共享目录通过smb协议位于系统内。

本发明改进有,所述步骤4中,当工作者收到编译信息并发出编译请求后,管理者首先读取工作者的地址信息,接着解析所有需要编译的任务信息列表,对每一个任务包含对应的工作者地址信息,目标程序名,平台和操作系统名称,并逐一发送到对应的工作者。

本发明改进有,所述步骤4中,当工作者下载代码至本地编译目录后,编译开始前进行改脚本填充sudo密码,所述步骤6中,编译结果传送至指定位置时,同时上传目标文件的md5信息及编译日志文件。

本发明改进有,所述步骤6中,系统接收编译结构后,检查是否所有需要的目标都成功完成编译,并上传结果文件到共享目录。

本发明改进有,步骤2中,当管理者启动后,进行共享目录、编译信息、编译任务和工作者信息自检,如配置有效,则进入步骤3,否,则退出。

本发明改进有,配置文件、管理者和工作者交互报文使用json格式。

本发明改进有,所述步骤2中的管理者启动后步骤如下:

步骤1、更新源码,触发编译请求,立即读取并解析配置,配置中包含共享目录、编译信息、编译任务和工作者信息;

步骤2、检查配置是否失效,如果配置有效,转步骤3,如果配置无效,转步骤4。

步骤3、读取所有编译命令,将遍历所有的编译任务,新建线程合成编译命令后发送到对应的工作者,并等待工作者信息反馈,包括具体目标的编译进度和最终整体的编译结果;接收完毕后退出;

步骤4、显示编译状态和结果后退出。

(三)有益效果

与现有技术相比,本发明提供了一种基于管理者和工作者架构的支持多平台的自动化编译系统及方法,具备以下有益效果:

该基于管理者和工作者架构的支持多平台的自动化编译系统提高了效率,由于采用了自动编译,除非需要修改配置,只需要简单的触发编译请求,即可完成自动源码更新、编译请求发送和处理操作,且多个工作者可以同时处理编译,提高了效率,由于采用程序化的操作,所有配置在管理者端统一控制,可保证所有的工作者使用统一的源文件、编译参数、编译步骤,保证了结果的一致性、准确性,自动编译需要的时间为手动编译的1/(mxn),m为平台数,n为单次单目标完整编译手动编译所需时间与自动编译所需时间的比值。用户在自动编译过程中可处理其它任务,编译完成直接查看管理者输出的结果信息即可,如果编译出错可查看结果输出目录内的日志进行排查定位,可扩展实现持续编译、持续部署功能,及时发现版本库中源码是否存在编译问题,可增加目标文件对应的源码版本信息,测试发现问题后可快速追踪。

附图说明

图1为本发明整体模块图;

图2为本发明的管理者的流程图;

图3为本发明的工作者的流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

参照附图1,本发明提供一种基于管理者和工作者架构的支持多平台的自动化编译方法,包括以下步骤:

步骤1、工作者机器启动自动化编译服务,开始监听并准备接收编译命令;

步骤2、管理者机器更新需要编译的代码到共享目录;

步骤3、管理者根据配置,向各工作者发出编译命令,内容包括:

a)代码地址。

b)需要编译的程序。

c)编译结果存放地址。

d)编译需要的工作目录、编译脚本名称、编译参数、输出的目标文件名称和路径。

e)访问共享目录需要的账号信息。

步骤4、工作者收到编译命令,并反馈编译请求,使用不同的端口下载代码到本地编译目录。

步骤5、工作者进行编译。

步骤6、工作者将编译结果传送到指定地址。

步骤7、工作者通知管理者,已完成编译和具体的成功、失败信息。

本发明为C/S架构,管理者负责整体的编译过程,包括使用什么源文件、使用何种参数、命令发送到哪些工作者及具体的下载上传目录地址,这些信息将通过配置文件提供。工作者作为服务器运行在arm64、mips64、mips64el、amd64等多个不同CPU架构的机器上,负责完成不同平台程序的实际编译工作,编译时依赖管理者提供的共享目录访问账户信息、源文件信息、编译配置和参数、编译脚本或编译命令。工作者设置为开机启动,服务监听端口从配置文件中读取,不同工作者可使用不同的端口。共享目录可位于任何可访问的系统内,支持smb协议,可扩展支持ftp、ftps等协议,共享目录所在系统需要能读写版本管理系统,用于下载、更新源文件等,提交编译结果文件进行管控。

在共享目录源码配置完成,用户触发编译请求后,管理者首先解析配置文件,读取所有可用的工作者地址信息如IP、端口,接着解析所有需要编译的任务信息列表,对每一个任务包含对应的工作者地址信息,目标程序名,平台和操作系统名称等,并逐一发送到对应的工作者。

工作者接收到编译命令后,首先解析出需要编译的程序列表,及每个程序编译需要的信息,如编译脚本名、编译脚本工作目录、输出目标程序文件名、编译脚本是否需要附加参数。接着根据提取出的smb共享目录账号信息到指定的位置下载所有源码,源码位置也在编译命令中提供。

编译过程中对每一个程序创建一个线程,切换到需要的工作目录,使用对应的参数调用编译脚本,编译完成后将目标文件复制到统一的临时目录。系统等待所有编译线程结束,检查是否所有需要的目标都成功完成编译,并上传结果文件到共享目录中的结果保存目录。

下载源码、编译各个目标、上传结果文件过程中会汇报具体的进度、状态、结果信息到管理者,管理者收到反馈后显示给用户。

参照附图2,管理者启动后更新源码,触发编译请求,立即读取并解析配置,配置中包含共享目录、编译信息、编译任务和工作者信息,接着检查配置是否失效,如工作者IP地址等不能为空。如果配置有效,读取所有编译命令,将遍历所有的编译任务,新建线程合成编译命令后发送到对应的工作者,并等待工作者信息反馈,包括具体目标的编译进度和最终整体的编译结果,完毕后退出,如果配置无效,则显示编译状态和结果后退出。

参照附图3,工作者负责处理实际的编译任务,启动后,读取并解析配置,启动服务监听,表现为一个循环接收编译请求命令的服务,收到服务后新建线程处理请求。每次编译都会重新下载代码到新建的临时目录,目录使用唯一的UUID方式命名,避免缓存或遗留文件导致的编译问题。编译开始前会进行预处理,如修改脚本填充sudo密码避免因需要用户交互而阻塞,为编译脚本添加可执行权限,然后调用编译命令并等待完成,待所有目标编译完成后进行上传和具体的结果信息反馈。目标文件的md5信息及相关编译日志文件也会上传。

配置文件、管理者和工作者交互报文都使用json格式,主要数据结构如下:

common节点:为访问共享目录需要的账号信息,及源码和输出结果保存路径。

Server节点:监听端口信息,全局通用的JDK路径、sudo密码等。

compile_info节点:配置不同程序产品编译需要的信息,如脚本路径、脚本名、结果文件名、编译参数等,为数组格式,可配置所有可能需要编译的程序,实际需要编译的程序在compile_task节点中指定,可减少对配置数据的修改。

compile_tasks节点:为所有需要编译的任务信息,子元素内容包含需要编译的产品,在targets字段中指定,格式为逗号分隔的列表,可指定compile_info节点中的部分或全部产品、目标。

管理者实现为CompileManager类,依赖Config类实现读取配置,主要方法说明:

requestCompile:请求编译所有配置中的任务

checkConfig:检查配置是否包含无效值、空值

requestCompile(JSONObject):发送编译命令到具体的工作者,会调用多次。

Config类负责打开、读取配置,提供通用的常量字符串定义,主要方法说明:

Config():构造函数,实现打开配置文件、读取配置功能

getInstance():获取Config类的单例对象

HashSetconvertToTargets(String target):将字符串形式的目标列表转为set,去除重复值、空值

getItemValue(JSONObject jobj,String key):从json对象中根据key读取key对应的值。

SmbTool类负责实现共享目录文件的下载和上传操作,主要方法说明:

SmbTool(String domainName,String userName,String passwd):构造函数,提供访问账号信息。

mkDir(String remoteUrl,String dirName):在指定远程目录下创建新目录,用于上传目录

SmbFile getSmbFile(String remoteUrl):打开远程文件,返回SmbFile对象

boolean downloadFile(SmbFile remoteFile,String localDirPath,StringbaseUrl):将remoteFile文件,或remoteFile目录内的所有文件和目录,下载到localDirPath指定的目录内。

boolean uploadFile(final File localFile,final String remoteUrl,finalString localBasePath):

将localFile目录内的所有文件和目录,上传到remoteUrl指定的目录内。

CompileWorker类实现工作者相关的功能,依赖CompileInfo和WorkThread类,CompileInfo用于表示具体程序需要的编译信息,与compile_tasks子元素对应。WorkThread用于在线程中调用编译相关的函数、socket信息结束发送。CompileWorker类主要方法说明:

void main(String[]args):用于启动监听,创建线程处理请求

String getSrcTmpPath():获取临时存放代码的目录

HashSetparseCompileInfo(JSONObject jobj):从json配置对象中解析出CompileInfo集合

HashSetcheckOutput(HashSetci,HashSettargets,String outputPath):返回编译失败的目标文件列表

void compile(HashSetci,HashSettargets,StringsrcTmpPath,WorkThread thread):编译所有目标并等待结束

void compile(String target,String buildScriptPath,StringbuildScriptName,String buildScriptParam,String outputFilePath,StringoutputFilename):编译具体的目标程序。

在不同平台上搭建Jenkins从节点,在管理节点配置不同的编译任务,触发任务时将编译命令发送到不同的从节点进行处理,缺点是需要有Jenkins的使用和管理经验,部署复杂,依赖tomcat等服务,优点是不需要编码实现。

使用QEMU工具在单台机器上模拟运行Arm64、Mips64、Amd64等不同平台的系统,实现和交叉编译等效的功能,缺点是难以保证模拟系统和实际系统环境一致,对编译结果文件需要进行较多测试,编译速度可能比较慢,同样需要进行源码下载及编译结果上传等,优点是不需要多台机器即可完成编译。

尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号