frontend/debug/handle_cargohome.go (47 lines of code) (raw):
package debug
import (
"context"
"github.com/Azure/dalec"
"github.com/Azure/dalec/frontend"
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/frontend/gateway/client"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
)
const keyCargohomeWorker = "context:cargohome-worker"
// Cargohome outputs all the Cargo dependencies for the spec
func Cargohome(ctx context.Context, client gwclient.Client) (*client.Result, error) {
return frontend.BuildWithPlatform(ctx, client, func(ctx context.Context, client gwclient.Client, platform *ocispecs.Platform, spec *dalec.Spec, targetKey string) (gwclient.Reference, *dalec.DockerImageSpec, error) {
sOpt, err := frontend.SourceOptFromClient(ctx, client, platform)
if err != nil {
return nil, nil, err
}
inputs, err := client.Inputs(ctx)
if err != nil {
return nil, nil, err
}
// Allow the client to override the worker image
// This is useful for keeping pre-built worker images, especially for CI.
worker, ok := inputs[keyCargohomeWorker]
if !ok {
worker = llb.Image("rust:latest", llb.WithMetaResolver(client)).
Run(llb.Shlex("cargo --version")).Root()
}
st, err := spec.CargohomeDeps(sOpt, worker, dalec.Platform(platform))
if err != nil {
return nil, nil, err
}
def, err := st.Marshal(ctx)
if err != nil {
return nil, nil, err
}
res, err := client.Solve(ctx, gwclient.SolveRequest{
Definition: def.ToPB(),
})
if err != nil {
return nil, nil, err
}
ref, err := res.SingleRef()
if err != nil {
return nil, nil, err
}
return ref, &dalec.DockerImageSpec{}, nil
})
}