targets/linux/deb/distro/distro.go (102 lines of code) (raw):

package distro import ( "context" "encoding/json" "github.com/Azure/dalec" "github.com/Azure/dalec/frontend" "github.com/Azure/dalec/targets/linux" "github.com/moby/buildkit/client/llb" "github.com/moby/buildkit/client/llb/sourceresolver" gwclient "github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/frontend/subrequests/targets" ocispecs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" ) var ( defaultRepoConfig = &dalec.RepoPlatformConfig{ ConfigRoot: "/etc/apt/sources.list.d", GPGKeyRoot: "/usr/share/keyrings", ConfigExt: ".list", } ) type Config struct { ImageRef string ContextRef string VersionID string AptCachePrefix string BuilderPackages []string RepoPlatformConfig *dalec.RepoPlatformConfig DefaultOutputImage string // ExtraRepos is used by distributions that want to enable extra repositories // that are not inthe base worker config. // A prime example of this is adding Debian backports on debian distributions. ExtraRepos []dalec.PackageRepositoryConfig } func (cfg *Config) BuildImageConfig(ctx context.Context, sOpt dalec.SourceOpts, spec *dalec.Spec, platform *ocispecs.Platform, targetKey string) (*dalec.DockerImageSpec, error) { img, err := resolveConfig(ctx, sOpt, spec, platform, targetKey) if err != nil { return nil, err } if err := dalec.BuildImageConfig(spec, targetKey, img); err != nil { return nil, err } return img, nil } func resolveConfig(ctx context.Context, sOpt dalec.SourceOpts, spec *dalec.Spec, platform *ocispecs.Platform, targetKey string) (*dalec.DockerImageSpec, error) { bi, err := spec.GetSingleBase(targetKey) if err != nil { return nil, err } if bi == nil { return dalec.BaseImageConfig(platform), nil } dt, err := bi.ResolveImageConfig(ctx, sOpt, sourceresolver.Opt{ Platform: platform, }) if err != nil { return nil, errors.Wrap(err, "error resolving base image config") } var img dalec.DockerImageSpec if err := json.Unmarshal(dt, &img); err != nil { return nil, errors.Wrap(err, "error unmarshalling base image config") } return &img, nil } func (cfg *Config) RepoMounts(repos []dalec.PackageRepositoryConfig, sOpt dalec.SourceOpts, opts ...llb.ConstraintsOpt) (llb.RunOption, error) { opts = append(opts, dalec.ProgressGroup("Prepare custom repos")) repoConfig := cfg.RepoPlatformConfig if repoConfig == nil { repoConfig = defaultRepoConfig } withRepos, err := dalec.WithRepoConfigs(repos, repoConfig, sOpt, opts...) if err != nil { return nil, err } withData, err := dalec.WithRepoData(repos, sOpt, opts...) if err != nil { return nil, err } keyMounts, _, err := dalec.GetRepoKeys(repos, repoConfig, sOpt, opts...) if err != nil { return nil, err } return dalec.WithRunOptions(withRepos, withData, keyMounts), nil } func (cfg *Config) Handle(ctx context.Context, client gwclient.Client) (*gwclient.Result, error) { var mux frontend.BuildMux mux.Add("deb", linux.HandlePackage(cfg), &targets.Target{ Name: "deb", Description: "Builds a deb package.", Default: true, }) mux.Add("testing/container", linux.HandleContainer(cfg), &targets.Target{ Name: "testing/container", Description: "Builds a container image for testing purposes only.", }) mux.Add("dsc", cfg.HandleSourcePkg, &targets.Target{ Name: "dsc", Description: "Builds a Debian source package.", }) mux.Add("worker", cfg.HandleWorker, &targets.Target{ Name: "worker", Description: "Builds the worker image.", }) return mux.Handle(ctx, client) }