Skip to main content
CI pipelines upload evidence to LaneSync so the EVIDENCING stage can verify quality gates and power scorecards. Bootstrapped workflows do this with the LaneSync upload action — your CI writes standard report files, and LaneSync normalizes them server-side.
LaneSync receives report files only — never your source code. This is identical on Full and Lite (Minimal) plans. The upload action strips code snippets from SARIF before sending, and tool-generated coverage HTML (which embeds source files) is never uploaded — LaneSync renders the coverage view from the parsed coverage numbers instead.

Overview

The action runs on your development branch (environment dev), release branches (staging), and published releases (production). Pull request runs skip the upload.

Bootstrapped workflow

During bootstrap LaneSync pushes a language-specific CI workflow plus the upload action to .github/actions/lanesync-upload/action.yml. The workflow’s last step is:
if: always() uploads evidence even when tests fail, so failures are recorded for audit. The upload itself never fails your build — problems appear as workflow warnings and in the job summary.
Self-hosted customers set the SDLC_API_URL repository variable. See Enterprise self-hosting.

Action inputs

Outputs: evidence-id and upload-status (success | failed | skipped).

Supported report formats

The action picks up these files from the workspace root (or standard build directories) automatically: Coverage format is detected from file content, so a mislabeled file is still parsed correctly. Files larger than 5 MB are skipped with a warning. LaneSync derives unit test counts, the coverage percentage, and SAST/CVE counts from the parsed reports, so the evidence badge, the detail view, and your sdlc.yaml quality gates always agree. SARIF severities follow the same grading as Semgrep/OpenGrep and GitHub code scanning: A numeric security-severity always wins over the level. A result without a level inherits the rule’s defaultConfiguration.level, then warning (SARIF §3.27.10). Bootstrapped workflows scan source only: OpenGrep excludes .github, coverage/, the generated unit-tests.html/integration-tests.html, and the language’s build and dependency directories (build, target, dist, node_modules, vendor, …). Tool-generated report HTML and third-party code never count against your SAST gates. Trivy reports every severity (CRITICAL,HIGH,MEDIUM,LOW) so the max_medium gate can be enforced. Gradle workflows resolve a gradle.lockfile for the scan when none is committed, because Trivy reads Gradle dependencies only from lockfiles.

Report views

The View full report and Download links on the Quality Insights page serve self-contained HTML that LaneSync renders from the parsed reports: unit tests (failures first, with messages and stack traces), coverage (lowest-covered files first), SAST findings, and CVEs (most severe first, with fixed versions). Each page records the repository, version, environment, and CI run, so a downloaded copy is self-describing audit evidence. Views open in a sandboxed page with no scripts. Code snippets are never stored.

Authentication

LaneSync API key

  1. A workspace admin creates a key in Settings → System → CI API Keys
  2. Store it as the repository secret LANESYNC_API_KEY
  3. The bootstrapped workflow passes it to the action via api-key
When using an API key, the org in the payload must match the key’s workspace.

GitHub Actions OIDC

When no API key is set, the action requests a short-lived GitHub OIDC token with audience lanesync. The job needs:
No long-lived secrets are required — the token is cryptographically bound to the repository. Tenant is always derived from the verified token or API key, never from an unauthenticated org field.

POST /api/evidence/upload

Auth: Authorization: Bearer <lsk_* API key | OIDC JWT> Required fields: org, repo, version, pipeline, metrics The body may be sent gzip-compressed with Content-Encoding: gzip (the action always does). The decompressed body may be up to 25 MB.
Response:
The action retries network errors, 429, and 5xx up to three times; other statuses are reported once as a warning.

Upload a single test report

POST /api/evidence/upload-report — multipart form, file field report. Same CI auth required. Use this for ad-hoc JUnit uploads outside the standard pipeline.

Pipeline identity

Set the upload action pipeline input to the exact GitHub check name for that workflow (the same name you list under required_checks in sdlc.yaml). Bootstrapped CI always produces unit-tests.html, integration-tests.html, and coverage/index.html (placeholders on empty repos) so day-zero bootstrap never blocks, and uploads them together with sast.sarif, trivy.json, and the native test and coverage reports as a workflow artifact. That artifact stays in your GitHub account; coverage/index.html is not sent to LaneSync.

Custom pipelines

If you maintain your own workflow instead of the LaneSync template:

Add LaneSync to an existing CI pipeline

Emit standard reports from your tests and scanners, then add the upload action as the last step.

Troubleshooting

See API Reference for full endpoint documentation.