跳转至

GitHub Actions 中的静态分析

该最小工作流构建一个小的 JavaScript 应用程序,在不执行文件的情况下分析其文件,并上传机器可读结果。它使用现有的 CLI,而不是单独的 GitHub Action 或 MCP 客户端。它不承诺支持每个 REA 提供程序。

运行示例

  1. 将示例复制到你仓库中的 .github/workflows/rea-analysis.yml,并提交到默认分支。这个自包含的演示不需要现有的应用程序或包清单。
  2. 如有必要,启用 GitHub Actions。在 Actions 选项卡中选择 REA static analysis example,然后选择 Run workflow。
  3. 运行后下载 rea-analysis 工件。其文件如下:
文件 含义
analysis.json 原始 CLI JSON,成功时包含完整 Evidence,或当发出错误报告时包含该错误报告。
analysis.stderr 原始诊断/进度;当没有内容时,空文件是正常的。
exit-code.txt 原始分析进程的退出码。

该示例固定了 Node.js 24.22.1、REA 6.7.0 以及 action 的提交修订版本。它将 REA 安装到 runner 的临时目录中,而不是更改应用程序的依赖项。这样固定的是工具版本,而不是每个传递性 npm 依赖;如果你的集成需要更强的依赖可复现性保证,请使用经过审查并已提交的 package lock 和 npm ci。

先决条件与信任

该 runner 是 GitHub 托管的 Ubuntu 24.04,带有 Bash、npm 和来自 procps 的 ps。其他 Linux 镜像必须提供 procps;REA 的受监督进程控制会使用它。此静态 JavaScript 操作不需要 Hopper、Ghidra、IDA、Java、浏览器、Docker、GPU、外部 API 密钥或用户提供的 GitHub secret。该工作流仅请求 contents: read;工件上传使用 runner 正常的 Actions 凭据。

用你经过审查的构建替换 Build a known artifact,并将 ARTIFACT_PATH 设置为其应用程序目录(相对于检出路径)或一个 ASAR。该演示会创建自己的小型应用程序;如果执行,它会故意抛出错误。REA 以静态方式读取它。你替换的构建本身可以执行代码:请单独审查它,并且不要将不受信任的拉取请求构建添加到特权 pull_request_target 工作流中。该示例是手动触发的,不是不受信任 PR 的执行策略。

报告可能包含路径、URL、来源派生的事实以及调用者选择的数据。只分析你有权共享的工件并发布报告。不要依赖 REA 从其名称中推断机密信息。请检查你仓库的工件访问和保留策略;该示例将报告保留七天。

失败、部分结果和不支持的能力

分析步骤分别捕获 stdout 和 stderr,记录 $?,并以相同的状态退出。没有 continue-on-error、|| true、输出过滤器或管道可以使失败的分析变绿。在 checkout 或其他易出错步骤之前,工作流会在 RUNNER_TEMP 下创建一个全新的报告目录。分析和上传都使用该目录,绝不使用已检入的 reports/rea 或其他工作区文件。当该目录已准备好时,上传步骤使用 always(),因此可用的诊断信息在分析失败后仍会保留。如果在分析开始前安装或构建失败,该目录为空,上传会发出警告,而不是发布过时的结果或凭空生成成功结果。runner 丢失或取消仍可能阻止上传。

--json --full-output 选择机器可读的封装;它并不意味着分析已完成。成功的操作可能保留部分分析、未知项和限制。退出码为零并不是安全判定、完整覆盖的证明,也不是针对这些发现的策略门禁。在做出此类决定之前,请检查保存的 Evidence 和覆盖情况。参见输出与退出状态。

非零退出码可能表示无效输入、工具不可用、不受支持的主机/能力或其他操作失败。保留原始 JSON 错误(如果已发出)、stderr 和退出码,并使用它们的类别/消息进行诊断。早期的启动失败可能会让 analysis.json 为空;不要将其解析为成功的分析。选择受支持的操作,或显式提供其文档化的先决条件;不要静默切换提供程序、执行工件,或为了获得绿色(成功)的任务而忽略失败。

要演练失败路径,请在不更改演示构建的情况下,临时将 ARTIFACT_PATH 设置为 build/missing-artifact。分析必须失败,exit-code.txt 必须非零,并且可用的报告仍然必须上传。要演练不支持的输入,请将 ARTIFACT_PATH 设置为 build/rea-ci-demo/index.js:此操作接受应用程序目录或 ASAR,而不是单个源文件。保留的 JSON 错误的类别为 unsupported_target;该步骤以非零退出。在正常使用该示例之前,请恢复正确的路径。

要演练部分分析,请在演示的 JavaScript 后追加 export const broken = ;。REA 6.7.0 会保留 data.normalized_result.statistics.parse_failures 和不完整覆盖率限制,而操作仍可以以零退出。检查这些事实,而不是将进程成功视为完整覆盖。在所有三种情况下,报告 JSON 和诊断信息都保持未过滤状态。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea