repo_health/README.md

4.7 KiB
Raw Permalink Blame History

开源软件项目仓库的健康度量与寿命预测

背景

本次赛题背景基于开源软件生态系统下软件代码仓库的健康度量问题。现代软件开发、维护和运行的全生命周期都无不依赖于其他软件或第三方库,得益于现代软件开发生态中开源已逐步成为开发者的共识,同时各大软件代码托管平台(如 GitHub功能的日趋完善开发人员从代码托管平台上重用代码、引入依赖已成为当前开发活动的大势所趋。Synopsys 在其年度《开源安全与风险分析报告》OSSRAR中对 17 个不同应用领域的1700 余个代码库进行了分析,发现 76% 的代码库是开源的,同时其中 96% 使用了第三方开源组件。尽管开源软件作为可依赖项为软件开发与支持提供了便利,但并非是百分百可靠的。作为第三方开发和维护的软件产品,依赖项是否会被停止维护、抑或是何时会被停止维护,都无从被使用依赖的开发者所详细知晓,我们称软件仓库不再被开发者维护和更新的现象称为项目弃用。社区存在更好的替代软件、缺乏继续演进的动力、开发人员流失等各种原因都会致使代码库弃用问题的产生。由于软件交错复杂的相互依赖性,一个小量级项目弃用的影响往往会超出单个软件项目的范围,依赖于已弃用版本库的软件系统容易出现安全漏洞和兼容性问题,甚至导致整个软件系统的级联故障,进而威胁软件系统生态的健康和稳定。因此,对软件代码仓库的健康程度进行度量和评估对于开源生态系统的稳定具有十分重要的意义。

数据集

我们提取了GitHub平台上从2011年到2023年star数超过32的103,354个开源软件代码仓库的仓库属性和历史活动信息构成整合数据集详见本项目仓库数据集一栏),分为"Repositories_with_label.csv"和"Repositories_with_statistics.csv"两个文件前者包括代码仓库的静态基本信息包括stargazer/CountcreatedAt/updatedAt/pushedAt/isArchived/isFork/archivedAt/isTemplate/licenseInfo/primaryLanguage/repositoryTopics/description以及是否被弃用(deprecated)的标签信息后者则包括本次整合数据集所挖掘到的不同仓库在生命周期每个月内的动态数据包括每月新增的commits/issues/prs/stars/tags/comments数等。这些特征数据分别从不同角度在一定程度上反映着代码仓库的状态蕴藏着其健康程度的信息。

当然,在提供的数据集之外,参赛者可以使用公开数据集如World of CodeWorld of Code数据集是全网Git仓库代码提交数据的大集合收集了来自GitHub、GitLab、BitBucket等十余个代码托管平台的Git提交数据并进行了开发者去重、索引等处理步骤和GHArchive等也可进一步挖掘其他任意可以通过公开渠道获取的数据例如从X(Twitter)、LinkedIn、IRC等平台上挖掘和收集数据

为便于有需要的参赛者扩充数据集将GHArchive数据集的相关信息及其使用方法简要介绍如下。

GHArchive也可参考GHArchive官方网站

说明

GHArchive数据集保存了2011年2月至今GitHub平台所有的 时间线API 数据,包括提交、议题、评论等,是开源平台社交协作数据良好的数据源。当前GHArchive包含75亿条数据来自6900万个GitHub用户占用空间500GB。

使用
Clickhouse

ClickHouse是一种具有高性能的列式存储关系型数据库。ClickHouse团队维护了GHArchive数据集的副本数据集的结构和使用方法可以参考ClickHouse文档。数据集可以使用在线Playground或ClickHouse客户端进行连接

clickhouse-client --secure --host play.clickhouse.com --user explorer

ClickHouse能以秒级的速度执行复杂的SQL查询

SELECT
    toYear(created_at),
    count(*),
    bar(count(*), 0, 1290803070, 30)
FROM gharchive.github_events
GROUP BY toYear(created_at)

并能够查询结果导出为CSV文件

SELECT *
FROM gharchive.github_events
WHERE (event_type = 7) AND (title ILIKE '%release_note%') AND (action = 'opened') AND (actor_login NOT ILIKE '%bot%')
INTO OUTFILE '/tmp/issues_release_notes.csv'
FORMAT CSVWithNames

注意ClickHouse使用的SQL语法 不是ANSI SQL的超集 , 与MySQL等差别较大具体请参考 ClickHouse SQL Reference