in targets/linux/distro_handler.go [122:184]
func HandlePackage(cfg DistroConfig) gwclient.BuildFunc {
return func(ctx context.Context, client gwclient.Client) (*gwclient.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) {
if err := cfg.Validate(spec); err != nil {
return nil, nil, fmt.Errorf("rpm: invalid spec: %w", err)
}
pg := dalec.ProgressGroup("Building " + targetKey + " package: " + spec.Name)
sOpt, err := frontend.SourceOptFromClient(ctx, client, platform)
if err != nil {
return nil, nil, err
}
pc := dalec.Platform(platform)
worker, err := cfg.Worker(sOpt, pg, pc)
if err != nil {
return nil, nil, errors.Wrap(err, "error building worker container")
}
pkgSt, err := cfg.BuildPkg(ctx, client, worker, sOpt, spec, targetKey, pg, pc)
if err != nil {
return nil, nil, err
}
def, err := pkgSt.Marshal(ctx, pc)
if err != nil {
return nil, nil, fmt.Errorf("error marshalling llb: %w", 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
}
if err := ref.Evaluate(ctx); err != nil {
return ref, nil, err
}
ctr, err := cfg.BuildContainer(ctx, client, worker, sOpt, spec, targetKey, pkgSt, pg, pc)
if err != nil {
return ref, nil, err
}
if ref, err := cfg.RunTests(ctx, client, worker, spec, sOpt, ctr, targetKey, pg, pc); err != nil {
cfg, _ := BuildImageConfig(ctx, sOpt, spec, platform, targetKey)
return ref, cfg, err
}
if platform == nil {
p := platforms.DefaultSpec()
platform = &p
}
return ref, &dalec.DockerImageSpec{Image: ocispecs.Image{Platform: *platform}}, nil
})
}
}