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.

01 · Setup

3 steps.

01Add the build step

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"]
02Archive the report (optional)

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"]
03Optional: keep the results in Scrutora

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 }}"
02 · What you get

After the first run.

Native build step

The scanner image is the step. No plugin, no Docker-in-Docker.

Build gating

A non-zero fail-on severity fails the build and blocks the pipeline.

SARIF to GCS

Archive the report to a bucket via the artifacts block.

Works in restricted pools

Fully offline, so it runs in VPC-SC and private pools with no egress.

03 · Questions

The ones people actually ask.

Does it work in private / VPC-SC pools?

Yes. The scan runs entirely offline inside the step, so it works in restricted build pools with no outbound access.

Which frameworks are supported?

DPDPA, HIPAA, GDPR, PCI-DSS, RBI and more, set the --frameworks flag.

Is it free?

Yes, the CI scanning is free with no API key or account.

View config on GitHub