0 articles opened

Part V · Adoption · CI/CD · p. 58–59

Gates people do not disable

CI is where security tooling goes to be turned off. The difference is entirely in how you introduce it.

A pull request is not a scan report. It is a social object with a merge button. The CI scene: report lands where dashboards already live, gate fails at high on new findings, and the install step is pinned like any other supply-chain dependency.

GitHub Actions — in production, do not curl-pipe-shell in CI. Pin a version.
securegit scan . \
  --format sarif --report-output securegit.sarif \
  --baseline .securegit/baseline.json \
  --fail-on high
GitLab — the sast artifact lights up the security dashboard and MR widget.
securegit scan . --format gitlab --report-output gl-sast-report.json \
  --baseline .securegit/baseline.json --fail-on high

The four-stage introduction

  1. Advisory, informational. Scan runs, prints findings, always exits zero. One week minimum.
  2. Advisory, annotated. Findings appear as PR annotations. Still non-blocking.
  3. Blocking on new findings only. Scan the diff, not the tree. This is the sustainable steady state for most teams.
  4. Blocking on total. Only after the backlog is burned down. Many teams never reach this and should not feel bad about it.
GateScopeThresholdSpeed
Pre-commitstaged onlyhighunder a second
Pre-pushpush rangecriticalseconds
PR / CIdiff vs. mainhighseconds
Nightlyfull tree, all pluginsreport onlyminutes
Releasefull tree + SBOM + CVEcriticalminutes
Findings count measures your codebase. Disable rate measures your adoption. Only one of them tells you whether the tool will still be here next quarter.