eventb-rossi/rossi-action
GitHub: eventb-rossi/rossi-action
在 GitHub Actions CI 中对 Event-B 形式化模型执行验证、格式检查与静态构建,并以行内注释和 SARIF 报告形式呈现发现结果的 GitHub Action。
Stars: 0 | Forks: 0
# Rossi Event-B Validator — GitHub Action
在 CI 中使用 [rossi](https://github.com/eventb-rossi/rossi) 检查 Event-B 模型:
安装经过验证的二进制文件,在你的模型上运行 `validate` / `fmt --check` / `build`,
将每一项发现内联标注出来,并可选择将一次 SARIF 运行上传至
code scanning。
```
- uses: eventb-rossi/rossi-action@v1
with:
path: models/
```
这会安装最新的 rossi 发行版,验证 `models/`,将每一项
发现标注在相应的出错的行上,并在出现任何错误时使步骤失败。
## 用法
### 同时对建议性 lint 进行拦截
建议性 lint(`EB011` 死变量,`EB012` 未修改的变量,
`EB014` 未完成初始化,`EB023` 被遮蔽的名称)是警告,默认情况下
不会导致运行失败:
```
- uses: eventb-rossi/rossi-action@v1
with:
path: models/
deny-warnings: "true"
```
### 将发现结果上传至 code scanning
```
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v7
- uses: eventb-rossi/rossi-action@v1
with:
path: models/
sarif: "true"
upload-sarif: "true"
category: rossi
```
无论接收到多少文件、目录和压缩包,rossi 都会生成**完全一致的一次 SARIF 运行**,这正是
[code scanning 所要求的][sarif-runs] —— 运行共享同一类别的上传会被
拒绝。如果你从同一个代码库上传了不止一份分析报告,请为
每一份指定独立的 `category`。
`sarif` 是由 validate 验证过程生成的,因此 `commands` 必须包含 `validate`。
在未包含此项的情况下请求报告会导致错误,而不是在 Security 标签页中留下
一个静默的空状态。
对于来自(**from**)fork 的拉取请求,上传操作会被跳过,因为它们无法被授予
`security-events: write` 权限;但在这种情况下,发现结果仍会以注释的形式显示。
### 同时检查格式化与静态构建
```
- uses: eventb-rossi/rossi-action@v1
with:
path: models/
commands: validate,fmt-check,build
```
`build` 的执行单元是一个**项目 (project)**:将其指向某个项目目录或 `.zip` 文件,
而不是一组散碎的组件,否则每一个跨组件的引用都会失效。该
action 会拒绝这种拆分方式,而不会将原本正确的模型报告为损坏。
对于项目目录或 `.zip` 文件,`validate` 已经运行了与
`build` 相同的语义检查,并会附带规则 ID 和位置进行报告,而 `build` 仅输出纯文本——因此在那里添加 `build` 多半只是在对相同的
模型进行第二次检查。`build` 的真正价值在于处理**松散的** `.eventb` 文件:`validate`
没有可以用来解析它的项目,因此会跳过这些检查,所以未解析的
`SEES` 仅会由 `build` 报告。
### 收集发现结果而不使任务失败
```
- uses: eventb-rossi/rossi-action@v1
id: rossi
with:
path: models/
fail-on-error: "false"
- run: echo "${{ steps.rossi.outputs.error-count }} errors"
```
## 输入
| 输入 | 默认值 | 描述 |
|---|---|---|
| `path` | `.` | 要检查的模型:文件、解压后的项目目录,或 Rodin `.zip` 压缩包。以空格分隔;支持扩展 glob。 |
| `version` | latest | 要安装的 rossi 版本,不包含前缀 `v`。 |
| `rossi-path` | – | 使用现有的二进制文件,而不是下载。相对路径会基于工作区根目录进行解析,因此搭配 `working-directory` 使用时也能正常工作。 |
| `commands` | `validate` | 以逗号分隔:`validate`、`fmt-check`、`build`。`build` 需要指向项目根目录。 |
| `deny-warnings` | `false` | 遇到建议性 lint 和错误时均判定为失败。 |
| `annotations` | `true` | 输出内联的 `::error` / `::warning` 注释。 |
| `sarif` | `false` | 生成 SARIF 报告。要求 `commands` 中包含 `validate`。 |
| `sarif-file` | `rossi.sarif` | 报告的写入位置。 |
| `category` | `rossi` | SARIF 运行的分析类别。 |
| `upload-sarif` | `false` | 将报告上传至 code scanning。 |
| `working-directory` | `.` | 运行 rossi 的目录;`path` 相对于此目录。 |
| `fail-on-error` | `true` | 发现问题时使步骤失败,包括“在 `path` 下未找到 Event-B 组件”。 |
## 输出
| 输出 | 描述 |
|---|---|
| `valid` | 当 rossi 未报告任何失败时为 `"true"`。 |
| `error-count` | 错误严重级别的发现数量。 |
| `warning-count` | 建议性发现结果的数量。 |
| `sarif-file` | SARIF 报告的路径,当 `sarif` 关闭时为空。 |
| `rossi-version` | 实际运行的 rossi 版本。 |
## 版本的选择方式
该 action 会安装最新的 rossi 发行版,并会根据该发行版的
`SHA256SUMS` 进行校验;如果某个发行版没有校验清单,将会被拒绝安装,
而不是在未经验证的情况下安装。设置 `version:` 则可以安装指定的具体版本。
## 环境要求
`bash`、`curl` 和 `jq` —— 在 Linux、macOS 和 Windows 的 GitHub 托管的
runner 上均已预装。在这三种操作系统上均提供了适用于 x86-64 和 arm64 架构的预编译二进制文件。
## 许可证
采用 [Apache 2.0](LICENSE-APACHE) 和 [MIT](LICENSE-MIT) 双重许可,与
rossi 相同。
标签:Event-B, GitHub Action, 应用安全, 形式化验证, 静态检查