targets/linux/deb/distro/worker.go (74 lines of code) (raw):
package distro
import (
"context"
"encoding/json"
"github.com/Azure/dalec"
"github.com/Azure/dalec/frontend"
"github.com/containerd/platforms"
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/client/llb/sourceresolver"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
)
func (cfg *Config) HandleWorker(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) {
sOpt, err := frontend.SourceOptFromClient(ctx, client, platform)
if err != nil {
return nil, nil, err
}
p := platforms.DefaultSpec()
if platform != nil {
p = *platform
}
pc := llb.Platform(p)
st, err := cfg.Worker(sOpt, pc)
if err != nil {
return nil, nil, err
}
def, err := st.Marshal(ctx, pc)
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
}
_, _, dt, err := client.ResolveImageConfig(ctx, cfg.ImageRef, sourceresolver.Opt{
Platform: platform,
})
if err != nil {
return nil, nil, err
}
var cfg dalec.DockerImageSpec
if err := json.Unmarshal(dt, &cfg); err != nil {
return nil, nil, err
}
return ref, &cfg, nil
})
}
func (cfg *Config) Worker(sOpt dalec.SourceOpts, opts ...llb.ConstraintsOpt) (llb.State, error) {
opts = append(opts, dalec.ProgressGroup("Prepare worker image"))
if cfg.ContextRef != "" {
st, err := sOpt.GetContext(cfg.ContextRef, dalec.WithConstraints(opts...))
if err != nil {
return llb.Scratch(), err
}
if st != nil {
return *st, nil
}
}
base := frontend.GetBaseImage(sOpt, cfg.ImageRef, opts...).
Run(
dalec.WithConstraints(opts...),
AptInstall(cfg.BuilderPackages, opts...),
dalec.WithMountedAptCache(cfg.AptCachePrefix),
).
// This file prevents installation of things like docs in ubuntu
// containers We don't want to exclude this because tests want to
// check things for docs in the build container. But we also don't
// want to remove this completely from the base worker image in the
// frontend because we usually don't want such things in the build
// environment. This is only needed because certain tests (which
// are using this customized builder image) are checking for files
// that are being excluded by this config file.
File(llb.Rm("/etc/dpkg/dpkg.cfg.d/excludes", llb.WithAllowNotFound(true)), opts...)
return base, nil
}