宣布 issuebot

F-Droid 是一个对自由开源软件(FOSS)充满热情的机器人,现在 F-Droid 有了新的帮手:issuebot!它以在 RFP 议题跟踪器运行的一组脚本开始,对人们在打包请求中提交的信息进行一些自动检查。作为跟踪跟踪器项目的一部分,我们与 F-Droid 的 fdroiddata 和 RFP 的维护者和贡献者进行了交谈,以了解 issuebot 可以如何帮助他们。一个关键目标是让人们能够为应用审核做出贡献,即使他们在任何意义上都不是 Android 开发者。这可以通过使 issuebot 自动运行尽可能多的核心构建过程和审查工具来实现,然后 issuebot 在 RFP 问题或 fdroiddata 合并请求的线程中显示该信息作为回复。我们想出了很多种方式呈现这些信息,最终决定将 issuebot 集成到 F-Droid 贡献者和社区成员审核应用的现有工作流程中:GitLab 项目。这些信息总是会有一些出乎我们意料的用途,并且数据已经被集成到一起了,所以 issuebot 还包括一个 JSON API。

现在 issuebot 是一个成熟的自动机器,从源 URL 开始,构建 APK 应用文件,扫描源代码和 APK 以查找问题,并将报告发布到 gitlab.com。这已经在审查应用提交和向提交者提供反馈方面提高了人力效率。

RFP 议题

任何人都可以向 F-Droid 提交“打包请求” (RFP) 或应用合并请求。大多数互联网用户都熟悉基本的用户体验,因为它是围绕用户帐户和提交文本的表单构建的。这意味着 RFP 问题跟踪器的熟悉技术的用户较少。鉴于 issuebot 的相对简单性,目标必须是帮助审阅者与提交者进行交流。熟悉技术的提交者将能够关注 issuebot 帖子,在其他情况下,F-Droid 贡献者可以将不熟悉技术的提交者指向 issuebot 报告中的信息以突出问题。只要他们提供指向源代码存储库或 Android APK 应用文件的链接,issuebot 就可以自行提供有用的评论。它还提供了大量信息,使人工审阅者的工作更加轻松。RFP 议题中提交的应用可能包含多种技术方法和编码环境。没有审阅者具备所有这些技能,因此使审阅者能够快速找到他们认为有资格审阅的提交内容非常重要。此外,issuebot 可以自动检测到很多东西。因此,我们为 issuebot 构建了一个彩色标签系统,以添加到每个提交中。从这些标签中,审阅者可以快速选择他们熟悉的平台,例如。Flutter。他们还可以查看提交是否存在可能取消其资格的明显问题,例如需要专有库或已知的跟踪服务。

来自 RFP issuebot 的标签

GitLab 问题标签还提供了一个简单的界面,用于管理 issuebot 何时在议题上运行。issuebot 按计划运行以扫描所有新提交并将其报告直接发布到议题或合并请求。一旦 issuebot 完成发布其报告,它会将 fdroid-bot 标签添加到议题中。这告诉 issuebot 在以后的运行中忽略该议题。要允许 issuebot 再次在议题上运行,请删除 fdroid-bot 标签。在下一次运行中,issuebot 将从头开始进行整个审查。

fdroiddata 合并请求

对于应用合并请求,我们关注参与提交、审查和接受合并请求的人员。因此,我们假设你具备 GitLab、Git 以及如何构建 Android 应用的基本工作知识。在这种情况下,issuebot 响应合并请求中包含的代码的更改。通常,当应用提交到 fdroiddata 时,必须更改它们才能正确构建并符合 F-Droid 标准。在这种情况下,issuebot 的技术性帖子直接与应用提交者对话。F-Droid 贡献者定期审查合并请求,并可以提供合并请求参与者所期望的反馈和帮助。

添加报纸 taz 的新应用的这个合并请求 就是用户体验的一个很好的例子。在 issuebot 开始审查合并请求之前,它作为“正在进行的工作”提交。它收到了 F-Droid 贡献者的评论和反馈。提交者进行了更改,然后 issuebot 介入并在每次更新时向提交者提供反馈。

issuebot 审查合并请求

不幸的是,目前没有关于合并请求的标签。GitLab API 的技术限制意味着像在 RFP 问题跟踪器中一样添加标签并不容易实现。为合并请求添加标签需要“开发者”权限,这也将允许 issuebot 帐户修改代码。为了保持 issuebot 的攻击面可维护,它暂时不发布标签。

JSON API

issuebot 还在当前 HTML 报告的基础上提供了 JSON API,因此任何 Web 应用都可以在自己的用户体验中使用这些数据。这可以与我们的其他开发 API 结合使用,例如 buildserver 状态 API。有两个入口点:

这是应用 ID 入口点的一个片段,它显示了 issuebot 为一个特定的应用运行。有两次运行,包括最近的一次。较新的版本具有来自首次运行以来添加的更多模块的结果。

  "at.roteskreuz.stopcorona": [
    {
      "issueId": 1319,
      "jobId": "925261691",
      "modules": [
        "925261691/1319/active-hostnames.py.json",
        "925261691/1319/check-for-translation-service.py.json",
        "925261691/1319/dependencies-scrape.py.json",
        "925261691/1319/fastlane.py.json",
        "925261691/1319/fdroid-scan-apk.py.json",
        "925261691/1319/fdroid-scanner.py.json",
        "925261691/1319/gradle-productFlavors.py.json",
        "925261691/1319/gradle-wrapper.py.json",
        "925261691/1319/links-to-services.py.json",
        "925261691/1319/sdk.py.json",
        "925261691/1319/suspicious-names.py.json",
      ],
      "successfulBuilds": []
    },
    {
      "issueId": 1319,
      "jobId": "600681223",
      "modules": [
        "600681223/1319/check-for-translation-service.py.json",
        "600681223/1319/dependencies-scrape.py.json",
        "600681223/1319/fastlane.py.json",
        "600681223/1319/fdroid-scan-apk.py.json",
        "600681223/1319/fdroid-scanner.py.json",
        "600681223/1319/gradle-productFlavors.py.json",
        "600681223/1319/gradle-wrapper.py.json"
        "600681223/1319/sdk.py.json",
        "600681223/1319/suspicious-names.py.json",
      ]
    }
  ],

最终条目是 issuebot 在一次特定运行中在一个特定应用中看到的目录,由 GitLab CI 作业 ID 标识。其中包括运行的 issuebot 模块的 JSON 输出的相对路径列表。现在开始使用 API 的最简单方法是从 GitLab CI 作业下载整个文件集合:转到 RFP 流水线并单击最右边侧栏中的最新下载链接。

未来的工作

下一步是将更多关键信息链接在一起,以提供对跟踪器 SDK 和主机名的可靠和具体的跟踪。Exodus 隐私数据库现在提供代码签名、网络签名和 API 密钥 ID。issuebot 模块从包含 API 密钥 ID 等内容的 AndroidManifest.xml 中抓取域名、库依赖项和元数据。现在有许多令人兴奋的可能性应该很容易实现,因为基础工作已经就绪。

我们设想的一个似乎仍然引人注目的想法是一个专门的网络应用,用于提交应用请求并获取有关评论、负面特征、构建、隐私泄露等的信息。这有可能大大降低人们更多地参与通过 F-Droid 提交和审查过程获取他们使用的应用的过程的技术门槛。很明显,这本身就是一个规模相对较大的项目,所以我们在构建 issuebot 时将其放在一边并牢记在心。

这项工作得到了 NLnet 的 NGI Zero PET 基金的支持。