安全看板指南

CAST 可以从 SARIF 扫描结果生成静态 HTML 合规看板,并将其发布到 GitHub Pages——无需外部服务,无需 SaaS 账号。

看板展示内容

每个 SARIF 文件在看板中对应一行:

说明
项目 / 工具 SARIF 文件名 + 生成该文件的工具
状态 🟢 通过 / 🔴 失败 / 🟡 警告
严重 SARIF error 级别发现数量
高危 SARIF warning 级别发现数量
中危 SARIF note 级别发现数量
详情 可展开的单条发现列表

页头显示总计数量以及上次扫描运行的提交 SHA。


配置步骤

第一步 — 启用 GitHub Pages

在您的仓库中:Settings → Pages → Source: GitHub Actions

第二步 — 添加发布工作流

mkdir -p .github/workflows
curl -o .github/workflows/publish-dashboard.yml \
  https://raw.githubusercontent.com/castops/cast/main/templates/github/publish-dashboard.yml

或从 CAST 仓库复制:

templates/github/publish-dashboard.yml → .github/workflows/publish-dashboard.yml

第三步 — 复制看板脚本

mkdir -p dashboard
curl -o dashboard/generate.py \
  https://raw.githubusercontent.com/castops/cast/main/dashboard/generate.py
curl -o dashboard/template.html \
  https://raw.githubusercontent.com/castops/cast/main/dashboard/template.html

第四步 — 提交并推送

git add .github/workflows/publish-dashboard.yml dashboard/
git commit -m "ci: add CAST security dashboard"
git push

看板将在每次 CAST DevSecOps 流水线运行完成后自动发布。


工作原理

CAST DevSecOps pipeline
  ├── sast job     → uploads cast-sarif-sast artifact (semgrep.sarif)
  └── container job → uploads cast-sarif-container artifact (trivy.sarif)

publish-dashboard workflow (triggered on workflow_run: completed)
  ├── downloads all cast-sarif-* artifacts
  ├── runs python dashboard/generate.py
  └── deploys _site/index.html to GitHub Pages

workflow_run 触发器确保看板仅在完整流水线运行结束后发布,而非在每次推送时发布。


在本地生成看板

# Place your SARIF files in sarif-results/
mkdir -p sarif-results
cp path/to/semgrep.sarif sarif-results/
cp path/to/trivy.sarif sarif-results/

# Generate
python dashboard/generate.py

# Open
open dashboard/index.html

选项:

python dashboard/generate.py --help

  --sarif-dir DIR    Directory containing .sarif files (default: sarif-results)
  --output FILE      Output HTML path (default: dashboard/index.html)
  --commit SHA       Commit SHA to display in header

自定义看板

模板文件位于 dashboard/template.html,使用纯 HTML 和内联 CSS——无需构建步骤,无需 npm,无需 webpack。

若要自定义颜色,编辑 :root 中的 CSS 变量:

:root {
  --green: #3fb950;   /* PASS badge color */
  --red: #f85149;     /* FAIL badge color */
  --yellow: #d29922;  /* WARN badge color */
}

若要添加列(如扫描器版本),请扩展 generate.py 并在模板中添加对应的 <th>/<td>


多仓库看板

若要将多个仓库的发现结果汇总到一个看板:

  1. 让每个仓库使用唯一前缀上传 SARIF 制品:
    - uses: actions/upload-artifact@v4
      with:
        name: cast-sarif-myrepo-sast
        path: semgrep.sarif
  2. 在一个中心 dashboard 仓库中,使用 gh run download 或 GitHub API 从所有仓库下载制品,然后运行 generate.py

此方式需要一个具有对每个仓库 actions:read 权限的 GitHub 令牌。