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 替换为 nodejsgo 以匹配您的技术栈。


安装内容

该流水线在两个阶段中添加六个作业:

阶段 作业 工具 是否阻断流水线?
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 变量设置为 defaultstrictpermissive

variables:
  CAST_POLICY: strict   # block on HIGH + CRITICAL

详情请参阅 策略参考


合并请求集成

当流水线在合并请求上触发时:

  1. 并行运行所有安全扫描
  2. 在差异视图中内联展示 Semgrep 发现结果
  3. 将容器扫描结果发布到 MR 安全小部件
  4. 若门禁作业失败则阻止 MR 合并

扩展流水线

由于模板使用以 cast- 为前缀的阶段名(cast-scancast-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 级别发现进行阻断。