Google Cloud Build
Cloud Build runs the scanner image directly as a build step, no plugin, no Docker-in-Docker, and it works in restricted pools with no egress. Your code never leaves the build.
3 steps.
Reference the scanner image as a step in your cloudbuild.yaml. Cloud Build runs it directly, no Docker-in-Docker.
steps:
- name: "ghcr.io/nirvahana/dpdp-scan@sha256:71e306bdab91587e01ed6b83a1d2c3baecf4c55ecf880b440a5ab76fe85eb461"
args: ["scan", ".", "--no-ai",
"--frameworks", "dpdpa,hipaa",
"--fail-on", "high",
"--sarif-output", "scrutora.sarif"]Publish the SARIF to a GCS bucket with the build artifacts block so the report is kept alongside your build.
artifacts:
objects:
location: "gs://YOUR_BUCKET/scrutora/"
paths: ["scrutora.sarif"]By default nothing leaves your runner, which is why the scan above needs no account and no key. Add --upload and the scan posts its RESULTS to your Scrutora account when it finishes: the findings, the data map, the RoPA entries and the dependency inventory travel, your source never does. Paid plans only; the scan itself stays free forever. Store the key as a secret (GitHub: Actions secret, GitLab: masked CI variable, Bitbucket: repository variable, CircleCI: context, Azure: pipeline secret, Cloud Build: Secret Manager) and expose it as SCRUTORA_API_KEY so it never reaches your build log. Repository, commit, branch and PR number are read from the CI environment, and the scan is filed under a project named after the repository unless you pass --project. Re-running the same commit returns the scan already stored rather than adding a second one, so a retried pipeline does not distort the trend line. If the upload fails, the build result is unchanged: the scan already gave its verdict, and the step logs a warning rather than failing the job. On GitHub Actions you can set upload: true on the action itself instead of running the container by hand, and read the resulting scan id from the scan-id output.
docker run --rm -v "$PWD:/src" -w /src \
-e SCRUTORA_API_KEY \
ghcr.io/nirvahana/dpdp-scan@sha256:71e306bdab91587e01ed6b83a1d2c3baecf4c55ecf880b440a5ab76fe85eb461 \
scan . --no-ai \
--frameworks dpdpa,hipaa \
--json-output scrutora.json \
--output scrutora-report.pdf \
--upload
# SCRUTORA_API_KEY is read from the environment, never passed on the command
# line, so it stays out of your build log. Add --project "my-service" to file
# the scan somewhere other than a project named after the repository.
# ── GitHub Actions: use the action's own inputs instead ─────────────────────
# - id: scan
# uses: scrutora/scrutora-scan@v1
# with:
# upload: true
# api-key: ${{ secrets.SCRUTORA_API_KEY }}
# - run: echo "Synced as ${{ steps.scan.outputs.scan-id }}"After the first run.
The scanner image is the step. No plugin, no Docker-in-Docker.
A non-zero fail-on severity fails the build and blocks the pipeline.
Archive the report to a bucket via the artifacts block.
Fully offline, so it runs in VPC-SC and private pools with no egress.