Skip to content
Integrations

GitHub Action

Drop-in CI attestation for releases. banchelabs/vitrified-action hashes your artifact, submits it, and emits the proof bundle as a workflow artifact.

GitHub Action

banchelabs/vitrified-action is the official GitHub Action for attestation in CI. It hashes a local artifact (or set of artifacts), submits each to the Vitrified API with metadata derived from the workflow context (commit SHA, ref, run number, builder identity), and emits the proof bundle as a workflow artifact.

Minimum example

name: Release

on:
  push:
    tags: ["v*"]

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write
    steps:
      - uses: actions/checkout@v4

      - name: Build
        run: ./scripts/build.sh

      - name: Attest the release archive
        uses: banchelabs/vitrified-action@v1
        with:
          api-key: ${{ secrets.VITRIFIED_API_KEY }}
          artifact: ./dist/release.tar.gz
          schema: slsa.provenance.v1

The action emits the proof bundle as a workflow artifact named vitrified-bundle-<sha>.json.

Multiple artifacts

- uses: banchelabs/vitrified-action@v1
  with:
    api-key: ${{ secrets.VITRIFIED_API_KEY }}
    artifact: |
      ./dist/release-linux.tar.gz
      ./dist/release-darwin.tar.gz
      ./dist/release-windows.zip
    schema: slsa.provenance.v1

Each artifact is submitted independently; one bundle per artifact is emitted.

OIDC builder identity

When permissions.id-token: write is set, the action requests a GitHub OIDC token and includes the resulting builder identity in the SLSA provenance predicate. No long-lived signing keys required.

Releases attaching the bundle

To attach the bundle to a GitHub Release alongside the artifact:

- uses: banchelabs/vitrified-action@v1
  id: attest
  with:
    api-key: ${{ secrets.VITRIFIED_API_KEY }}
    artifact: ./dist/release.tar.gz
    schema: slsa.provenance.v1

- uses: softprops/action-gh-release@v1
  with:
    files: |
      ./dist/release.tar.gz
      ${{ steps.attest.outputs.bundle-path }}

Downstream consumers can verify the release with the vitrified CLI:

gh release download v1.2.3 --pattern "vitrified-bundle-*.json"
vitrified verify ./vitrified-bundle-*.json

CI gates

To fail a workflow if the bundle doesn't fully verify:

- name: Verify bundle
  run: |
    npm install -g @vitrified/cli
    vitrified verify ${{ steps.attest.outputs.bundle-path }} --output json | jq -e '.isVerified'

Inputs

InputDescriptionDefault
api-keyVitrified API key (required).
artifactPath or glob of artifacts to attest (required).
schemaMetadata schema to declare.slsa.provenance.v1
wait-for-bundleWait for the bundle before exiting (true) or fire-and-forget (false).true
bundle-output-pathPath where the bundle JSON is written../vitrified-bundle.json
base-urlAPI base URL override.https://api.vitrified.glass

Outputs

OutputDescription
submission-idThe submission ID returned by the API.
bundle-pathFilesystem path to the emitted bundle JSON.
verdictverified / partial / failed once the bundle is verified.

Source

integrations/github-action/ — full action source and tests.

Was this page helpful?