package tests import ( "encoding/json" "os" "path/filepath" "testing" "github.com/containerd/continuity/fs/fstest" "github.com/docker/buildx/util/gitutil" "github.com/moby/buildkit/util/testutil/integration" "github.com/stretchr/testify/require" ) func bakeCmd(sb integration.Sandbox, opts ...cmdOpt) (string, error) { opts = append([]cmdOpt{withArgs("bake", "--progress=quiet")}, opts...) cmd := buildxCmd(sb, opts...) out, err := cmd.CombinedOutput() return string(out), err } var bakeTests = []func(t *testing.T, sb integration.Sandbox){ testBakeLocal, testBakeLocalMulti, testBakeRemote, testBakeRemoteCmdContext, testBakeRemoteLocalOverride, testBakeLocalCwdOverride, testBakeRemoteCmdContextOverride, testBakeRemoteContextSubdir, testBakeRemoteCmdContextEscapeRoot, testBakeRemoteCmdContextEscapeRelative, testBakeRemoteDockerfileCwd, testBakeRemoteLocalContextRemoteDockerfile, testBakeEmpty, testBakeShmSize, testBakeUlimits, testBakeRefs, } func testBakeLocal(t *testing.T, sb integration.Sandbox) { dockerfile := []byte(` FROM scratch COPY foo /foo `) bakefile := []byte(` target "default" { } `) dir := tmpdir( t, fstest.CreateFile("docker-bake.hcl", bakefile, 0600), fstest.CreateFile("Dockerfile", dockerfile, 0600), fstest.CreateFile("foo", []byte("foo"), 0600), ) dirDest := t.TempDir() cmd := buildxCmd(sb, withDir(dir), withArgs("bake", "--progress=plain", "--set", "*.output=type=local,dest="+dirDest)) out, err := cmd.CombinedOutput() require.NoError(t, err, string(out)) require.Contains(t, string(out), `#1 [internal] load local bake definitions`) require.Contains(t, string(out), `#1 reading docker-bake.hcl`) require.FileExists(t, filepath.Join(dirDest, "foo")) } func testBakeLocalMulti(t *testing.T, sb integration.Sandbox) { dockerfile := []byte(` FROM scratch COPY foo /foo `) bakefile := []byte(` target "default" { } `) composefile := []byte(` services: app: build: {} `) dir := tmpdir( t, fstest.CreateFile("docker-bake.hcl", bakefile, 0600), fstest.CreateFile("compose.yaml", composefile, 0600), fstest.CreateFile("Dockerfile", dockerfile, 0600), fstest.CreateFile("foo", []byte("foo"), 0600), ) dirDest := t.TempDir() cmd := buildxCmd(sb, withDir(dir), withArgs("bake", "--progress=plain", "--set", "*.output=type=local,dest="+dirDest)) dt, err := cmd.CombinedOutput() require.NoError(t, err, string(dt)) require.Contains(t, string(dt), `#1 [internal] load local bake definitions`) require.Contains(t, string(dt), `#1 reading compose.yaml`) require.Contains(t, string(dt), `#1 reading docker-bake.hcl`) require.FileExists(t, filepath.Join(dirDest, "foo")) dirDest2 := t.TempDir() out, err := bakeCmd(sb, withDir(dir), withArgs("--file", "cwd://docker-bake.hcl", "--set", "*.output=type=local,dest="+dirDest2)) require.NoError(t, err, out) require.FileExists(t, filepath.Join(dirDest2, "foo")) } func testBakeRemote(t *testing.T, sb integration.Sandbox) { bakefile := []byte(` target "default" { dockerfile-inline = < /shmsize FROM scratch COPY --from=build /shmsize / `) bakefile := []byte(` target "default" { shm-size = "128m" } `) dir := tmpdir( t, fstest.CreateFile("docker-bake.hcl", bakefile, 0600), fstest.CreateFile("Dockerfile", dockerfile, 0600), ) dirDest := t.TempDir() out, err := bakeCmd( sb, withDir(dir), withArgs("--set", "*.output=type=local,dest="+dirDest), ) require.NoError(t, err, out) dt, err := os.ReadFile(filepath.Join(dirDest, "shmsize")) require.NoError(t, err) require.Contains(t, string(dt), `size=131072k`) } func testBakeUlimits(t *testing.T, sb integration.Sandbox) { dockerfile := []byte(` FROM busybox AS build RUN ulimit -n > first > /ulimit FROM scratch COPY --from=build /ulimit / `) bakefile := []byte(` target "default" { ulimits = ["nofile=1024:1024"] } `) dir := tmpdir( t, fstest.CreateFile("docker-bake.hcl", bakefile, 0600), fstest.CreateFile("Dockerfile", dockerfile, 0600), ) dirDest := t.TempDir() out, err := bakeCmd( sb, withDir(dir), withArgs("--set", "*.output=type=local,dest="+dirDest), ) require.NoError(t, err, out) dt, err := os.ReadFile(filepath.Join(dirDest, "ulimit")) require.NoError(t, err) require.Contains(t, string(dt), `1024`) } func testBakeRefs(t *testing.T, sb integration.Sandbox) { dockerfile := []byte(` FROM scratch COPY foo /foo `) bakefile := []byte(` target "default" { } `) dir := tmpdir( t, fstest.CreateFile("docker-bake.hcl", bakefile, 0600), fstest.CreateFile("Dockerfile", dockerfile, 0600), fstest.CreateFile("foo", []byte("foo"), 0600), ) dirDest := t.TempDir() outFlag := "default.output=type=docker" if sb.DockerAddress() == "" { // there is no Docker atm to load the image outFlag += ",dest=" + dirDest + "/image.tar" } cmd := buildxCmd(sb, withDir(dir), withArgs("bake", "--metadata-file", filepath.Join(dirDest, "md.json"), "--set", outFlag)) out, err := cmd.CombinedOutput() require.NoError(t, err, out) dt, err := os.ReadFile(filepath.Join(dirDest, "md.json")) require.NoError(t, err) type mdT struct { Default struct { BuildRef string `json:"buildx.build.ref"` } `json:"default"` } var md mdT err = json.Unmarshal(dt, &md) require.NoError(t, err) require.NotEmpty(t, md.Default.BuildRef) }