diff --git a/frontend/dockerfile/dockerfile_provenance_test.go b/frontend/dockerfile/dockerfile_provenance_test.go index 2d737511e570..94f1374db0b1 100644 --- a/frontend/dockerfile/dockerfile_provenance_test.go +++ b/frontend/dockerfile/dockerfile_provenance_test.go @@ -862,3 +862,40 @@ RUN --mount=type=secret,id=mysecret --mount=type=secret,id=othersecret --mount=t require.Equal(t, "default", pred.Invocation.Parameters.SSH[0].ID) require.True(t, pred.Invocation.Parameters.SSH[0].Optional) } + +func testNilProvenance(t *testing.T, sb integration.Sandbox) { + integration.CheckFeatureCompat(t, sb, integration.FeatureProvenance) + ctx := sb.Context() + + c, err := client.New(ctx, sb.Address()) + require.NoError(t, err) + defer c.Close() + + f := getFrontend(t, sb) + + dockerfile := []byte(` +FROM scratch +ENV FOO=bar +`) + dir, err := integration.Tmpdir( + t, + fstest.CreateFile("Dockerfile", dockerfile, 0600), + ) + require.NoError(t, err) + + _, err = f.Solve(sb.Context(), c, client.SolveOpt{ + LocalDirs: map[string]string{ + builder.DefaultLocalNameDockerfile: dir, + builder.DefaultLocalNameContext: dir, + }, + FrontendAttrs: map[string]string{ + "attest:provenance": "mode=max", + }, + Exports: []client.ExportEntry{ + { + Type: client.ExporterImage, + }, + }, + }, nil) + require.NoError(t, err) +} diff --git a/frontend/dockerfile/dockerfile_test.go b/frontend/dockerfile/dockerfile_test.go index 336995cd4a11..f99ff1181d54 100644 --- a/frontend/dockerfile/dockerfile_test.go +++ b/frontend/dockerfile/dockerfile_test.go @@ -154,6 +154,7 @@ var allTests = integration.TestFuncs( testClientFrontendProvenance, testClientLLBProvenance, testSecretSSHProvenance, + testNilProvenance, testSBOMScannerArgs, ) diff --git a/solver/llbsolver/proc/provenance.go b/solver/llbsolver/proc/provenance.go index e6116c2eaafd..1af3af196028 100644 --- a/solver/llbsolver/proc/provenance.go +++ b/solver/llbsolver/proc/provenance.go @@ -32,6 +32,10 @@ func ProvenanceProcessor(attrs map[string]string) llbsolver.Processor { return nil, errors.Errorf("no build info found for provenance %s", p.ID) } + if cp == nil { + continue + } + ref, ok := res.FindRef(p.ID) if !ok { return nil, errors.Errorf("could not find ref %s", p.ID)