diff --git a/.github/workflows/test-os.yml b/.github/workflows/test-os.yml index d60a90a072e39..6ba76c37cc26b 100644 --- a/.github/workflows/test-os.yml +++ b/.github/workflows/test-os.yml @@ -33,6 +33,7 @@ jobs: platform: - windows/amd64 - freebsd/amd64 + - darwin/arm64 steps: - name: Prepare diff --git a/Dockerfile b/Dockerfile index 6444e97670144..e3669959b6b54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -175,6 +175,7 @@ COPY --link --from=buildctl /usr/bin/buildctl / COPY --link --from=buildkitd /usr/bin/buildkitd / FROM scratch AS binaries-darwin +COPY --link --from=buildkitd /usr/bin/buildkitd / COPY --link --from=buildctl /usr/bin/buildctl / FROM scratch AS binaries-windows diff --git a/cmd/buildkitd/main_containerd_worker.go b/cmd/buildkitd/main_containerd_worker.go index aae5f98db158a..be9e0a575c394 100644 --- a/cmd/buildkitd/main_containerd_worker.go +++ b/cmd/buildkitd/main_containerd_worker.go @@ -1,6 +1,3 @@ -//go:build linux || windows || freebsd -// +build linux windows freebsd - package main import ( diff --git a/executor/oci/spec_darwin.go b/executor/oci/spec_darwin.go new file mode 100644 index 0000000000000..fbcaff1912041 --- /dev/null +++ b/executor/oci/spec_darwin.go @@ -0,0 +1,64 @@ +package oci + +import ( + "github.com/containerd/containerd/mount" + "github.com/containerd/containerd/oci" + "github.com/containerd/continuity/fs" + "github.com/docker/docker/pkg/idtools" + "github.com/moby/buildkit/solver/pb" + "github.com/opencontainers/runtime-spec/specs-go" + "github.com/pkg/errors" +) + +func withProcessArgs(args ...string) oci.SpecOpts { + return oci.WithProcessArgs(args...) +} + +func generateMountOpts(_, _ string) []oci.SpecOpts { + return nil +} + +func generateSecurityOpts(mode pb.SecurityMode, _ string, _ bool) ([]oci.SpecOpts, error) { + return nil, nil +} + +func generateProcessModeOpts(mode ProcessMode) ([]oci.SpecOpts, error) { + return nil, nil +} + +func generateIDmapOpts(idmap *idtools.IdentityMapping) ([]oci.SpecOpts, error) { + if idmap == nil { + return nil, nil + } + return nil, errors.New("no support for IdentityMapping on Darwin") +} + +func generateRlimitOpts(ulimits []*pb.Ulimit) ([]oci.SpecOpts, error) { + if len(ulimits) == 0 { + return nil, nil + } + return nil, errors.New("no support for POSIXRlimit on Darwin") +} + +// tracing is not implemented on Darwin +func getTracingSocketMount(_ string) *specs.Mount { + return nil +} + +// tracing is not implemented on Darwin +func getTracingSocket() string { + return "" +} + +func cgroupV2NamespaceSupported() bool { + return false +} + +func sub(m mount.Mount, subPath string) (mount.Mount, func() error, error) { + src, err := fs.RootPath(m.Source, subPath) + if err != nil { + return mount.Mount{}, nil, err + } + m.Source = src + return m, func() error { return nil }, nil +} diff --git a/snapshot/localmounter_darwin.go b/snapshot/localmounter_darwin.go new file mode 100644 index 0000000000000..1b20e931d71c6 --- /dev/null +++ b/snapshot/localmounter_darwin.go @@ -0,0 +1,67 @@ +package snapshot + +import ( + "os" + + "github.com/containerd/containerd/mount" + "github.com/pkg/errors" + "golang.org/x/sys/unix" +) + +func (lm *localMounter) Mount() (string, error) { + lm.mu.Lock() + defer lm.mu.Unlock() + + if lm.mounts == nil && lm.mountable != nil { + mounts, release, err := lm.mountable.Mount() + if err != nil { + return "", err + } + lm.mounts = mounts + lm.release = release + } + + if len(lm.mounts) == 1 && lm.mounts[0].Type == "bind" { + ro := false + for _, opt := range lm.mounts[0].Options { + if opt == "ro" { + ro = true + break + } + } + if !ro { + return lm.mounts[0].Source, nil + } + } + + dir, err := os.MkdirTemp("", "buildkit-mount") + if err != nil { + return "", errors.Wrap(err, "failed to create temp dir") + } + + if err := mount.All(lm.mounts, dir); err != nil { + os.RemoveAll(dir) + return "", errors.Wrapf(err, "failed to mount %s: %+v", dir, lm.mounts) + } + lm.target = dir + return dir, nil +} + +func (lm *localMounter) Unmount() error { + lm.mu.Lock() + defer lm.mu.Unlock() + + if lm.target != "" { + if err := mount.UnmountRecursive(lm.target, unix.MNT_FORCE); err != nil { + return err + } + os.RemoveAll(lm.target) + lm.target = "" + } + + if lm.release != nil { + return lm.release() + } + + return nil +} diff --git a/source/git/source_darwin.go b/source/git/source_darwin.go new file mode 100644 index 0000000000000..afce094119fa0 --- /dev/null +++ b/source/git/source_darwin.go @@ -0,0 +1,12 @@ +package git + +import ( + "context" + "errors" + "os/exec" + "runtime" +) + +func runWithStandardUmask(_ context.Context, _ *exec.Cmd) error { + return errors.New("runWithStandardUmask not supported on " + runtime.GOOS) +} diff --git a/util/network/netproviders/network_nobridge.go b/util/network/netproviders/network_nobridge.go index 1edde9b38d904..748545ccd1d6a 100644 --- a/util/network/netproviders/network_nobridge.go +++ b/util/network/netproviders/network_nobridge.go @@ -1,5 +1,5 @@ -//go:build freebsd || windows -// +build freebsd windows +//go:build !linux +// +build !linux package netproviders