GitLab CI/CD

Add the CI/CD Catalog component to your pipeline and every merge request gets an offline compliance scan with a SARIF artifact. No API key, and your code never leaves your runner.

01 · Setup

3 steps.

01Add the component

Reference the Scrutora component in your .gitlab-ci.yml. It runs on merge requests and pushes.

include:
  - component: gitlab.com/scrutora-group/scrutora-scan/scan@~latest
    inputs:
      frameworks: dpdpa,hipaa
      fail_on: high        # none|low|medium|high|critical
02Run the pipeline

The scan runs offline in the job and writes a SARIF artifact you can download or wire into your merge-request workflow. With fail_on set, a finding at or above that severity fails the pipeline and blocks the merge.

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.

Merge-request gating

fail_on stops non-compliant changes before they merge.

SARIF artifact

Standard SARIF v2.1.0 attached to the job for download or downstream tooling.

Obligation citations

Each finding maps to the exact DPDPA/HIPAA/GDPR obligation.

SaaS or self-managed

Runs offline on GitLab.com or your own runners, with no egress required.

03 · Questions

The ones people actually ask.

Does it work on self-managed GitLab?

Yes. The scan runs entirely inside the job container, so it works on GitLab.com and self-managed instances, including air-gapped runners.

Which frameworks can I scan for?

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

Is it free?

Yes, the CI scanning is free with no API key. The Scrutora platform adds cloud posture, consent, RoPA and audit evidence.

GitLab CI/CD Catalog