GitLab CI 集成指南
CAST 同时支持 GitLab CI 和 GitHub Actions。使用 cast init --platform gitlab 生成 .gitlab-ci.yml,或直接引入远程模板。
快速开始
方式 A — 使用 CLI
pip install castops
cast init --platform gitlab
CAST 自动检测您的项目类型并生成 .gitlab-ci.yml。
方式 B — 远程引入(无需安装)
在您的 .gitlab-ci.yml 中添加:
include:
- remote: 'https://raw.githubusercontent.com/castops/cast/main/src/cast_cli/templates/gitlab/python/devsecops.yml'
将 python 替换为 nodejs 或 go 以匹配您的技术栈。
安装内容
该流水线在两个阶段中添加六个作业:
| 阶段 | 作业 | 工具 | 是否阻断流水线? |
|---|---|---|---|
cast-scan |
cast-secrets |
Gitleaks | 是 |
cast-scan |
cast-sast |
Semgrep | 否(由门禁评估) |
cast-scan |
cast-sca |
pip-audit / npm audit / govulncheck | 是 |
cast-scan |
cast-container |
Trivy | 否(由门禁评估) |
cast-scan |
cast-quality |
Ruff / ESLint / staticcheck | 否(仅作参考) |
cast-gate |
cast-gate |
conftest | 是 |
GitLab 安全看板集成
Semgrep 结果通过 sast 制品报告类型上报——它们会自动出现在 GitLab 的安全与合规 → 安全看板中。
Trivy 结果通过 container_scanning 上报——它们将显示在合并请求的容器扫描报告中。
策略自定义
门禁作业使用 conftest 通过 OPA Rego 策略评估 SARIF 发现结果。
默认行为:若发现任何 CRITICAL 级别(SARIF level 为 error)的问题则阻断。
覆盖策略:在仓库中创建 policy/ 目录:
policy/
default.rego ← CAST looks here first
或将 CAST_POLICY CI/CD 变量设置为 default、strict 或 permissive:
variables:
CAST_POLICY: strict # block on HIGH + CRITICAL
详情请参阅 策略参考。
合并请求集成
当流水线在合并请求上触发时:
- 并行运行所有安全扫描
- 在差异视图中内联展示 Semgrep 发现结果
- 将容器扫描结果发布到 MR 安全小部件
- 若门禁作业失败则阻止 MR 合并
扩展流水线
由于模板使用以 cast- 为前缀的阶段名(cast-scan、cast-gate),您可以添加自己的阶段而不会产生冲突:
include:
- remote: 'https://raw.githubusercontent.com/castops/cast/main/src/cast_cli/templates/gitlab/python/devsecops.yml'
stages:
- cast-scan
- cast-gate
- test # your own stage
- deploy
my-tests:
stage: test
script: pytest
故障排查
cast-sca 报错"找不到 requirements 文件"
pip-audit 会查找 requirements*.txt。若您仅使用 pyproject.toml,请添加:
cast-sca:
script:
- pip install --quiet pip-audit
- pip install -e .
- pip-audit
cast-container 运行但 Dockerfile 已存在
该作业使用 trivy fs(文件系统扫描)而非构建并扫描镜像,因此不需要 Docker 守护进程。若要扫描构建好的镜像,请使用 Docker-in-Docker 配置覆盖该作业。
门禁通过但安全看板中有发现结果
门禁默认仅阻断 CRITICAL 级别的发现。将 CAST_POLICY: strict 设置为也对 HIGH 级别发现进行阻断。