targets/windows/handler.go (95 lines of code) (raw):
package windows
import (
"context"
"encoding/json"
"github.com/Azure/dalec"
"github.com/Azure/dalec/frontend"
"github.com/Azure/dalec/targets/linux/deb/distro"
"github.com/containerd/platforms"
"github.com/moby/buildkit/client/llb/sourceresolver"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
bktargets "github.com/moby/buildkit/frontend/subrequests/targets"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
)
const (
DefaultTargetKey = "windowscross"
outputKey = "windows"
workerImgRef = "mcr.microsoft.com/mirror/docker/library/ubuntu:jammy"
WindowscrossWorkerContextName = "dalec-windowscross-worker"
)
var (
distroConfig = &distro.Config{
ImageRef: workerImgRef,
AptCachePrefix: aptCachePrefix,
VersionID: "ubuntu22.04",
ContextRef: WindowscrossWorkerContextName,
BuilderPackages: []string{
"aptitude",
"build-essential",
"binutils-mingw-w64",
"g++-mingw-w64-x86-64",
"gcc",
"git",
"make",
"pkg-config",
"zip",
"aptitude",
"dpkg-dev",
"debhelper",
},
}
)
func Handle(ctx context.Context, client gwclient.Client) (*gwclient.Result, error) {
var mux frontend.BuildMux
defaultPlatform := platforms.DefaultSpec()
defaultPlatform.OS = "windows"
mux.Add("zip", frontend.WithDefaultPlatform(defaultPlatform, handleZip), &bktargets.Target{
Name: "zip",
Description: "Builds binaries combined into a zip file",
})
mux.Add("container", frontend.WithDefaultPlatform(defaultPlatform, handleContainer), &bktargets.Target{
Name: "container",
Description: "Builds binaries and installs them into a Windows base image",
Default: true,
})
mux.Add("worker", handleWorker, &bktargets.Target{
Name: "worker",
Description: "Builds the base worker image responsible for building the package",
})
return mux.Handle(ctx, client)
}
func 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, nil)
if err != nil {
return nil, nil, err
}
st, err := distroConfig.Worker(sOpt)
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
}
_, _, dt, err := client.ResolveImageConfig(ctx, workerImgRef, sourceresolver.Opt{})
if err != nil {
return nil, nil, err
}
var img dalec.DockerImageSpec
if err := json.Unmarshal(dt, &img); err != nil {
return nil, nil, err
}
ref, err := res.SingleRef()
if err != nil {
return nil, nil, err
}
return ref, &img, nil
})
}