CN115658128A - 一种生成软件物料清单的方法、装置及存储介质 - Google Patents
一种生成软件物料清单的方法、装置及存储介质 Download PDFInfo
- Publication number
- CN115658128A CN115658128A CN202211275540.1A CN202211275540A CN115658128A CN 115658128 A CN115658128 A CN 115658128A CN 202211275540 A CN202211275540 A CN 202211275540A CN 115658128 A CN115658128 A CN 115658128A
- Authority
- CN
- China
- Prior art keywords
- dependency information
- dependency
- information
- file
- software
- 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.)
- Pending
Links
Images
Classifications
-
- 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
- Y02P—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
- Y02P90/00—Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
- Y02P90/30—Computing systems specially adapted for manufacturing
Landscapes
- Stored Programmes (AREA)
Abstract
本申请公开了一种生成软件物料清单的方法、装置及存储介质,包括:监控源代码的变化,从源代码提取第一依赖信息,从配置文件提取第二依赖信息,从构建日志提取第三依赖信息,从镜像文件中提取第四依赖信息;根据第一依赖信息、第二依赖信息、第三依赖信息和第四依赖信息生成第五依赖信息,对第五依赖信息进行数据处理获得软件物料清单数据;根据软件物料清单数据生成软件物料清单。应用本申请实施例方案,可以从多个途径获得更加完备的依赖信息,从而达到对软件安全性进行有效管理的目的。
Description
技术领域
本申请涉及互联网技术领域,尤其涉及一种生成软件物料清单的方法,一种生成软件物料清单的装置,一种计算机可读存储介质和一种计算机程序产品。
背景技术
企业在软件开发时,通常会要求生成软件物料清单。软件物料清单是构成软件程序或应用程序的成分列表,即列举出软件所有的依赖信息以及各依赖信息之间的关系。通过软件物料清单可以提高软件内各代码组件的透明度,使企业可以及时识别并防范软件源代码可能存在的缺陷和风险,保证软件开发的安全。但现有技术中,由于软件开发人员的主观性和不确定性,以及生成软件物料清单方法的单一性,生成的软件物料清单经常容易遗漏必要的依赖信息,导致软件存在安全方面的风险。
发明内容
针对上述现有技术,本发明实施例公开一种生成软件物料清单的方法,可以克服遗漏软件依赖信息的缺陷,达到完备依赖信息,加强对软件安全性管理的目的。
鉴于此,本申请实施例提出一种生成软件物料清单的方法,该方法包括:
监控到代码仓库中的源代码发生变化时,从所述源代码中查找第一依赖文件,将所述第一依赖文件中包含的第一依赖信息提取出来;所述代码仓库是软件项目对象开发时用于保存所述源代码的存储空间,所述源代码是所述软件项目对象在开发时创建的源代码,所述第一依赖文件是所述软件项目对象在开发时记录所述第一依赖信息的文件;所述第一依赖信息是所述源代码提供的依赖信息;
获取所述软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;所述配置文件是与编译构建相关的配置文件,所述构建日志是编译过程产生的构建日志,所述镜像信息是编译构建完成后产生的与镜像文件相关的信息,所述镜像文件是所述软件项目对象在编译构建完成后产生的文件;
解析所述配置文件,解析出所述配置文件包含的第二依赖信息时,从所述配置文件中提取出所述第二依赖信息;所述第二依赖信息是所述配置文件提供的依赖信息;
解析所述构建日志,解析出所述构建日志包含的第三依赖信息时,从所述构建日志中提取所述第三依赖信息;所述第三依赖信息是所述构建日志提供的依赖信息;
根据所述镜像信息从镜像仓库中确定对应的镜像文件,所述镜像仓库是所述软件项目对象在编译构建后用于保存所述镜像文件的存储空间;
解析所述镜像文件,解析出所述镜像文件包含的第四依赖信息时,从所述镜像文件中提取出所述第四依赖信息;所述第四依赖信息是所述镜像文件提供的依赖信息;
根据所述第一依赖信息、所述第二依赖信息、所述第三依赖信息和所述第四依赖信息生成第五依赖信息,对所述第五依赖信息进行数据处理,获得处理后的软件物料清单数据;
根据所述软件物料清单数据生成软件物料清单。
进一步地,
所述监控到代码仓库中的源代码发生变化时,该方法进一步包括:
扫描所述源代码所在的目录结构,确定存在第六依赖信息,将所述第六依赖信息合并在所述第一依赖信息中,所述第六依赖信息是所述源代码提供的依赖信息。
进一步地,
所述根据所述第一依赖信息、所述第二依赖信息、所述第三依赖信息和所述第四依赖信息生成第五依赖信息的步骤包括:
根据所述第二依赖信息对所述第一依赖信息进行修正得到第七依赖信息,或者将所述第一依赖信息和第二依赖信息合并生成所述第七依赖信息;
根据所述第三依赖信息对所述第七依赖信息进行修正得到第八依赖信息,或者将所述第三依赖信息和所述第七依赖信息合并生成所述第八依赖信息;
将所述第八依赖信息和所述第四依赖信息合并生成所述第五依赖信息。
进一步地,
所述对所述第五依赖信息进行数据处理的步骤包括:
将所述第五依赖信息进行数据规范化处理和数据去重处理。
进一步地,
所述对所述第五依赖信息进行数据处理的步骤进一步包括:
与事先设置的标准软件物料清单数据项相比,确定所述第五依赖信息中缺少的数据项;根据事先建立的软件物料清单机器学习模型对所述第五依赖信息中缺少的数据项进行补充,获得处理后的软件物料清单数据;所述软件物料清单机器学习模型是事先根据机器学习方法训练生成,用于对缺失数据项的依赖信息进行自动补充的模型。
进一步地,
所述第一依赖信息包括依赖包名称、依赖包文件、依赖包版本信息、供应商名称、组织者名称、依赖包关联的网址;
所述第二依赖信息为所述第一依赖信息的修正信息或者补充信息;
所述第三依赖信息为所述依赖包版本信息中的一个具体版本号;
所述第四依赖信息包括操作系统依赖信息和开发语言依赖信息。
本发明实施例还公开一种生成软件物料清单的装置,可以克服遗漏软件依赖信息的缺陷,达到完备依赖信息,加强对软件安全性管理的目的。
该装置包括:
源代码监控单元,用于监控到代码仓库中的源代码发生变化时,从所述源代码中查找第一依赖文件,将所述第一依赖文件中包含的第一依赖信息提取出来;所述代码仓库是软件项目对象开发时用于保存所述源代码的存储空间,所述源代码是所述软件项目对象在开发时创建的源代码,所述第一依赖文件是所述软件项目对象在开发时记录所述第一依赖信息的文件;所述第一依赖信息是所述源代码提供的依赖信息;
文件获取单元,用于获取所述软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;所述配置文件是与编译构建相关的配置文件,所述构建日志是编译过程产生的构建日志,所述镜像信息是编译构建完成后产生的与镜像文件相关的信息,所述镜像文件是所述软件项目对象在编译构建完成后产生的文件;
第一解析单元,用于解析所述配置文件,解析出所述配置文件包含的第二依赖信息时,从所述配置文件中提取出所述第二依赖信息;所述第二依赖信息是所述配置文件提供的依赖信息;
第二解析单元,用于解析所述构建日志,解析出所述构建日志包含的第三依赖信息时,从所述构建日志中提取所述第三依赖信息;所述第三依赖信息是所述构建日志提供的依赖信息;
第三解析单元,用于根据所述镜像信息从镜像仓库中确定对应的镜像文件,所述镜像仓库是所述软件项目对象在编译构建后用于保存所述镜像文件的存储空间;解析所述镜像文件,解析出所述镜像文件包含的第四依赖信息时,从所述镜像文件中提取出所述第四依赖信息;所述第四依赖信息是所述镜像文件提供的依赖信息;
数据生成单元,用于根据所述第一依赖信息、所述第二依赖信息、所述第三依赖信息和所述第四依赖信息生成第五依赖信息,对所述第五依赖信息进行数据处理,获得处理后的软件物料清单数据;
清单生成单元,用于根据所述软件物料清单数据生成软件物料清单。
进一步地,
该装置还包括:
扫描单元,用于扫描所述源代码所在的目录结构,确定存在第六依赖信息,将所述第六依赖信息合并在所述第一依赖信息中,所述第六依赖信息是所述源代码提供的依赖信息。
本发明实施例公开一种计算机可读存储介质,其上存储有计算机指令,所述指令被处理器执行时可实现上述的生成软件物料清单的方法的步骤。
本发明实施例公开一种计算机程序产品,包括计算机指令,所述计算机指令在被处理器执行时实施如上述任一项所述的软件物料清单的方法。
综上所述,本申请实施例克服现有技术中获取软件依赖信息过于单一的缺陷,从源代码、配置文件、构建文件、镜像文件等多个途径获取软件依赖信息,生成的软件物料清单更加完备,增强了对软件安全性的管理。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本申请生成软件物料清单的方法实施例一的流程图。
图2是本申请生成软件物料清单的方法实施例二的流程图。
图3是本申请实现生成软件物料清单的方法实施例三的流程图。
图4是本申请生成软件物料清单的装置实施例一的结构示意图。
图5是本申请生成软件物料清单的装置实施例二的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其他步骤或单元。
下面以具体实施例对本发明的技术方案进行详细说明。下面几个具体实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
在实际应用中,开发人员在软件项目对象开发过程中没有严格遵循要求,软件全部的依赖信息没有被统一、集中地记录在某个依赖文件中,而是将依赖信息零散遗留在软件开发各个环节中。本申请实施例通过多种途径来获取软件项目对象涉及到的依赖信息,即包括从源代码、配置文件、构建日志以及镜像文件等多种途径获取依赖信息,得到更为完备准确的依赖信息,从而加强地对软件安全性的有效管理。
图1是本申请生成软件物料清单的方法实施例一的流程图。如图1所示,该方法包括:
步骤101:监控到代码仓库中的源代码发生变化时,从源代码中查找第一依赖文件,将第一依赖文件中包含的第一依赖信息提取出来;代码仓库是软件项目对象开发时用于保存源代码的存储空间,源代码是软件项目对象在开发时创建的源代码,第一依赖文件是软件项目对象在开发时记录第一依赖信息的文件。
开发人员在进行软件开发时,会将创建的源代码保存在代码仓库中。按照开发进度,每一次在更新源代码之后,将更新后的源代码提交到代码仓库中。如果软件开发过程中需要某些固有组件等信息,就需要记录下该组件的依赖信息。固有组件的信息是由第三方提供,直接引入源代码,不必开发人员重复开发。源代码通常依靠一个称为依赖文件的来保存依赖信息。
在实际应用中,可以监控代码仓库对应的地址,一旦该地址保存的源代码发生了变化,说明开发人员提交了新的源代码,就可以从该源代码中查找相关的依赖文件,为后续生成软件物料清单做准备。为了与后续步骤其他依赖文件和依赖信息区分,本步骤101所述源代码对应的依赖文件称为“第一依赖文件”,第一依赖文件中的依赖信息称为“第一依赖信息”。第一依赖信息可以包括依赖包名称、依赖包文件、依赖包版本信息、供应商名称、组织者名称、依赖包关联的网址等信息。
比如,以JAVA语言的软件开发为例,其源代码中的依赖文件通常为POM文件,POM文件中的依赖(Dependency)部分记录了源代码的依赖信息。再比如,以NodeJS语言的软件开发为例,其源代码中的依赖文件为package.json,其中也记录了源代码的依赖。具体的依赖文件类型和依赖信息以具体的开发为准,这些不在一一列举。
步骤102:获取软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;配置文件是与编译构建相关的配置文件,构建日志是编译过程产生的构建日志,镜像信息是编译构建完成后产生的与镜像文件相关的信息,镜像文件是软件项目对象在编译构建完成后产生的文件。
软件开发时,需要将软件的源代码进行编译构建才完成开发。在编译构建过程中,配置文件可以描述构建时需要的依赖信息。为了与其他依赖信息区分,配置文件中的依赖信息称为“第二依赖信息”。在编译沟通过程中,还可能会创建构建日志,其作用是记录构建的过程。而在编译构建的过程中,就有可能记录下软件项目实际依赖的依赖信息,而并非源代码或者配置文件中事先申明的依赖信息。为了与其他依赖信息区分,构建日志中的依赖信息称为“第三依赖信息”。
另外,编译构建完成之后,通常还会生成镜像文件,并将镜像文件保存在镜像仓库中。镜像文件是将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用。镜像文件中可能会包含与操作系统以及开发语言等相关的依赖信息。为了与其他依赖信息区分,这里将镜像文件中的依赖信息称为“第四依赖信息”。配置文件和构建日志通常比较小,可以在编译构建过程中直接获得。镜像文件本身比较大,本步骤可以仅获取与镜像文件相关的信息,即镜像信息,比如镜像标签(ID号)、版本号等信息,后续再通过镜像信息从镜像仓库中获取对应的镜像文件。
步骤103:解析配置文件,解析出配置文件包含的第二依赖信息时,从配置文件中提取出第二依赖信息,所述第二依赖信息是所述配置文件提供的依赖信息。
步骤104:解析构建日志,解析出构建日志包含的第三依赖信息时,从构建日志中提取第三依赖信息,所述第三依赖信息是所述构建日志提供的依赖信息。
步骤105:根据镜像信息从镜像仓库中确定对应的镜像文件,镜像仓库是软件项目对象在编译构建后用于保存镜像文件的存储空间。
步骤106:解析镜像文件,解析出镜像文件包含的第四依赖信息时,从镜像文件中提取出第四依赖信息,所述镜像仓库是所述软件项目对象在编译构建后用于保存所述镜像文件的存储空间。
上述步骤103~步骤106分别从配置文件中提取第二依赖信息,从构建日志中提取第三依赖信息,从镜像文件中提取第四依赖信息。实际应用中,可以在编译构建过程中设置自动触发器,用于将产生的配置文件、构建日志和镜像信息收集起来,获取相应的第二依赖信息、第三依赖信息和第四依赖信息。比如:Jenkins编译构建工具是常用的编译构建工具,可以在Jenkins中安装自动触发器。这样,在Jekins编译构建过程中,该自动触发器可以将构建中的配置文件、构建日志上报,并在构建完成后将产生的镜像信息上报。
步骤107:根据第一依赖信息、第二依赖信息、第三依赖信息和第四依赖信息生成第五依赖信息,对第五依赖信息进行数据处理,获得处理后的软件物料清单数据。
步骤108:根据软件物料清单数据生成软件物料清单。
本申请上述实施例从源代码、配置文件、构建日志以及镜像文件多个途径获得了依赖信息。这些依赖信息都属于软件项目对象涉及到的依赖信息,后续获得的依赖信息有可能是对先前所获得的依赖信息的修正或者补充。比如,某软件项目对象的源文件中记录的第一依赖信息包括X1、Y1、Z1,而配置文件中记录的第二依赖信息可能包括X2,也就是说,开发人员在源代码编辑过程中认为需要依赖X1,但在编译过程中认为需要依赖X2,于是将依赖信息X1修正为了X2。再比如,镜像文件中记录了依赖信息M1和H1,是对于已有的依赖信息的补充。因此,该软件项目对象实际的依赖信息应该包括X2、Y1、Z1、M1和H1,应以此作为依据生成准确的软件物料清单。
不管是对先前获得依赖信息的修正或者补充,本实施例将修正或补充后最终获得的依赖信息称为“第五依赖信息”。为了更好地利用这些依赖信息,可以对第五依赖信息进行数据处理(比如数据规范化处理和去重处理等),保存到数据库中作为生成软件物料清单的数据。此后,当需要生成软件物料清单时,从数据库中提取这些软件物料清单数据,从而方便地生成软件物料清单,达到对软件安全性进行有效管理的目的。
图2是本申请生成软件物料清单的方法实施例二的流程图。如图2所示,该方法包括:
步骤201:监控到代码仓库中的源代码发生变化时,从源代码中查找第一依赖文件,将第一依赖文件中包含的第一依赖信息提取出来;代码仓库是软件项目对象开发时用于保存源代码的存储空间,源代码是软件项目对象在开发时创建的源代码,第一依赖文件是软件项目对象在开发时记录第一依赖信息的文件;第一依赖信息是源代码提供的依赖信息。
本步骤与实施例一中的步骤101相同。
步骤202:扫描源代码所在的目录结构,确定存在第六依赖信息,将第六依赖信息合并在第一依赖信息中,第六依赖信息是源代码提供的依赖信息。
实际应用中,开发人员可能未将某些依赖信息记录在源代码的第一依赖文件中,但在源代码中直接引用了该依赖信息。在这种情况下,可以扫描源代码所在的目录结构,如果发现有依赖信息存在,将其合并在第一依赖信息中。比如,软件项目采用JAVA语言开发,源代码中的依赖信息通常记录在POM文件中,但某个依赖信息为“jar”为后缀的文件未记录在POM文件中。如果在该软件项目源代码所在的目录结构中扫描到“jar”为后缀的文件,则可以将其作为依赖信息合并到第一依赖信息中。当然,如果在目录结构中未扫描到依赖信息,则可以继续执行后续步骤。
步骤203:获取软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;配置文件是与编译构建相关的配置文件,构建日志是编译过程产生的构建日志,镜像信息是编译构建完成后产生的与镜像文件相关的信息,镜像文件是所述软件项目对象在编译构建完成后产生的文件。
步骤204:解析配置文件,解析出配置文件包含的第二依赖信息时,从配置文件中提取出第二依赖信息,第二依赖信息是配置文件提供的依赖信息。
步骤205:解析构建日志,解析出构建日志包含的第三依赖信息时,从构建日志中提取第三依赖信息;第三依赖信息是构建日志提供的依赖信息。
步骤206:根据镜像信息从镜像仓库中确定对应的镜像文件,镜像仓库是软件项目对象在编译构建后用于保存镜像文件的存储空间。
步骤207:解析镜像文件,解析出镜像文件包含的第四依赖信息时,从镜像文件中提取出第四依赖信息;第四依赖信息是镜像文件提供的依赖信息。
上述步骤203~步骤207与方法实施例一中的步骤102~步骤106相同。
步骤208:根据第二依赖信息对第一依赖信息进行修正得到第七依赖信息,或者将第一依赖信息和第二依赖信息合并生成第七依赖信息。
步骤209:根据第三依赖信息对第七依赖信息进行修正得到第八依赖信息,或者将第三依赖信息和第七依赖信息合并生成第八依赖信息。
步骤210:将第八依赖信息和第四依赖信息合并生成第五依赖信息。
上述步骤208~步骤210是根据第一依赖信息、第二依赖信息、第三依赖信息和第四依赖信息生成第五依赖信息的过程。其中,第一依赖信息是从源代码中获取的依赖信息,第二依赖信息是从配置文件获取的依赖信息,第三依赖信息是从构建日志中获取的依赖信息,第四依赖信息是从镜像文件中获取的依赖信息。
实际应用中,虽然源代码中提供了第一依赖信息,但开发人员可能在编译时发现需要更改原有的依赖信息或者增加新的依赖信息,这里将对第一依赖信息的修正信息补充信息称为第二依赖信息,并写入编译构建过程的配置文件中。后续编译建构时,将根据配置文件中的第二依赖信息对第一依赖信息进行修正或者将第一依赖信息和第二依赖信息合并补充,修正或合并补充之后的依赖信息这里称为“第七依赖信息”。当然,如果不需要对第一依赖信息进行修正或者增加新的依赖信息,可以省略步骤208。
构建日志是记录编译构建过程的日志。实际应用中,源代码提供的某依赖信息可能不准确,但实际采用的第三依赖信息又未写入配置文件中。在这种情况下,编译建构过程实际采用的第三依赖信息可能会被建构日志记录下来,从而利用建构日志中的第三依赖信息进行修正或合并。比如,源代码中关于版本号的依赖信息是一个模糊的范围“1.0.1以上的版本”,但在编译建构过程产生的建构日志记录了“3.0.1”这个具体的版本号,因此可以进一步将“1.0.1以上的版本”这个依赖信息修正为“3.0.1”这个准确的版本号。这里的第三依赖信息就是第一依赖信息中依赖包版本信息中的一个具体版本号。
如上所述,镜像文件是在编译建构之后产生的文件,主要用于用户下载和使用。镜像文件中会包含未记录在源代码中的第四依赖信息,比如操作系统依赖信息和开发语言依赖信息等。为了获取更加完整的依赖信息,可以从镜像文件中获取第四依赖信息,并与已有的依赖信息进行合并,作为第五依赖信息。比如,在镜像文件中包含有操作系统为CentOS的依赖信息以及开发语言JAVA的依赖信息,那么可以将“CentOS”和“JAVA”作为第四依赖信息合并到已有的依赖信息中,生成第五依赖信息。这里所述的第五依赖信息是指通过源代码、配置文件、建构日志以及镜像文件等多种途径获得的依赖信息。
步骤211:将第五依赖信息进行数据规范化处理和数据去重处理。
为了后续更好利用获取到的第五依赖信息,实际应用中可以将第五依赖信息保存在数据库中。由于从各种途径获取到的依赖信息种类繁多,可能存在数据不规范或者重复的现象,这里需要对其进行规范化处理和去重处理。其中,规范化处理可以由应用本申请实施例方案的用户自行确定,比如事先设置固定的字段长度,将多余的信息去除或者不足的进行补充。去重处理是指将依赖信息中重复的信息删除。比如,源代码中已经提供了某个依赖信息,但配置文件再次将该依赖信息写入,这可能就造成了信息的重复,需要删除。
步骤212:与事先设置的标准软件物料清单数据项相比,确定第五依赖信息中缺少的数据项,根据事先建立的软件物料清单机器学习模型对第五依赖信息中缺少的数据项进行补充,获得处理后的软件物料清单数据;软件物料清单机器学习模型是事先根据机器学习方法训练生成,用于对缺失数据项的依赖信息进行自动补充的模型。
实际中可以事先设置标准软件物料清单数据项,根据该标准软件物料清单数据项从各种途径收集相应的依赖信息。如果某些常规依赖信息记录不全面,也无法从源代码、配置文件、构建日志和镜像文件中获取,本申请实施例还可以提供软件物料清单机器学习模型对其进行补充。软件物料清单机器学习模型是根据机器学习方法训练生成的,具体可以采用卷积神经网络来实现,输入缺失数据项的依赖信息,输出对应的缺失数据项,将其作为补充。比如,源代码提供某依赖信息包括依赖包名称、依赖包版本信息、依赖包文件、组织者名称以及依赖包关联的网址,但缺少相应的供应商名称,通过软件物料清单机器学习模型可以获取对应的供应商名称,并将获得的供应商名称补充进依赖信息中,以此完善依赖信息。
步骤213:根据软件物料清单数据生成软件物料清单。
本申请实施例从源代码、配置文件、构建日志、镜像文件等多种途径获取依赖信息,并通过各种数据处理的方式将依赖信息进行规范化和完备化,保证依赖信息的准确性,从而更加有利于保证软件的安全性。
在本申请方法实施例三中,假设正在开发的软件项目对象的名称为HummerRisk,采用以JAVA为主的语言进行开发,并将每次开发生成的源代码保存在代码仓库中。另外,本实施例执行后可以生成一个类型为软件物料清单(SBOM)的文件HummerRisk,其版本号为v1.0,清单中具体的数据项包括依赖包名称、依赖包文件、依赖包版本信息、供应商名称、组织者名称、依赖包关联的网址、操作系统依赖信息、开发语言依赖信息等等。首先,在执行本申请实施例方案之前,可以先生成一个初始化的文件,包括:
SBOM name:HummerRisk;
SBOM version:v1.0;
其他数据项的内容将通过如下实施例的方案自动生成。
图3是本申请实现生成软件物料清单的方法实施例三的流程图。如图3所示,该方法具体包括:
步骤301:监控到代码仓库中的源代码发生变化时,从源代码中查找第一依赖文件POM文件和Package.json文件,将第一依赖文件POM文件和Package.json文件包含的第一依赖信息提取出来;代码仓库是软件项目对象HummerRisk开发时用于保存源代码的存储空间,源代码是软件项目对象HummerRisk在开发时创建的源代码,第一依赖文件POM文件和Package.json文件是软件项目对象HummerRisk在开发时记录第一依赖信息的文件;第一依赖信息是源代码提供的依赖信息。
本申请实施例中,假设开发项目在后端采用JAVA语言,而在前端采用NodeJS语言。JAVA语言的开发通常将依赖信息记录在POM文件中,而NodeJS语言的开发将依赖信息记录在Package.json文件。那么,本步骤的第一依赖文件同时为Package.json文件和POM文件,包含的依赖信息都作为第一依赖信息。第一依赖信息具体可以包括:依赖包名称、依赖包文件、依赖包版本信息、供应商名称、组织者名称、依赖包关联的网址等。
假设本步骤从POM文件提取出第一依赖信息为:
Package name:aws-java-sdk-bom;
Package file:aws-java-sdk-bom.jar;
Package version:1.12.267;
Supplier:aws;
Originator:com.amazonaws;
URL:http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bom;
其中,依赖包名称为aws-java-sdk-bom;依赖包文件为aws-java-sdk-bom.jar;依赖包版本信息为1.12.267;供应商名称为aws;组织者名称为com.amazonaws;依赖包关联的网址为http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bom。
假设本步骤从Package.json文件提取出第一依赖信息为:
Package name:vue-frontawsome;
Package file:vue-frontawsome.js;
Package version:^1.6.5;
Supplier:frontawsome;
Originator:frontawsome;
URL:http://github.com/FortAwesome/vue-fontawesome;
其中,依赖包名称为vue-frontawsome;依赖包文件为vue-frontawsome.js;依赖包版本信息为^1.6.5;供应商名称为frontawsome;组织者名称为frontawsome;依赖包关联的网址为http://github.com/FortAwesome/vue-fontawesome。其中,依赖包版本信息^1.6.5表示1.6.5以上的版本,是一个模糊的信息。
当然,如果某个开发项目仅采用JAVA语言或者仅采用NodeJS语言,可以单独解析POM文件或者单独解析Package.json文件。如果某个开发项目采用其他语言开发,也可以解析其他类型的依赖文件来获得依赖信息。总之,步骤301并不局限于某一种具体的依赖文件,只要是用于保存依赖信息的文件都可以。
步骤302:扫描源代码所在的目录结构,确定存在第六依赖信息,将第六依赖信息合并在第一依赖信息中,第六依赖信息是源代码提供的依赖信息。
本步骤与方法实施例二中的步骤202相同。
如果开发人员未将依赖信息统一记录在POM文件和/或Package.json文件中,还可以在本步骤302直接扫描源代码的目录结构。在源代码的目录结构中发现有未记录在POM文件中的jar文件,或者未记录在Package.json文件中的JS文件,那么可以认为这些jar文件或JS文件也属于依赖信息,应该记录但实际未记录在第一依赖文件中。为了区分,这里将扫描目录结构发现的依赖信息称为第六依赖信息。本实施例中,假设在源文件目录结构中发现另外的jar文件mysql-connector-java.jar,因此第六依赖信息为:
Package name:mysql-connector-java;
Package file:mysql-connector-java.jar;
Package version:
Supplier:
Originator:
URL:
其中,依赖包版本信息(Package version)、供应商名称(Supplier)、组织者名称(Originator)、依赖包关联的网址(URL)无法从mysql-connector-java.jar中获取,信息暂时为空。
步骤303:获取软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;配置文件是与编译构建相关的配置文件,构建日志是编译过程产生的构建日志,镜像信息是编译构建完成后产生的与镜像文件相关的信息,镜像文件是所述软件项目对象在编译构建完成后产生的文件。
本步骤与方法实施例二中的步骤203相同。
步骤304:解析配置文件,解析出配置文件包含的第二依赖信息时,从配置文件中提取出第二依赖信息,第二依赖信息是配置文件提供的依赖信息。
本步骤与方法实施例二中的步骤204相同。
如上所述,源代码提供了第一依赖信息,但开发人员可能在编译时发现需要更改原有的依赖信息或者增加新的依赖信息,会将修改或增加的依赖信息作为第二依赖信息写入编译构建过程的配置文件中。本申请实施例假设配置文件中没有修改或增加的依赖信息,因此本步骤提取的第二依赖信息将不会对第一依赖信息产生影响。
步骤305:解析构建日志,解析出构建日志包含的第三依赖信息时,从构建日志中提取第三依赖信息;第三依赖信息是构建日志提供的依赖信息。
本步骤与方法实施例二中的步骤205相同。
本申请实施例假设从构建日志中提取出的第三依赖信息中包含一个具体的版本号1.7.1,是对步骤301中依赖包版本信息为^1.6.5这一模糊信息的进一步补充,后续需要对其进行修改。
步骤306:根据镜像信息从镜像仓库中确定对应的镜像文件,镜像仓库是软件项目对象在编译构建后用于保存镜像文件的存储空间。
本步骤与方法实施例二中的步骤206相同。
本申请实施例假设获取的镜像信息为:
File name:hummerrisk-1.0;
File id:siwdh182734jwiand;
File type:docker image;
其中,镜像信息包括:镜像文件名称hummerrisk-1.0,镜像文件ID号siwdh182734jwiand,文件类型为docker image。根据上述的镜像信息,本步骤可以镜像信息从镜像仓库中找到相应的镜像文件。
步骤307:解析镜像文件,解析出镜像文件包含的第四依赖信息时,从镜像文件中提取出第四依赖信息;第四依赖信息是镜像文件提供的依赖信息。
本步骤与方法实施例二中的步骤207相同。
本步骤可以继续解析相应的镜像文件,获取第四依赖信息。本步骤这里所述的第四依赖信息包括操作系统依赖信息和开发语言依赖信息。其中,操作系统依赖信息包括:
Package name:pkg:apk/alpine/alpine-baselayout@3.2.0-r22?distro=3.16.2;
Package file:siwdh182734jwiand;
Package version:3.2.0-r22;
Supplier:alpinelinux:
Originator:alpinelinux;
URL:http://www.alpinelinux.org/;
其中,依赖包名称为pkg:apk/alpine/alpine-baselayout@3.2.0-r22?distro=3.16.2;依赖包文件为siwdh182734jwiand;依赖包版本信息为3.2.0-r22;供应商名称为alpinelinux;组织者名称为alpinelinux;依赖包关联的网址为http://www.alpinelinux.org/。
开发语言依赖信息包括:
Package name:openjdk:11-jre-slim@sha256:31a5d3fa2942eea891cf954f7d07359e09cf1b1f3d35fb32fedebb1e3399fc9e;
Package file:;
Package version:11.0.4_11;
Supplier:oracle:
Originator:oracle;
URL:http://www.oracle.com/sg/;
其中,依赖包名称为openjdk:11-jre-slim@sha256:31a5d3fa2942eea891cf954f7d07359e09cf1b1f3d35fb32fedebb1e3399fc9e;依赖包版本信息为11.0.4_11;供应商名称为oracle;组织者名称为oracle,依赖包关联的网址为http://www.oracle.com/sg/。
上述步骤303~步骤307已经提取出第二依赖信息、第三依赖信息和第四依赖信息。
步骤308:根据第二依赖信息对第一依赖信息进行修正得到第七依赖信息,或者将第一依赖信息和第二依赖信息合并生成第七依赖信息。
本步骤与方法实施例二中的步骤208相同。
上述步骤304假设从配置文件中提取出的第二依赖信息不会对第一依赖信息产生影响,因此无需对第一依赖信息进行修正,或者与第一依赖信息进行合并。或者说,根据第二依赖信息对第一依赖信息进行修正或合并之后的结果第七依赖信息仍然与原有的第一依赖信息相同,未发生变化。
步骤309:根据第三依赖信息对第七依赖信息进行修正得到第八依赖信息,或者将第三依赖信息和第七依赖信息合并生成第八依赖信息。
本步骤与方法实施例二中的步骤209相同。
上述步骤305中假设从构建日志中提取出的第三依赖信息包含一个具体的版本号1.7.1,是对步骤301中依赖包版本信息为^1.6.5这一模糊信息的进一步补充。因此,在本步骤309中将第一依赖信息中的模糊信息修正为具体的版本号。修改后的信息将改变为:
Package name:vue-frontawsome;
Package file:vue-frontawsome.js;
Package version:1.7.1;
Supplier:frontawsome;
Originator:frontawsome;
URL:http://github.com/FortAwesome/vue-fontawesome;
步骤310:将第八依赖信息和第四依赖信息合并生成第五依赖信息。
本步骤与方法实施例二中的步骤210相同。
经过上述步骤的修正和合并,本申请实施例中生成的第五依赖信息包括:
Package name:aws-java-sdk-bom;
Package file:aws-java-sdk-bom.jar;
Package version:1.12.267;
Supplier:aws;
Originator:com.amazonaws;
URL:http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bom;
Package name:vue-frontawsome;
Package file:vue-frontawsome.js;
Package version:1.7.1;
Supplier:frontawsome;
Originator:frontawsome;
URL:http://github.com/FortAwesome/vue-fontawesome;
Package name:mysql-connector-java;
Package file:mysql-connector-java.jar;
Package version:
Supplier:aws:
Originator:
URL:
Package name:pkg:apk/alpine/alpine-baselayout@3.2.0-r22?distro=3.16.2;
Package file:siwdh182734jwiand;
Package version:3.2.0-r22;
Supplier:alpinelinux:
Originator:alpinelinux;
URL:http://www.alpinelinux.org/;
Package name:openjdk:11-jre-slim@sha256:31a5d3fa2942eea891cf954f7d07359e09cf1b1f3d35fb32fedebb1e3399fc9e;
Package file:;
Package version:11.0.4_11;
Supplier:oracle:
Originator:oracle;
URL:http://www.oracle.com/sg/;
可以看出,本申请实施例虽然已经得到大部分软件物料清单数据项,但某些数据项还可能存在缺陷,未能从源代码、配置文件、构建日志以及镜像文件中获取全部完备的依赖信息。比如在步骤302扫描目录结构中获得的第六依赖信息就不完善。对于这种情况,本申请实施例三将利用后续方法继续补充完善。
步骤311:将第五依赖信息进行数据规范化处理和数据去重处理。
本步骤与方法实施例二中的步骤211相同。
为了后续便于管理,通常可以将生成的第五依赖信息保存在数据库中。实际应用中,提取的各种依赖信息可能不规范或者有重复现象,因此在保存数据库之前可以进行数据规范化处理和数据去重处理。这里所述的数据规范化处理就是将提取的各种依赖信息按照设置的统一规范进行处理,比如统一为规定的字段长度。这里所述的数据去重处理就是确定是否存在重复数据,如果有重复数据,则删除重复的部分。
步骤312:与事先设置的标准软件物料清单数据项相比,确定第五依赖信息中缺少的数据项;根据事先建立的软件物料清单机器学习模型对第五依赖信息中缺少的数据项进行补充,获得处理后的软件物料清单数据;软件物料清单机器学习模型是事先根据机器学习方法训练生成,用于对缺失数据项的依赖信息进行自动补充的模型。
本步骤与方法实施例二中的步骤212相同。
本申请实施例中,可以事先利用机器学习的方法训练生成软件物料清单机器学习模型,输入已有的物料清单数据项,输出缺失的物料清单数据项。比如在步骤302提取的第六依赖信息中仅有依赖包名称和依赖包文件这两项数据项的内容,而缺少依赖包版本信息、供应商名称、组织者名称和依赖包关联的网址这四项数据项内容。为此,就可以在本步骤利用事先训练的软件物料清单机器学习模型对其进行补充。假设本步骤补充后的依赖信息包括:
Package name:mysql-connector-java;
Package file:mysql-connector-java.jar;
Package version:5.7.1;
Supplier:MySQL;
Originator:Oracle;
URL:https://mvnrepository.com/artifact/mysql/mysql-connector-java;
实际应用中,如果利用软件物料清单机器学习模型仍然无法补充缺失的依赖信息,则可以通过人工进行补充,从而完善被开发的软件项目对象涉及的所有的依赖信息。
步骤313:根据软件物料清单数据生成软件物料清单。
本步骤与方法实施例二中的步骤213相同。
至此,本申请实施例获得了完善的第五依赖信息,并将数据处理后生成的软件物料清单数据保存在数据库中。此后,当需要生成软件物料清单时,就可以从数据库中提取相应的数据。本申请实施例最终获得的软件物料清单(SBOM)文件HummerRisk的内容包括:
SBOM name:HummerRisk;
SBOM version:v1.0;
Package name:aws-java-sdk-bom;
Package file:aws-java-sdk-bom.jar;
Package version:1.12.267;
Supplier:aws;
Originator:com.amazonaws;
URL:http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bom;
Package name:vue-frontawsome;
Package file:vue-frontawsome.js;
Package version:1.7.1;
Supplier:frontawsome;
Originator:frontawsome;
URL:http://github.com/FortAwesome/vue-fontawesome;
Package name:mysql-connector-java;
Package file:mysql-connector-java.jar;
Package version:5.7.1;
Supplier:MySQL;
Originator:Oracle;
URL:https://mvnrepository.com/artifact/mysql/mysql-connector-java;
Package name:pkg:apk/alpine/alpine-baselayout@3.2.0-r22?distro=3.16.2;
Package file:siwdh182734jwiand;
Package version:3.2.0-r22;
Supplier:alpinelinux:
Originator:alpinelinux;
URL:http://www.alpinelinux.org/;
Package name:openjdk:11-jre-slim@sha256:31a5d3fa2942eea891cf954f7d07359e09cf1b1 f3d35fb32fedebb1e3399fc9e;
Package file:;
Package version:11.0.4_11;
Supplier:oracle:
Originator:oracle;
URL:http://www.oracle.com/sg/;
应用本申请方法实施例三的技术方案,可以通过源代码、配置文件、构建文件、镜像文件、目录结构扫描、软件物料清单机器学习模型以及人工等多种途径获取完备的软件依赖信息,形成生成可靠的软件物料清单,利用于对软件安全性的管理。
本申请实施例还公开一种生成软件物料清单的装置。图4是本申请生成软件物料清单的装置实施例一的结构示意图。如图4所示,该装置包括:源代码监控单元401、文件获取单元402、第一解析单元403、第二解析单元404、第三解析单元405、数据生成单元406、清单生成单元407。其中:
源代码监控单元401,用于监控到代码仓库中的源代码发生变化时,从源代码中查找第一依赖文件,将第一依赖文件中包含的第一依赖信息提取出来;代码仓库是软件项目对象开发时用于保存源代码的存储空间,源代码是软件项目对象在开发时创建的源代码,第一依赖文件是软件项目对象在开发时记录第一依赖信息的文件;第一依赖信息是源代码提供的依赖信息。
文件获取单元402,用于获取软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;配置文件是与编译构建相关的配置文件,构建日志是编译过程产生的构建日志,镜像信息是编译构建完成后产生的与镜像文件相关的信息,镜像文件是软件项目对象在编译构建完成后产生的文件。
第一解析单元403,用于解析配置文件,解析出配置文件包含的第二依赖信息时,从配置文件中提取出第二依赖信息;第二依赖信息是配置文件提供的依赖信息。
第二解析单元404,用于解析构建日志,解析出构建日志包含的第三依赖信息时,从构建日志中提取第三依赖信息;第三依赖信息是构建日志提供的依赖信息。
第三解析单元405,用于根据镜像信息从镜像仓库中确定对应的镜像文件,镜像仓库是软件项目对象在编译构建后用于保存镜像文件的存储空间;解析镜像文件,解析出镜像文件包含的第四依赖信息时,从镜像文件中提取出第四依赖信息;第四依赖信息是镜像文件提供的依赖信息。
数据生成单元406,用于根据第一依赖信息、第二依赖信息、第三依赖信息和第四依赖信息生成第五依赖信息,对第五依赖信息进行数据处理,获得处理后的软件物料清单数据。
清单生成单元407,用于根据软件物料清单数据生成软件物料清单。
也就是说,源代码监控单元401监控到代码仓库中的源代码发生变化时,从源代码中查找第一依赖文件,将第一依赖文件中包含的第一依赖信息提取出来;文件获取单元402获取软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;第一解析单元403解析配置文件,解析出配置文件包含的第二依赖信息时,从配置文件中提取出第二依赖信息;第二解析单元404解析构建日志,解析出构建日志包含的第三依赖信息时,从构建日志中提取第三依赖信息;第三解析单元405根据镜像信息从镜像仓库中确定对应的镜像文件;解析镜像文件,解析出镜像文件包含的第四依赖信息时,从镜像文件中提取出第四依赖信息;数据生成单元406根据第一依赖信息、第二依赖信息、第三依赖信息和第四依赖信息生成第五依赖信息,对第五依赖信息进行数据处理,获得处理后的软件物料清单数据;清单生成单元407根据软件物料清单数据生成软件物料清单。
本申请装置实施例从源代码、配置文件、构建日志以及镜像文件多个途径获得了依赖信息。这些依赖信息都属于软件项目对象涉及到的依赖信息,后续获得的依赖信息有可能是对先前所获得的依赖信息的修正或者补充,修正或补充后最终获得的依赖信息为第五依赖信息,并对第五依赖信息进行数据处理,生成软件物料清单的数据。此后,根据软件物料清单数据可以方便地生成软件物料清单,达到对软件安全性进行管理的目的。
图5是本申请生成软件物料清单的装置实施例二的结构示意图。如图5所示,该装置包括:源代码监控单元401、文件获取单元402、第一解析单元403、第二解析单元404、第三解析单元405、数据生成单元406、清单生成单元407,还进一步包括扫描单元408。其中,数据生成单元406包括第一生成单元409、第二生成单元410、第三生成单元411、数据处理单元412、模型补充单元413。具体的:
源代码监控单元401,用于监控到代码仓库中的源代码发生变化时,从源代码中查找第一依赖文件,将第一依赖文件中包含的第一依赖信息提取出来;代码仓库是软件项目对象开发时用于保存源代码的存储空间,源代码是软件项目对象在开发时创建的源代码,第一依赖文件是软件项目对象在开发时记录第一依赖信息的文件;第一依赖信息是源代码提供的依赖信息。
文件获取单元402,用于获取软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;配置文件是与编译构建相关的配置文件,构建日志是编译过程产生的构建日志,镜像信息是编译构建完成后产生的与镜像文件相关的信息,镜像文件是软件项目对象在编译构建完成后产生的文件。
第一解析单元403,用于解析配置文件,解析出配置文件包含的第二依赖信息时,从配置文件中提取出第二依赖信息;第二依赖信息是配置文件提供的依赖信息。
第二解析单元404,用于解析构建日志,解析出构建日志包含的第三依赖信息时,从构建日志中提取第三依赖信息;第三依赖信息是构建日志提供的依赖信息。
第三解析单元405,用于根据镜像信息从镜像仓库中确定对应的镜像文件,镜像仓库是软件项目对象在编译构建后用于保存镜像文件的存储空间;解析镜像文件,解析出镜像文件包含的第四依赖信息时,从镜像文件中提取出第四依赖信息;第四依赖信息是镜像文件提供的依赖信息。
数据生成单元406,用于根据第一依赖信息、第二依赖信息、第三依赖信息和第四依赖信息生成第五依赖信息,对第五依赖信息进行数据处理,获得处理后的软件物料清单数据。
清单生成单元407,用于根据软件物料清单数据生成软件物料清单。
扫描单元408,用于扫描源代码所在的目录结构,确定存在第六依赖信息,将第六依赖信息合并在第一依赖信息中,第六依赖信息是源代码提供的依赖信息。
在数据生成单元406中,具体包括:
第一生成单元409,用于根据第二依赖信息对第一依赖信息进行修正得到第七依赖信息,或者将第一依赖信息和第二依赖信息合并生成第七依赖信息。
第二生成单元410,用于根据第三依赖信息对第七依赖信息进行修正得到第八依赖信息,或者将第三依赖信息和第七依赖信息合并生成第八依赖信息。
第三生成单元411,用于将第八依赖信息和第四依赖信息合并生成第五依赖信息。
数据处理单元412,用于将第五依赖信息进行数据规范化处理和数据去重处理。
模型补充单元413,用于与事先设置的标准软件物料清单数据项相比,确定第五依赖信息中缺少的数据项;根据事先建立的软件物料清单机器学习模型对第五依赖信息中缺少的数据项进行补充,获得处理后的软件物料清单数据;软件物料清单机器学习模型是事先根据机器学习方法训练生成,用于对缺失数据项的依赖信息进行自动补充的模型。
也就是说,源代码监控单元401监控到代码仓库中的源代码发生变化时,从源代码中查找第一依赖文件,将第一依赖文件中包含的第一依赖信息提取出来;文件获取单元402获取软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;第一解析单元403解析配置文件,解析出配置文件包含的第二依赖信息时,从配置文件中提取出第二依赖信息;第二解析单元404解析构建日志,解析出构建日志包含的第三依赖信息时,从构建日志中提取第三依赖信息;第三解析单元405根据镜像信息从镜像仓库中确定对应的镜像文件;解析镜像文件,解析出镜像文件包含的第四依赖信息时,从镜像文件中提取出第四依赖信息;在数据生成单元406中,第一生成单元409根据第二依赖信息对第一依赖信息进行修正得到第七依赖信息,或者将第一依赖信息和第二依赖信息合并生成第七依赖信息;第二生成单元410根据第三依赖信息对第七依赖信息进行修正得到第八依赖信息,或者将第三依赖信息和第七依赖信息合并生成第八依赖信息;第三生成单元411将第八依赖信息和第四依赖信息合并生成第五依赖信息;数据处理单元412将第五依赖信息进行数据规范化处理和数据去重处理;模型补充单元413与事先设置的标准软件物料清单数据项相比,确定第五依赖信息中缺少的数据项;根据事先建立的软件物料清单机器学习模型对第五依赖信息中缺少的数据项进行补充,获得处理后的软件物料清单数据;清单生成单元407根据软件物料清单数据生成软件物料清单。
应用本申请装置实施例二的技术方案,可以通过源代码、配置文件、构建文件、镜像文件、目录结构扫描、软件物料清单机器学习模型以及人工等多种途径获取完备的软件依赖信息,形成生成可靠的软件物料清单,利用于对软件安全性的管理。
本申请实施例还提供一种计算机可读介质,所述计算机可读存储介质存储指令,所述指令在由处理器执行时可执行如上所述的软件物料清单的方法中的步骤。实际应用中,所述的计算机可读介质可以是上述实施例中描述的设备/装置/系统中所包含的,也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或多个程序被执行时,可以实现上述各实施例描述的软件物料清单的方法。根据本申请公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质,例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件,或者上述的任意合适的组合,但不用于限制本申请保护的范围。在本申请公开的实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
本申请实施例还提供一种计算机程序产品,该计算机程序产品包括计算机指令,该计算机指令在被处理器执行时实施如上述任一实施例所述的方法。
本申请附图中的流程图和框图,示出了按照本申请公开的各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或者代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应该注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同附图中所标准的顺序发生。例如,两个连接地表示的方框实际上可以基本并行地执行,它们有时也可以按照相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或者流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
本领域技术人员可以理解,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,即使这样的组合或结合没有明确记载于本申请中。特别地,在不脱离本申请精神和教导的情况下,本申请的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,所有这些组合和/或结合均落入本申请公开的范围。
本文中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思路,并不用于限制本申请。对于本领域的技术人员来说,可以依据本发明的思路、精神和原则,在具体实施方式及应用范围上进行改变,其所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
Claims (10)
1.一种生成软件物料清单的方法,其特征在于,该方法包括:
监控到代码仓库中的源代码发生变化时,从所述源代码中查找第一依赖文件,将所述第一依赖文件中包含的第一依赖信息提取出来;所述代码仓库是软件项目对象开发时用于保存所述源代码的存储空间,所述源代码是所述软件项目对象在开发时创建的源代码,所述第一依赖文件是所述软件项目对象在开发时记录所述第一依赖信息的文件;所述第一依赖信息是所述源代码提供的依赖信息;
获取所述软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;所述配置文件是与编译构建相关的配置文件,所述构建日志是编译过程产生的构建日志,所述镜像信息是编译构建完成后产生的与镜像文件相关的信息,所述镜像文件是所述软件项目对象在编译构建完成后产生的文件;
解析所述配置文件,解析出所述配置文件包含的第二依赖信息时,从所述配置文件中提取出所述第二依赖信息;所述第二依赖信息是所述配置文件提供的依赖信息;
解析所述构建日志,解析出所述构建日志包含的第三依赖信息时,从所述构建日志中提取所述第三依赖信息;所述第三依赖信息是所述构建日志提供的依赖信息;
根据所述镜像信息从镜像仓库中确定对应的镜像文件,所述镜像仓库是所述软件项目对象在编译构建后用于保存所述镜像文件的存储空间;
解析所述镜像文件,解析出所述镜像文件包含的第四依赖信息时,从所述镜像文件中提取出所述第四依赖信息;所述第四依赖信息是所述镜像文件提供的依赖信息;
根据所述第一依赖信息、所述第二依赖信息、所述第三依赖信息和所述第四依赖信息生成第五依赖信息,对所述第五依赖信息进行数据处理,获得处理后的软件物料清单数据;
根据所述软件物料清单数据生成软件物料清单。
2.根据权利要求1所述的方法,其特征在于,所述监控到代码仓库中的源代码发生变化时,该方法进一步包括:
扫描所述源代码所在的目录结构,确定存在第六依赖信息,将所述第六依赖信息合并在所述第一依赖信息中,所述第六依赖信息是所述源代码提供的依赖信息。
3.根据权利要求1所述的方法,其特征在于,所述根据所述第一依赖信息、所述第二依赖信息、所述第三依赖信息和所述第四依赖信息生成第五依赖信息的步骤包括:
根据所述第二依赖信息对所述第一依赖信息进行修正得到第七依赖信息,或者将所述第一依赖信息和第二依赖信息合并生成所述第七依赖信息;
根据所述第三依赖信息对所述第七依赖信息进行修正得到第八依赖信息,或者将所述第三依赖信息和所述第七依赖信息合并生成所述第八依赖信息;
将所述第八依赖信息和所述第四依赖信息合并生成所述第五依赖信息。
4.根据权利要求1所述的方法,其特征在于,所述对所述第五依赖信息进行数据处理的步骤包括:
将所述第五依赖信息进行数据规范化处理和数据去重处理。
5.根据权利要求1所述的方法,其特征在于,所述对所述第五依赖信息进行数据处理的步骤进一步包括:
与事先设置的标准软件物料清单数据项相比,确定所述第五依赖信息中缺少的数据项;根据事先建立的软件物料清单机器学习模型对所述第五依赖信息中缺少的数据项进行补充,获得处理后的软件物料清单数据;所述软件物料清单机器学习模型是事先根据机器学习方法训练生成,用于对缺失数据项的依赖信息进行自动补充的模型。
6.根据权利要求1~5任一项所述的方法,其特征在于,
所述第一依赖信息包括依赖包名称、依赖包文件、依赖包版本信息、供应商名称、组织者名称、依赖包关联的网址;
所述第二依赖信息为所述第一依赖信息的修正信息或者补充信息;
所述第三依赖信息为所述依赖包版本信息中的一个具体版本号;
所述第四依赖信息包括操作系统依赖信息和开发语言依赖信息。
7.一种生成软件物料清单的装置,其特征在于,该装置包括:
源代码监控单元,用于监控到代码仓库中的源代码发生变化时,从所述源代码中查找第一依赖文件,将所述第一依赖文件中包含的第一依赖信息提取出来;所述代码仓库是软件项目对象开发时用于保存所述源代码的存储空间,所述源代码是所述软件项目对象在开发时创建的源代码,所述第一依赖文件是所述软件项目对象在开发时记录所述第一依赖信息的文件;所述第一依赖信息是所述源代码提供的依赖信息;
文件获取单元,用于获取所述软件项目对象在编译构建过程的配置文件、构建日志以及镜像信息;所述配置文件是与编译构建相关的配置文件,所述构建日志是编译过程产生的构建日志,所述镜像信息是编译构建完成后产生的与镜像文件相关的信息,所述镜像文件是所述软件项目对象在编译构建完成后产生的文件;
第一解析单元,用于解析所述配置文件,解析出所述配置文件包含的第二依赖信息时,从所述配置文件中提取出所述第二依赖信息;所述第二依赖信息是所述配置文件提供的依赖信息;
第二解析单元,用于解析所述构建日志,解析出所述构建日志包含的第三依赖信息时,从所述构建日志中提取所述第三依赖信息;所述第三依赖信息是所述构建日志提供的依赖信息;
第三解析单元,用于根据所述镜像信息从镜像仓库中确定对应的镜像文件,所述镜像仓库是所述软件项目对象在编译构建后用于保存所述镜像文件的存储空间;解析所述镜像文件,解析出所述镜像文件包含的第四依赖信息时,从所述镜像文件中提取出所述第四依赖信息;所述第四依赖信息是所述镜像文件提供的依赖信息;
数据生成单元,用于根据所述第一依赖信息、所述第二依赖信息、所述第三依赖信息和所述第四依赖信息生成第五依赖信息,对所述第五依赖信息进行数据处理,获得处理后的软件物料清单数据;
清单生成单元,用于根据所述软件物料清单数据生成软件物料清单。
8.根据权利要求7所述的装置,其特征在于,该装置进一步包括:
扫描单元,用于扫描所述源代码所在的目录结构,确定存在第六依赖信息,将所述第六依赖信息合并在所述第一依赖信息中,所述第六依赖信息是所述源代码提供的依赖信息。
9.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,所述指令被处理器执行时可实现权利要求1~6任一项所述的生成软件物料清单的方法的步骤。
10.一种计算机程序产品,包括计算机指令,所述计算机指令在被处理器执行时实施如上述权利要求1~6任一项所述的软件物料清单的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211275540.1A CN115658128A (zh) | 2022-10-18 | 2022-10-18 | 一种生成软件物料清单的方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211275540.1A CN115658128A (zh) | 2022-10-18 | 2022-10-18 | 一种生成软件物料清单的方法、装置及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115658128A true CN115658128A (zh) | 2023-01-31 |
Family
ID=84989272
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211275540.1A Pending CN115658128A (zh) | 2022-10-18 | 2022-10-18 | 一种生成软件物料清单的方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115658128A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115905895A (zh) * | 2023-03-08 | 2023-04-04 | 云加速(北京)科技有限公司 | 一种基于区块链的sbom标识聚类模型实现方法 |
CN116483435A (zh) * | 2023-06-19 | 2023-07-25 | 国网数字科技控股有限公司 | 一种软件物料清单的生成方法、装置和计算机可读介质 |
CN116756710A (zh) * | 2023-08-16 | 2023-09-15 | 深圳开源互联网安全技术有限公司 | 基于特征标记追踪技术的开源治理方法、系统及电子设备 |
-
2022
- 2022-10-18 CN CN202211275540.1A patent/CN115658128A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115905895A (zh) * | 2023-03-08 | 2023-04-04 | 云加速(北京)科技有限公司 | 一种基于区块链的sbom标识聚类模型实现方法 |
CN116483435A (zh) * | 2023-06-19 | 2023-07-25 | 国网数字科技控股有限公司 | 一种软件物料清单的生成方法、装置和计算机可读介质 |
CN116483435B (zh) * | 2023-06-19 | 2023-09-01 | 国网数字科技控股有限公司 | 一种软件物料清单的生成方法、装置和计算机可读介质 |
CN116756710A (zh) * | 2023-08-16 | 2023-09-15 | 深圳开源互联网安全技术有限公司 | 基于特征标记追踪技术的开源治理方法、系统及电子设备 |
CN116756710B (zh) * | 2023-08-16 | 2024-03-22 | 深圳开源互联网安全技术有限公司 | 基于特征标记追踪技术的开源治理方法、系统及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN115658128A (zh) | 一种生成软件物料清单的方法、装置及存储介质 | |
US8479161B2 (en) | System and method for performing software due diligence using a binary scan engine and parallel pattern matching | |
US8572093B2 (en) | System and method for providing a license description syntax in a software due diligence system | |
CN109376166B (zh) | 脚本转换方法、装置、计算机设备及存储介质 | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
CN108628751B (zh) | 一种无用依赖项检测方法及装置 | |
US20100242028A1 (en) | System and method for performing code provenance review in a software due diligence system | |
US20180060415A1 (en) | Language tag management on international data storage | |
Bezemer et al. | An empirical study of unspecified dependencies in make-based build systems | |
US20130117725A1 (en) | Using traceability links strength for software development integrity monitoring | |
Obbink et al. | An extensible approach for taming the challenges of JavaScript dead code elimination | |
US20130074039A1 (en) | Determining functional design/requirements coverage of a computer code | |
CN106469049B (zh) | 一种文件扫描的方法及装置 | |
CN111158674A (zh) | 组件管理方法、系统、设备及存储介质 | |
JP2022091685A (ja) | プログラミング言語コーパスの生成 | |
US7730451B2 (en) | Source server | |
CN113568604B (zh) | 风控策略的更新方法、装置及计算机可读存储介质 | |
CN110347573B (zh) | 应用程序分析方法、装置、电子设备及计算机可读介质 | |
US8719766B1 (en) | System and method for identifying and adding files to a project manifest | |
US10599424B2 (en) | Committed program-code management | |
CN109343855B (zh) | 基于指令伪装的程序编译抓取系统及方法 | |
US9396239B2 (en) | Compiling method, storage medium and compiling apparatus | |
US20190018663A1 (en) | Code lineage tool | |
CN115221047A (zh) | 测试用例自动生成方法及电子设备 | |
CN115168085A (zh) | 一种基于diff代码块匹配的重复冲突方案检测方法 |
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 |