掌桥专利:专业的专利平台
掌桥专利
首页

变更程序识别方法及装置

文献发布时间:2023-06-19 11:26:00


变更程序识别方法及装置

技术领域

本发明涉及云计算技术领域,具体地,涉及一种变更程序识别方法及装置。

背景技术

持续集成是能快速实现价值交付的重要实践。持续集成会自动地从代码托管仓库下载源代码,然后编译、部署到测试环境,自动执行代码检查和自动化测试案例,最后快速准确反馈结果,减少了传统的手工重复操作,可大大减少编译、部署和执行测试的时间,更快地获取软件质量报告。

存储过程是在大型数据库系统中一组为了完成特定功能的SQL语句集。它是数据库的一种对象,存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并赋予参数来执行它。在开发实践中,开发人员一般会把多个具有类似功能的存储过程放在一个包体文件中,作为一个程序文件提交到代码托管仓库,然后编译部署到数据库里。一个开发团队可能有多个开发人员修改存储过程,当要获取最新的存储过程变更程序清单时,一般都要手工登录ORACLE数据库服务器查看当前软件版本相对基线(上一软件版本)的代码变化情况。随着包体文件中代码量的增加,对全量代码做静态代码检查和执行自动化测试案例所耗费的时间越来越长,开发人员获取软件质量报告的等待时间也随着全量代码的增加而增加,获取软件质量报告的耗时长且不准确。而且现在软件开发公司会有多个版本同时开发,当前版本的基线也在不断变化,每次修改代码后都需要人工重新做一次比较,非常耗时。对于大开发团队的管理人员来说,准确获取到存储过程变更程序然后重点守护变更程序成为了保证软件质量的重要手段。

发明内容

本发明实施例的主要目的在于提供一种变更程序识别方法及装置,快速精准识别变更程序,进而保证软件质量。

为了实现上述目的,本发明实施例提供一种变更程序识别方法,包括:

获取当前版本源代码和历史版本源代码;

根据当前版本源代码和历史版本源代码确定变更行号;

确定历史版本源代码的各存储过程区间;

将变更行号分别与各存储过程区间匹配,根据匹配结果输出变更行号对应的存储过程。

本发明实施例还提供一种变更程序识别装置,包括:

源代码获取模块,用于获取当前版本源代码和历史版本源代码;

变更行号模块,用于根据当前版本源代码和历史版本源代码确定变更行号;

存储过程区间模块,用于确定历史版本源代码的各存储过程区间;

变更输出模块,用于将变更行号分别与各存储过程区间匹配,根据匹配结果输出变更行号对应的存储过程。

本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上并在处理器上运行的计算机程序,处理器执行计算机程序时实现所述的变更程序识别方法的步骤。

本发明实施例还提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现所述的变更程序识别方法的步骤。

本发明实施例的变更程序识别方法及装置先根据当前版本源代码和历史版本源代码确定变更行号,然后根据变更行号与历史版本源代码的各存储过程区间的匹配结果输出变更行号对应的存储过程,可以快速精准识别变更程序,进而保证软件质量。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明一实施例中变更程序识别方法的流程图;

图2是S101的流程图;

图3是本发明实施例中S102的流程图;

图4是本发明一实施例中代码仓库度量数据库的数据表示意图;

图5是本发明另一实施例中代码仓库度量数据库的数据表示意图;

图6是本发明又一实施例中代码仓库度量数据库的数据表示意图;

图7是本发明实施例中的存储过程数据表示意图;

图8是本发明实施例中变更程序识别装置的结构框图;

图9是本发明实施例中计算机设备的结构框图。

具体实施方式

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

本领域技术人员知道,本发明的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。

鉴于现有技术耗时长且容易出错,本发明实施例提供一种变更程序识别方法,可以快速精准识别变更程序,进而保证软件质量。以下结合附图对本发明进行详细说明。

本发明可以自动识别当前软件版本相对上一软件版本变更的存储过程,定时去代码托管仓库里获取不同代码分支的源码,然后基于最新的源码根据一定算法做比较,得到最新的变更程序清单。开发人员获取到变更程序清单后会重点关注程序质量,编写自动化测试案例和执行静态代码检查。管理人员获取到软件质量报告后,根据该变更程序清单找到程序修改时间和对应的程序维护人,通知程序维护人关注自己修改的程序质量,落实责任主体。

图1是本发明一实施例中变更程序识别方法的流程图。如图1所示,变更程序识别方法包括:

S101:获取当前版本源代码和历史版本源代码。

一实施例中,执行S101之前还包括:

根据基线获取当前程序文件和历史程序文件。

图2是S101的流程图。如图2所示,S101包括:

S201:获取当前程序文件的哈希值和文件路径,获取历史程序文件的哈希值和文件路径。

具体实施时,可以先从代码仓库度量数据库获取近期提交的程序文件记录。代码仓库度量数据库是包含了每个程序文件每次提交信息的ORACLE数据库。开发人员提交代码后,代码仓库度量数据库会记录下本次提交的信息,包括版本库、代码分支、程序文件全路径、提交时间、程序作者邮箱、程序作者和入库时间等信息,并把信息存入数据库的一张表里。每当有新提交代码时,该度量数据库会自动记录提交信息,并将数据库服务器系统时间作为这笔记录的入库时间。本发明会增量从度量数据库里获取最近新增的提交信息(当前程序文件的哈希值和文件路径),并保存当前最大的入库时间,作为下一次拉取的基线,从而实现增量拉取。图4是本发明一实施例中代码仓库度量数据库的数据表示意图。图4中的箭头表示当前拉取的基线。

接着,本发明遍历新增的每条记录,使用版本库和程序文件全路径等信息查找当前程序文件之前版本的软件状态。图5是本发明另一实施例中代码仓库度量数据库的数据表示意图,展示了程序文件BTHPAMC2_Sql.sql近期的提交信息。在查找2020年12月版变更时(图5中的代码分支2012B所在行的数据为当前程序文件的数据),需要查找之前版本(历史程序文件)的最新状态以获取历史程序文件的哈希值和文件路径。框中的数据表示程序之前版本的最新状态(图5中的代码分支2011B所在行的数据为历史程序文件的数据)

S202:根据当前程序文件的哈希值和文件路径获取当前版本源代码。

具体实施时,可以从代码托管服务器下载代码,命令格式为:

git show提交hash:程序文件全路径。

图6是本发明又一实施例中代码仓库度量数据库的数据表示意图。图6中第一行数据为当前程序文件的数据。图6中第二行数据为历史程序文件的数据。以图6中的数据为例,从代码托管服务器下载当前版本源代码为:

git show 40c6b538083fcfc1de346df3dc12798a0aa5a0c4:

PMSDB/PTCE2011B/data/ZhuHai/SAES/BTHPAMC2_Sql.sql.

S203:根据历史程序文件的哈希值和文件路径获取历史版本源代码。

以图6中的数据为例,从代码托管服务器下载历史版本源代码为:

40c6b538083fcfc1de346df3dc1279009MQ5a0c4:

PMSDB/PTCE2011B/data/ZhuHai/SAES/BTHPAMC2_Sql.sql.

S102:根据当前版本源代码和历史版本源代码确定变更行号。

图3是本发明实施例中S102的流程图。如图3所示,S102包括:

S301:根据预设注释字符删除当前版本源代码和历史版本源代码中的注释代码。

在执行S301之前,还包括:

解析包体源代码,获取存储过程信息,遍历每一行源码,去掉空格,判断程序是否以CREATE OR REPLACE PACKAGE BODY开头,如果是则执行S301,否则源代码不是真实包体程序,直接结束。

本发明实施例的注释代码如下:

SELECT MAX(ID)INTO CNT FROM TABLE_A;--行注释方式1

/*行注释方式2*/

SELECT MAX(ID)INTO CNT FROM TABLE_A;

SELECT MAX(A.ID)INTO CNT FROM/*TABLE_A A,*/TABLE_B B;--部分注释

/*

INSERT INTO TABLE_A(ID,NAME,AGE)VALUES('001','张三',18);

SELECT MAX(A.ID)INTO CNT FROM TABLE_A A;

DELETE FROM TABLE_A;

*/

如上述代码所示,Oracle的存储过程注释方式有行注释和块注释。行注释有两种方式,可以通过标志”--”或标志/**/注释代码。标志”--”表示该标志后的源码都会被注释,而被/**/标志包含的代码都被注释。块注释可以通过标志/**/多行注释。

S302:根据删除注释代码后的当前版本源代码和删除注释代码后的历史版本源代码确定变更行号。

具体实施时,可以在代码托管服务器上运行命令获取当前版本源代码和历史版本源代码的文本差异,从差异文本里获取到变更块的开始行号和结束行号。命令格式为:

git diff-U0-w历史版本源代码的提交hash当前版本源代码的提交hash--程序文件全路径。

本发明实施例的差异文本代码如下:

diff--git a/ICMS/DB/program/pacakge/OAS_PKG_WF_RU.sql b/ICMS/DB/program/pacakge/OAS_PKG_WF_RU.sql

index 2dd6428..e78eb97 100644

---a/ICMS/DB/program/pacakge/OAS_PKG_WF_RU.sql

+++a/ICMS/DB/program/pacakge/OAS_PKG_WF_RU.sql

@@-1694+1694,2@@CREATE OR REPLACE PACKAGE BODY oas_pkg_wf_r u IS

-INTO v_count

+INTO v_count from(

+select a.task_id

@@-1697+1698,7@@CREATE OR REPLACE PACKAGE BODY oas_pkg_wf_r u IS

-AND a.proc_inst_id=i_inst_id;

+AND a.proc_inst_id=i_inst_id

+union all

+select a.task_id

+from oas_wf_ru_task_bak a

+WHERE a.execution_id<>a.proc_inst_id

+AND a.proc_inst_id=i_inst_id

+);

@@-1988+1995@@CREATE OR REPLACE PACKAGE BODY oas_pkg_wf_ru IS

-

+V_COUNT NUMBER(4);

如上述代码所示,@@-1694+1694,2@@表示与历史版本源代码的第1694行相比,变更块1从差异文本的第1694行开始变更,连续2行有变更。变更块1的变更行号为第1694行;

@@-1697+1698,7@@表示与历史版本源代码的第1697行相比,变更块2从差异文本的第1698行开始变更,连续7行有变更。变更块2的变更行号为第1697行。

@@-1988+1995@@表示与历史版本源代码的第1988行相比,变更块3从差异文本的第1995行开始变更,只有1行有变更。变更块3的变更行号为第1988行。

S103:确定历史版本源代码的各存储过程区间。

一实施例中,S103包括:

确定历史版本源代码的各存储过程开始行号和各存储过程结束行号,根据各存储过程开始行号和各存储过程结束行号确定历史版本源代码的各存储过程区间。

具体实施时,存储过程源码的开始标志是PROCEDURE XXX_NAME或FUNCTION XXX_NAME,结束标志是END XXX_NAME。遍历历史版本源代码的每一行代码即可识别出存储过程开始行号和存储过程结束行号。

S104:将变更行号分别与各存储过程区间匹配,根据匹配结果输出变更行号对应的存储过程。

具体实施时,当变更行号与存储过程区间匹配时(变更行号在存储过程开始行号和存储过程结束行号之间),表明该变更行号对应该存储过程,该存储过程存在变更。

一实施例中,执行S104之后还包括:根据当前程序文件更新基线。

具体实施时,确定当前程序文件入库时间(当前最大的入库时间)为下一次拉取的基线。

图1所示的变更程序识别方法的执行主体可以为计算机。由图1所示的流程可知,本发明实施例的变更程序识别方法先根据当前版本源代码和历史版本源代码确定变更行号,然后根据变更行号与历史版本源代码的各存储过程区间的匹配结果输出变更行号对应的存储过程,可以快速精准识别变更程序,进而保证软件质量。

图7是本发明实施例中的存储过程数据表示意图。如图7所示,执行S103之后,可以将变更行号对应的存储过程(存储过程变更清单)存储在Oracle数据库一张表中。调用方可以通过http请求存储过程变更清单查询接口,获取存储过程变更清单。请求的输入参数是版本库和当前软件版本号。

其中,http接口示例如下:

http://ip:端口/icbc/xmb/pmo/service/prodetail/QueryChangeProdAction/qryProgDetail?repo=ccba/ccba&codeBranch=202005。

存储过程变更清单查询接口的返回数据示例如下:

{"progList":{"fileName":"pckg_auto_contract_detail_qry.sql","filePath":"Cmp_IAAS-DB/insu/PROGRAM/IAAS_CAR_INSU/pckg_auto_contract_detail_qry.sql",

"dept":"开发一部","app":"F-CCBA","version":"202005","progName":"PCKG_AUTO_CONTRACT_DETAIL_QRY.PRO_AUTO_CONTRACT_DETAIL_QRY","changeTime":"20200320092300"

,"repo":"ccba/ccba","authorName":"张三"},"message":"成功","returnCode":"0","totalNum":1}

本发明实施例的具体流程如下:

1、根据基线获取当前程序文件和历史程序文件。

2、获取当前程序文件的哈希值和文件路径,获取历史程序文件的哈希值和文件路径。

3、根据当前程序文件的哈希值和文件路径获取当前版本源代码,根据历史程序文件的哈希值和文件路径获取历史版本源代码。

4、根据预设注释字符删除当前版本源代码和历史版本源代码中的注释代码。

5、根据删除注释代码后的当前版本源代码和删除注释代码后的历史版本源代码确定变更行号。

6、确定历史版本源代码的各存储过程区间。

7、将变更行号分别与各存储过程区间匹配,根据匹配结果输出变更行号对应的存储过程。

8、根据当前程序文件更新基线。

综上,本发明可以实时识别每个软件版本相对上一版本的存储过程变更程序以及对应的开发部门和程序修改人员等信息,并且对外提供接口。对于开发人数较大的部门或公司,本发明可以精准、快速、实时地识别到最新的存储过程变更程序,让开发团队在开发测试过程中重点守护变更程序质量,实现精准测试。传统获取变更程序的方式为手工登录测试环境的Oracle数据库,人工点击某个数据库对象查看源码并和上一版本的比较,耗时长且容易出错。本发明全部采用自动化手段自动识别变更程序,为开展持续集成压缩测试时间提供一种实践方案。

基于同一发明构思,本发明实施例还提供了一种变更程序识别装置,由于该装置解决问题的原理与变更程序识别方法相似,因此该装置的实施可以参见方法的实施,重复之处不再赘述。

图8是本发明实施例中变更程序识别装置的结构框图。如图8所示,变更程序识别装置包括:

源代码获取模块,用于获取当前版本源代码和历史版本源代码;

变更行号模块,用于根据当前版本源代码和历史版本源代码确定变更行号;

存储过程区间模块,用于确定历史版本源代码的各存储过程区间;

变更输出模块,用于将变更行号分别与各存储过程区间匹配,根据匹配结果输出变更行号对应的存储过程。

在其中一种实施例中,源代码获取模块包括:

哈希值路径获取单元,用于获取当前程序文件的哈希值和文件路径,获取历史程序文件的哈希值和文件路径;

当前源代码获取单元,用于根据当前程序文件的哈希值和文件路径获取当前版本源代码;

历史源代码获取单元,用于根据历史程序文件的哈希值和文件路径获取历史版本源代码。

在其中一种实施例中,还包括:

程序文件获取模块,用于根据基线获取当前程序文件和历史程序文件。

在其中一种实施例中,还包括:

基线更新模块,用于根据当前程序文件更新基线。

综上,本发明实施例的变更程序识别装置先根据当前版本源代码和历史版本源代码确定变更行号,然后根据变更行号与历史版本源代码的各存储过程区间的匹配结果输出变更行号对应的存储过程,可以快速精准识别变更程序,进而保证软件质量。

本发明实施例还提供能够实现上述实施例中的变更程序识别方法中全部步骤的一种计算机设备的具体实施方式。图9是本发明实施例中计算机设备的结构框图,参见图9,所述计算机设备具体包括如下内容:

处理器(processor)901和存储器(memory)902。

所述处理器901用于调用所述存储器902中的计算机程序,所述处理器执行所述计算机程序时实现上述实施例中的变更程序识别方法中的全部步骤,例如,所述处理器执行所述计算机程序时实现下述步骤:

获取当前版本源代码和历史版本源代码;

根据当前版本源代码和历史版本源代码确定变更行号;

确定历史版本源代码的各存储过程区间;

将变更行号分别与各存储过程区间匹配,根据匹配结果输出变更行号对应的存储过程。

综上,本发明实施例的计算机设备先根据当前版本源代码和历史版本源代码确定变更行号,然后根据变更行号与历史版本源代码的各存储过程区间的匹配结果输出变更行号对应的存储过程,可以快速精准识别变更程序,进而保证软件质量。

本发明实施例还提供能够实现上述实施例中的变更程序识别方法中全部步骤的一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中的变更程序识别方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述步骤:

获取当前版本源代码和历史版本源代码;

根据当前版本源代码和历史版本源代码确定变更行号;

确定历史版本源代码的各存储过程区间;

将变更行号分别与各存储过程区间匹配,根据匹配结果输出变更行号对应的存储过程。

综上,本发明实施例的计算机可读存储介质根据当前版本源代码和历史版本源代码确定变更行号,然后根据变更行号与历史版本源代码的各存储过程区间的匹配结果输出变更行号对应的存储过程,可以快速精准识别变更程序,进而保证软件质量。

以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

本领域技术人员还可以了解到本发明实施例列出的各种说明性逻辑块(illustrative logical block),单元,和步骤可以通过电子硬件、电脑软件,或两者的结合进行实现。为清楚展示硬件和软件的可替换性(interchangeability),上述的各种说明性部件(illustrative components),单元和步骤已经通用地描述了它们的功能。这样的功能是通过硬件还是软件来实现取决于特定的应用和整个系统的设计要求。本领域技术人员可以对于每种特定的应用,可以使用各种方法实现所述的功能,但这种实现不应被理解为超出本发明实施例保护的范围。

本发明实施例中所描述的各种说明性的逻辑块,或单元,或装置都可以通过通用处理器,数字信号处理器,专用集成电路(ASIC),现场可编程门阵列或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。

本发明实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件模块、或者这两者的结合。软件模块可以存储于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可移动磁盘、CD-ROM或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于ASIC中,ASIC可以设置于用户终端中。可选地,处理器和存储媒介也可以设置于用户终端中的不同的部件中。

在一个或多个示例性的设计中,本发明实施例所描述的上述功能可以在硬件、软件、固件或这三者的任意组合来实现。如果在软件中实现,这些功能可以存储与电脑可读的媒介上,或以一个或多个指令或代码形式传输于电脑可读的媒介上。电脑可读媒介包括电脑存储媒介和便于使得让电脑程序从一个地方转移到其它地方的通信媒介。存储媒介可以是任何通用或特殊电脑可以接入访问的可用媒体。例如,这样的电脑可读媒体可以包括但不限于RAM、ROM、EEPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁性存储装置,或其它任何可以用于承载或存储以指令或数据结构和其它可被通用或特殊电脑、或通用或特殊处理器读取形式的程序代码的媒介。此外,任何连接都可以被适当地定义为电脑可读媒介,例如,如果软件是从一个网站站点、服务器或其它远程资源通过一个同轴电缆、光纤电缆、双绞线、数字用户线(DSL)或以例如红外、无线和微波等无线方式传输的也被包含在所定义的电脑可读媒介中。所述的碟片(disk)和磁盘(disc)包括压缩磁盘、镭射盘、光盘、DVD、软盘和蓝光光盘,磁盘通常以磁性复制数据,而碟片通常以激光进行光学复制数据。上述的组合也可以包含在电脑可读媒介中。

相关技术
  • 变更程序识别方法及装置
  • 变更管理分析方法、变更管理分析装置及变更管理分析程序
技术分类

06120112923499