【发明内容】
基于此,有必要提供一种能得到准确的代码版本的软件程序的基线版本管理方法。
一种软件程序的基线版本管理方法,包括以下步骤:
对二进制程序进行源码解析,记录所述二进制程序对应的源码文件;
监控二进制程序的上线单的状态;
根据所述上线单的状态查找二进制程序对应的源码文件,对所述查找到的源码文件的基线版本号进行更新。
在优选的实施例中,所述源码文件包括cpp文件及所述cpp文件引用的hpp文件;所述对二进制程序进行源码解析,记录二进制程序对应的源码文件的步骤包括:
执行指令,得到编译中间结果;
对所述编译中间结果进行扫描,得到cpp文件组成及其引用的hpp文件组成;
将所述得到的cpp文件组成、hpp文件组成与二进制程序的对应关系记录到二进制源码解析对应表中。
在优选的实施例中,所述根据所述上线单的状态查找二进制程序对应的源码文件,对所述查找到的源码文件的基线版本号进行更新的步骤包括:
当所述上线单的状态为全面上线成功时,查找二进制程序对应的源码文件,从版本管理服务器获取所述源码文件的当前版本号,将所述源码文件的当前版本号记录为所述源码文件对应的当前基线版本号。
在优选的实施例中,所述对所述源码文件的基线版本号进行更新的步骤包括:
当所述上线单的状态为全面回退时,查找二进制程序对应的源码文件,将所述源码文件的当前基线版本号修改为上一版本号。
在优选的实施例中,所述方法还包括:创建基线版本数据表,所述基线版本数据表用于记录源码文件与源码文件的当前基线版本号、至少一个历史基线版本号的对应关系。
此外,还有必要提供一种能得到准确的代码版本的软件程序的基线版本管理系统。
一种软件程序的基线版本管理系统,包括:
源码解析模块,用于对二进制程序进行源码解析,记录所述二进制程序对应的源码文件;
监控模块,用于监控二进制程序的上线单的状态;
基线版本管理模块,用于根据所述上线单的状态查找二进制程序对应的源码文件,对所述查找到的源码文件的基线版本号进行更新。
在优选的实施例中,所述源码文件包括cpp文件及所述cpp文件引用的hpp文件;所述源码解析模块包括:
指令执行模块,用于执行指令,得到编译中间结果;
扫描模块,用于对所述编译中间结果进行扫描,得到cpp文件组成及其引用的hpp文件组成;
记录模块,用于将所述得到的cpp文件组成、hpp文件组成与二进制程序的对应关系记录到二进制源码解析对应表中。
在优选的实施例中,所述基线版本管理模块用于当所述上线单的状态为全面上线成功时,查找二进制程序对应的源码文件,从版本管理服务器获取所述源码文件的当前版本号,将所述源码文件的当前版本号记录为所述源码文件对应的当前基线版本号。
在优选的实施例中,所述基线版本管理模块还用于当所述上线单的状态为全面回退时,查找二进制程序对应的源码文件,将所述源码文件的当前基线版本号修改为上一版本号。
在优选的实施例中,基线版本数据表创建模块,用于创建基线版本数据表,所述基线版本数据表用于记录源码文件与源码文件的当前基线版本号、至少一个历史基线版本号的对应关系。
上述软件程序的基线版本管理方法及系统,通过监控二进制程序的上线单的状态,根据上线单的状态对上线的二进制程序对应的源码文件的基线版本号进行更新,由于对二进制程序的源码文件的基线版本号进行了有效的管理,因此能够得到准确的代码版本。
【具体实施方式】
本发明通过对二进制程序进行源码解析,记录二进制程序对应的源码文件,由于在二进制程序的上线过程中,二进制程序的上线单的状态可以进行修改,通过监控二进制程序的上线单的状态,根据上线单的状态查找到二进制程序对应的源码文件,对查找到的这些源码文件的基线版本号进行更新。由于根据二进制程序的上线单的状态的不同,会对二进制程序对应的源码文件的基线版本号进行更新,从而对二进制程序的源码文件的基线版本号进行了有效管理,通过更新的基线版本号能够得到准确的代码版本。
在一个实施例中,如图1所示,一种软件程序的基线版本管理方法,包括以下步骤:
步骤S10,对二进制程序进行源码解析,记录二进制程序对应的源码文件。
在一个实施例中,上线的二进制程序为由一系列c/c++源代码编译生成的,例如.so文件、.cgi文件等。这里的c/c++源代码包括cpp文件和hpp文件,其中cpp文件为由c++语言编写的源代码文件(即源码文件),而hpp文件为cpp文件的头文件。本实施例中,对二进制程序进行源码解析包括对cpp文件的解析和对hpp文件的解析。
在一个实施例中,如图2所示,步骤S10的具体过程为:
步骤S102,执行指令,得到编译中间结果。
步骤S104,对编译中间结果进行扫描,得到cpp文件组成及其引用的hpp文件组成。
解析cpp文件时,可通过Linux GNU的make工具加上指定参数生成二进制编译的详情(即编译中间结果),该指令为:make-n-B-i-k目标文件程序名。其中,目标程序文件名是指需要进行源码解析的二进制程序的文件名,例如libA.so、Axx.cgi等;-n表示打印模拟编译过程,但不真正执行编译;-B表示所有的目标都需要更新编译;-i表示在执行时忽略所有的错误;-k表示出错也不停止运行。运行上述指令后,得到编译中间结果,例如形如“g++-g-I/path1-I/path2-I.../pathN-o xxxxx.o的文本。
对上述得到的文本进行扫描,得到完整的cpp文件组成。下面以一个.so的二进制程序为例说明上述扫描过程。通过执行指令make-n-B libtest.so,得到输出文本。通过固定特征的分隔符例如“\r\n”将得到的文本分隔为若干行,每一行则是一个.o文件(对象文件)的生成过程;依次循环上述得到的所有文本行,通过正则匹配判断是否存在.cpp/.c文件,如果存在,则正则匹配该行,并判断是否有生成.o文件,如果有生成.o文件,则记录.cpp/.c与.o的映射关系,否则循环到下一行;如果正则匹配判断到不存在.cpp/.c文件,则进一步判断是否存在.so文件,如果存在.so文件,则正则匹配出当前行.so文件包含的所有.o文件,并记录.so与.o的映射关系;通过上述两个映射关系,即可得到.so与.cpp/.c的映射关系,从而得到.so文件的完整的cpp文件组成。
解析hpp文件时,可通过Linux g++编译器加上指定参数得到cpp/c源码引用的所有.h头文件,具体指令如下:g++-MM xxxx.cpp|xxxx.c-I1-I2-I3。其中,-MM表示指定cpp/c源码引用到的非系统定义的h定义文件;-I指定了编译此源程序引用到的h文件路径。运行上述指令后,得到编译中间结果,例如形如“xxxx.0:xxxx.cpp
hpp1\
hpp2\
hpp3\
hpp4”的文本。
对上述得到的文本进行扫描,即可得到完整cpp文件所引用到的hpp文件组成。该扫描过程为:通过固定特征的分隔符例如“\r\n”将得到的文本分隔为若干行;依次扫描每一行,去掉空行和末尾\n和一些无用的中间过程信息;对每一行,执行:如果本行包含有多个.h/.hpp文件,则将多个.h/.hpp文件拆分,分为多行;如果本行包含../相对路径,则恢复该文件的绝对路径;如果本行包含./的相对路径,则恢复该文件的绝对路径;如果本行包含/当前路径,则恢复该文件的绝对路径。扫描所有的文本行后,将所有的.h/.hpp文件排重,则得到cpp文件所引用到的.h/.hpp文件集合。
在一个实施例中,每天按照固定频率(例如每隔3小时)去扫描二进制程序的文件组成,每次扫描后得到的cpp文件和hpp文件通过插入指令和删除指令更新到数据库中。例如前一次对二进制程序liba.so进行扫描得到文件组成为a.cpp、b.cpp和c.cpp,当前扫描得到的文件组成为a.cpp、b.cpp和d.cpp,由于a.cpp和b.cpp在前一次扫描得到的文件组成中已存在,因此不需要对a.cpp和b.cpp进行处理。而d.cpp在前一次扫描得到的文件组成中不存在,因此对d.cpp需执行插入指令(即Insert指令),将d.cpp插入。另由于当前扫描得到的文件组成中不存在c.cpp,因此需要对c.cpp执行删除指令(即Delete指令),将c.cpp删除,并更新数据库。
步骤S106,将得到的cpp文件组成、hpp文件组成与二进制程度的对应关系记录到二进制源码解析对应表中。
在一个实施例中,二进制源码解析对应表如表1所示:
表1
表1中,记录了对二进制程序Libtest.so进行源码解析后所得到的所有cpp文件及其引用的hpp文件。
步骤S20,监控二进制程序的上线单的状态。
二进制程序上线是指将编译产生的二进制程序发布到用户访问的互联网。每个二进制程序的上线过程可采用上线单来记录,例如记录为“张三在12:00提单A需要上线libA.so、Axx.cgi”,其中,libA.so、Axx.cgi为需要上线的二进制程序。在二进制程序的上线过程中,用户根据上线的情况来修改上线单的状态。
二进制程序的上线单的状态包括提单、全面上线中、全面上线成功、全面上线失败和全面回退。其中,提单是指提交上线单;全面上线中是指二进制程序处于正在上线的状态,由于大部分互联网站点都是由若干台对等服务器组成,需要一次将二进制程序从若干台服务器逐个上线,因此上线是有时间过程的;全面上线成功是指二进制程序都上线成功;全面上线失败是指二进制程序上线失败;全面回退是指二进制程序上线失败后,需要将上线的二进制程序撤离用户访问的互联网,并将运行在互联网的二进制程序改为原来的版本。
步骤S30,根据上线单的状态查找二进制程序对应的源码文件,对查找到的源码文件的基线版本号进行更新。
在一个实施例中,上述方法还包括:创建基线版本数据表,基线版本数据表中记录了源码文件与源码文件的当前基线版本号、至少一个历史基线版本号的对应关系。在一个实施例中,基线版本数据表中记录的字段如表2所示,其中记录了两个最近的历史基线版本号:
表2
源码文件名 |
当前基线版本号 |
历史基线版本号1 |
历史基线版本号2 |
在一个实施例中,当二进制程序全面上线成功后,用户修改上线单的状态为全面上线成功,当监控到上线单的状态为全面上线成功时,则立即查找二进制程序对应的源码文件,从版本管理服务器获取源码文件的当前版本号,将源码文件的当前版本号记录为源码文件对应的当前基线版本号。
本实施例中,从上述生成二进制源码解析对应表中查找全面上线成功的二进制程序所对应的源码文件。上述实施方式的版本管理服务器为svn(subversion,一种版本管理工具)服务器,源代码可通过svn服务进行管理,svn服务是开源免费的,在svn服务器上记录了源代码的各种版本。例如,A.cpp文件在2011年1月1日被张三上传及创建于svn服务器,svn服务器为其分配了版本号为V1,在2011年2月23日由被李四修改过并上传到svn服务器,svn服务器为其分配了版本号V2。本实施例中,从svn服务器获取到源码文件的当前版本号,将获取到的当前版本号记录为源码文件对应的当前基线版本号。本实施例中,将获取到的当前版本号更新到基线版本数据表中的当前基线版本号字段,并相应更新两个历史基线版本号。
在另一个实施例中,当二进制程序全面上线失败后,需要将当前上线的二进制程序撤离用户访问的互联网,并改为原版本的二进制程序,用户则将上线单的状态修改为全面回退,即回退到上一版本的二进制程序。当监控到上线单的状态为全面回退时,查找二进制程序对应的源码文件,将该源码文件的当前基线版本号修改为上一版本号。
本实施例中,查找上述生成的二进制程序解析对应表中二进制程序对应的源码文件,将基线版本数据表中该源码文件对应的当前基线版本号修改为上一版本号。上一版本号可设置为历史基线版本号1或历史基线版本号2,这样,将当前基线版本号直接修改为历史基线版本号1或历史基线2即可,同时更新基线版本数据表中的历史基线版本号。
如图3所示,一种软件程序的基线版本管理系统,包括源码解析模块10、监控模块20和基线版本管理模块30,其中:
源码解析模块10用于对二进制程序进行源码解析,记录二进制程序对应的源码文件。
在一个实施例中,上线的二进制程序为由一系列c/c++源代码编译生成的,例如.so文件、.cgi文件等。这里的c/c++源代码包括cpp文件和hpp文件,其中cpp文件为由c++语言编写的源代码文件(即源码文件),而hpp文件为cpp文件的头文件。本实施例中,对二进制程序进行源码解析包括对cpp文件的解析和对hpp文件的解析。
在一个实施例中,源码文件包括cpp文件及cpp文件引用的hpp文件。如图4所示,源码解析模块10包括指令执行模块110、扫描模块120和记录模块130,其中:
指令执行模块110用于执行指令,得到编译中间结果。
扫描模块120用于对编译中间结果进行扫描,得到cpp文件组成及其引用的hpp文件组成。
源码解析模块10在解析cpp文件时,可通过Linux GNU的make工具加上指定参数生成二进制编译的详情(即编译中间结果)。指令执行模块110执行的指令为:make-n-B-i-k目标程序名。其中,目标程序文件名是指需要进行源码解析的二进制程序的文件名,例如libA.so、Axx.cgi等;-n表示打印模拟编译过程,但不真正执行编译;-B表示所有的目标都需要更新编译;-i表示在执行时忽略所有的错误;-k表示出错也不停止运行。运行上述指令后,得到编译中间结果,例如形如“g++-g-I/path1-I/path2-I.../pathN-o xxxxx.o”的文本。扫描模块120对该文本进行扫描,得到完整的cpp文件组成。
源码解析模块10解析hpp文件时,可通过Linux g++编译器加上指定参数得到cpp/c源码引用的所有.h头文件。指令执行模块110执行的指令如下:g++-MM xxxx.cpp|xxxx.c-I1-I2-I3。其中,-MM表示指定cpp/c源码引用到的非系统定义的h定义文件;-I指定了编译此源程序引用到的h文件路径。运行上述指令后,得到编译中间结果,例如形如“xxxx.0:xxxx.cpp
hpp1\
hpp2\
hpp3\
hpp4”的文本。扫描模块120对得到的文本进行扫描,即可得到完整cpp文件所引用到的hpp文件组成。关于cpp文件和hpp文件的扫描算法参照上文所述。
在一个实施例中,扫描模块120可每天按照固定频率(例如每隔3小时)去扫描二进制程序的文件组成,每次扫描后得到的cpp文件和hpp文件通过插入指令和删除指令更新到数据库中。例如前一次对二进制程序liba.so进行扫描得到文件组成为a.cpp、b.cpp和c.cpp,当前扫描得到的文件组成为a.cpp、b.cpp和d.cpp,由于a.cpp和b.cpp在前一次扫描得到的文件组成中已存在,因此不需要对a.cpp和b.cpp进行处理。而d.cpp在前一次扫描得到的文件组成中不存在,因此对d.cpp需执行插入指令(即Insert指令),将d.cpp插入。另由于当前扫描得到的文件组成中不存在c.cpp,因此需要对c.cpp执行删除指令(即Delete指令),将c.cpp删除,并更新数据库。
记录模块130用于将得到的cpp文件组成、hpp文件组成与二进制程度的对应关系记录到二进制源码解析对应表中。
在一个实施例中,二进制源码解析对应表如表1所示:
表1中,记录了对二进制程序Libtest.so进行源码解析后所得到的所有cpp文件及其引用的hpp文件。
监控模块20用于监控二进制程序的上线单的状态。
二进制程序上线是指将编译产生的二进制程序发布到用户访问的互联网。每个二进制程序的上线过程可采用上线单来记录,例如记录为“张三在12:00提单A需要上线libA.so、Axx.cgi”,其中,libA.so、Axx.cgi为需要上线的二进制程序。在二进制程序的上线过程中,用户根据上线的情况来修改上线单的状态。
二进制程序的上线单的状态包括提单、全面上线中、全面上线成功、全面上线失败和全面回退。其中,提单是指提交上线单;全面上线中是指二进制程序处于正在上线的状态,由于大部分互联网站点都是由若干台对等服务器组成,需要一次将二进制程序从若干台服务器逐个上线,因此上线是有时间过程的;全面上线成功是指二进制程序都上线成功;全面上线失败是指二进制程序上线失败;全面回退是指二进制程序上线失败后,需要将上线的二进制程序撤离用户访问的互联网,并将运行在互联网的二进制程序改为原来的版本。
基线版本管理模块30用于根据上线单的状态查找二进制程序对应的源码文件,对查找到的源码文件的基线版本号进行更新。
在一个实施例中,上述系统还包括:基线版本数据表创建模块(图中未示出),用于创建基线版本数据表,基线版本数据表中记录了源码文件与源码文件的当前基线版本号、至少一个历史基线版本号的对应关系。在一个实施例中,基线版本数据表中记录的字段如表2所示,其中记录了两个最近的历史基线版本号。
在一个实施例中,当二进制程序全面上线成功后,用户修改上线单的状态为全面上线成功。当监测模块20监控到上线单的状态为全面上线成功时,则通知基线版本管理模块30。基线版本管理模块30用于查找二进制程序对应的源码文件,从版本管理服务器获取源码文件的当前版本号,将源码文件的当前版本号记录为源码文件对应的当前基线版本号。
本实施例中,基线版本管理模块30从上述生成二进制源码解析对应表中查找全面上线成功的二进制程序所对应的源码文件。上述实施方式的版本管理服务器为svn(subversion,一种版本管理工具)服务器,源代码可通过svn服务进行管理,svn服务是开源免费的,在svn服务器上记录了源代码的各种版本。例如,A.cpp文件在2011年1月1日被张三上传及创建于svn服务器,svn服务器为其分配了版本号为V1,在2011年2月23日由被李四修改过并上传到svn服务器,svn服务器为其分配了版本号V2。本实施例中,从svn服务器获取到源码文件的当前版本号,将获取到的当前版本号记录为源码文件对应的当前基线版本号。本实施例中,将获取到的当前版本号更新到基线版本数据表中的当前基线版本号字段,并相应更新两个历史基线版本号。
在另一个实施例中,当二进制程序全面上线失败后,需要将当前上线的二进制程序撤离用户访问的互联网,并改为原版本的二进制程序,用户则将上线单的状态修改为全面回退,即回退到上一版本的二进制程序。当监控模块20监控到上线单的状态为全面回退时,则通知基线版本管理模块30。基线版本管理模块30用于查找二进制程序对应的源码文件,将该源码文件的当前基线版本号修改为上一版本号。
本实施例中,基线版本管理模块30用于查找上述生成的二进制程序解析对应表中二进制程序对应的源码文件,将基线版本数据表中该源码文件对应的当前基线版本号修改为上一版本号。上一版本号可设置为历史基线版本号1或历史基线版本号2,这样,将当前基线版本号直接修改为历史基线版本号1或历史基线2即可,同时更新基线版本数据表中的历史基线版本号。
上述软件程序的基线版本管理方法及系统中,对二进制程序进行源码解析时,通过执行简单的指令能够得到编译中间结果,对该中间结果进行扫描,能够快速获取到二进制程序对应的源码文件。由于可以按照固定的频率进行扫描,因此能够定时更新二进制程序的源码文件组成。在将二进制程序上线的过程中,通过监控二进制程序的上线单的状态,在用户修改上线单的状态时,能够立即根据上线单的状态更新源码文件的基线版本号,通过基线版本数据表对源码文件的基线版本进行了有效的管理,使得在软件的并行开发模式下,能够获取到准确的代码版本。
在处于一个大项目的子项目拆分中,通过上述软件程序的基线版本管理方法及系统,能够方便的各自获取到子项目的代码,因此可以布置一个子项目的基线版本环境。此外,通过指定版本的源码文件(如cpp文件、hpp文件),可以通过编译工具按照一定顺序编译出来整套二进制程序系统,例如编译CGI(Common Gateway Interface,通用网关接口,是实现web端http协议交互的一种程序方法,是由一系列源代码编译出来的二进制程序)程序组时,通过上述软件程序的基线版本管理方法及系统,能够获取到准确的代码版本,因此利用上述软件程序的基线版本管理方法及系统,能够部署一个全新的开发环境和测试环境。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。