Merge pull request #1840 from jedevc/fix-check-path-for-bake-cmd-context
commit
696770d29c
@ -0,0 +1,265 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"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){
|
||||||
|
testBakeRemote,
|
||||||
|
testBakeRemoteCmdContext,
|
||||||
|
testBakeRemoteCmdContextOverride,
|
||||||
|
testBakeRemoteContextSubdir,
|
||||||
|
testBakeRemoteCmdContextEscapeRoot,
|
||||||
|
testBakeRemoteCmdContextEscapeRelative,
|
||||||
|
}
|
||||||
|
|
||||||
|
func testBakeRemote(t *testing.T, sb integration.Sandbox) {
|
||||||
|
bakefile := []byte(`
|
||||||
|
target "default" {
|
||||||
|
dockerfile-inline = <<EOT
|
||||||
|
FROM scratch
|
||||||
|
COPY foo /foo
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
dir := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
|
||||||
|
fstest.CreateFile("foo", []byte("foo"), 0600),
|
||||||
|
)
|
||||||
|
dirDest := t.TempDir()
|
||||||
|
|
||||||
|
git, err := gitutil.New(gitutil.WithWorkingDir(dir))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
gitutil.GitInit(git, t)
|
||||||
|
gitutil.GitAdd(git, t, "docker-bake.hcl", "foo")
|
||||||
|
gitutil.GitCommit(git, t, "initial commit")
|
||||||
|
addr := gitutil.GitServeHTTP(git, t)
|
||||||
|
|
||||||
|
out, err := bakeCmd(sb, withDir(dir), withArgs(addr, "--set", "*.output=type=local,dest="+dirDest))
|
||||||
|
require.NoError(t, err, out)
|
||||||
|
|
||||||
|
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testBakeRemoteCmdContext(t *testing.T, sb integration.Sandbox) {
|
||||||
|
bakefile := []byte(`
|
||||||
|
target "default" {
|
||||||
|
context = BAKE_CMD_CONTEXT
|
||||||
|
dockerfile-inline = <<EOT
|
||||||
|
FROM scratch
|
||||||
|
COPY foo /foo
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
dirSpec := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
|
||||||
|
)
|
||||||
|
dirSrc := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("foo", []byte("foo"), 0600),
|
||||||
|
)
|
||||||
|
dirDest := t.TempDir()
|
||||||
|
|
||||||
|
git, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
gitutil.GitInit(git, t)
|
||||||
|
gitutil.GitAdd(git, t, "docker-bake.hcl")
|
||||||
|
gitutil.GitCommit(git, t, "initial commit")
|
||||||
|
addr := gitutil.GitServeHTTP(git, t)
|
||||||
|
|
||||||
|
out, err := bakeCmd(sb, withDir(dirSrc), withArgs(addr, "--set", "*.output=type=local,dest="+dirDest))
|
||||||
|
require.NoError(t, err, out)
|
||||||
|
|
||||||
|
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testBakeRemoteCmdContextOverride(t *testing.T, sb integration.Sandbox) {
|
||||||
|
bakefile := []byte(`
|
||||||
|
target "default" {
|
||||||
|
context = BAKE_CMD_CONTEXT
|
||||||
|
dockerfile-inline = <<EOT
|
||||||
|
FROM scratch
|
||||||
|
COPY foo /foo
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
dirSpec := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
|
||||||
|
)
|
||||||
|
dirSrc := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("foo", []byte("foo"), 0600),
|
||||||
|
)
|
||||||
|
dirDest := t.TempDir()
|
||||||
|
|
||||||
|
gitSpec, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
|
||||||
|
require.NoError(t, err)
|
||||||
|
gitutil.GitInit(gitSpec, t)
|
||||||
|
gitutil.GitAdd(gitSpec, t, "docker-bake.hcl")
|
||||||
|
gitutil.GitCommit(gitSpec, t, "initial commit")
|
||||||
|
addrSpec := gitutil.GitServeHTTP(gitSpec, t)
|
||||||
|
|
||||||
|
gitSrc, err := gitutil.New(gitutil.WithWorkingDir(dirSrc))
|
||||||
|
require.NoError(t, err)
|
||||||
|
gitutil.GitInit(gitSrc, t)
|
||||||
|
gitutil.GitAdd(gitSrc, t, "foo")
|
||||||
|
gitutil.GitCommit(gitSrc, t, "initial commit")
|
||||||
|
addrSrc := gitutil.GitServeHTTP(gitSrc, t)
|
||||||
|
|
||||||
|
out, err := bakeCmd(sb, withDir("/tmp"), withArgs(addrSpec, addrSrc, "--set", "*.output=type=local,dest="+dirDest))
|
||||||
|
require.NoError(t, err, out)
|
||||||
|
|
||||||
|
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/docker/buildx/issues/1738
|
||||||
|
func testBakeRemoteContextSubdir(t *testing.T, sb integration.Sandbox) {
|
||||||
|
bakefile := []byte(`
|
||||||
|
target default {
|
||||||
|
context = "./bar"
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
dockerfile := []byte(`
|
||||||
|
FROM scratch
|
||||||
|
COPY super-cool.txt /
|
||||||
|
`)
|
||||||
|
|
||||||
|
dir := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
|
||||||
|
fstest.CreateDir("bar", 0700),
|
||||||
|
fstest.CreateFile("bar/Dockerfile", dockerfile, 0600),
|
||||||
|
fstest.CreateFile("bar/super-cool.txt", []byte("super cool"), 0600),
|
||||||
|
)
|
||||||
|
dirDest := t.TempDir()
|
||||||
|
|
||||||
|
git, err := gitutil.New(gitutil.WithWorkingDir(dir))
|
||||||
|
require.NoError(t, err)
|
||||||
|
gitutil.GitInit(git, t)
|
||||||
|
gitutil.GitAdd(git, t, "docker-bake.hcl", "bar")
|
||||||
|
gitutil.GitCommit(git, t, "initial commit")
|
||||||
|
addr := gitutil.GitServeHTTP(git, t)
|
||||||
|
|
||||||
|
out, err := bakeCmd(sb, withDir("/tmp"), withArgs(addr, "--set", "*.output=type=local,dest="+dirDest))
|
||||||
|
require.NoError(t, err, out)
|
||||||
|
|
||||||
|
require.FileExists(t, filepath.Join(dirDest, "super-cool.txt"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testBakeRemoteCmdContextEscapeRoot(t *testing.T, sb integration.Sandbox) {
|
||||||
|
dirSrc := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("foo", []byte("foo"), 0600),
|
||||||
|
)
|
||||||
|
dirSrc, err := filepath.Abs(dirSrc)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
dirCurrent := tmpdir(t)
|
||||||
|
dirCurrent, err = filepath.Abs(dirCurrent)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
bakefile := []byte(`
|
||||||
|
target "default" {
|
||||||
|
context = "cwd://` + dirSrc + `"
|
||||||
|
dockerfile-inline = <<EOT
|
||||||
|
FROM scratch
|
||||||
|
COPY foo /foo
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
dirSpec := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
|
||||||
|
)
|
||||||
|
dirDest := t.TempDir()
|
||||||
|
|
||||||
|
git, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
gitutil.GitInit(git, t)
|
||||||
|
gitutil.GitAdd(git, t, "docker-bake.hcl")
|
||||||
|
gitutil.GitCommit(git, t, "initial commit")
|
||||||
|
addr := gitutil.GitServeHTTP(git, t)
|
||||||
|
|
||||||
|
out, err := bakeCmd(
|
||||||
|
sb,
|
||||||
|
withDir(dirCurrent),
|
||||||
|
withArgs(addr, "--set", "*.output=type=local,dest="+dirDest),
|
||||||
|
)
|
||||||
|
require.Error(t, err, out)
|
||||||
|
require.Contains(t, out, "outside of the working directory, please set BAKE_ALLOW_REMOTE_FS_ACCESS")
|
||||||
|
|
||||||
|
out, err = bakeCmd(
|
||||||
|
sb,
|
||||||
|
withDir(dirCurrent),
|
||||||
|
withArgs(addr, "--set", "*.output=type=local,dest="+dirDest),
|
||||||
|
withEnv("BAKE_ALLOW_REMOTE_FS_ACCESS=1"),
|
||||||
|
)
|
||||||
|
require.NoError(t, err, out)
|
||||||
|
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testBakeRemoteCmdContextEscapeRelative(t *testing.T, sb integration.Sandbox) {
|
||||||
|
bakefile := []byte(`
|
||||||
|
target "default" {
|
||||||
|
context = "cwd://../"
|
||||||
|
dockerfile-inline = <<EOT
|
||||||
|
FROM scratch
|
||||||
|
COPY foo /foo
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
dirSpec := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
|
||||||
|
)
|
||||||
|
dirSrc := tmpdir(
|
||||||
|
t,
|
||||||
|
fstest.CreateFile("foo", []byte("foo"), 0600),
|
||||||
|
fstest.CreateDir("subdir", 0700),
|
||||||
|
)
|
||||||
|
dirDest := t.TempDir()
|
||||||
|
|
||||||
|
git, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
gitutil.GitInit(git, t)
|
||||||
|
gitutil.GitAdd(git, t, "docker-bake.hcl")
|
||||||
|
gitutil.GitCommit(git, t, "initial commit")
|
||||||
|
addr := gitutil.GitServeHTTP(git, t)
|
||||||
|
|
||||||
|
out, err := bakeCmd(
|
||||||
|
sb,
|
||||||
|
withDir(filepath.Join(dirSrc, "subdir")),
|
||||||
|
withArgs(addr, "--set", "*.output=type=local,dest="+dirDest),
|
||||||
|
)
|
||||||
|
require.Error(t, err, out)
|
||||||
|
require.Contains(t, out, "outside of the working directory, please set BAKE_ALLOW_REMOTE_FS_ACCESS")
|
||||||
|
|
||||||
|
out, err = bakeCmd(
|
||||||
|
sb,
|
||||||
|
withDir(filepath.Join(dirSrc, "subdir")),
|
||||||
|
withArgs(addr, "--set", "*.output=type=local,dest="+dirDest),
|
||||||
|
withEnv("BAKE_ALLOW_REMOTE_FS_ACCESS=1"),
|
||||||
|
)
|
||||||
|
require.NoError(t, err, out)
|
||||||
|
require.FileExists(t, filepath.Join(dirDest, "foo"))
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package gitutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GitServeHTTP(c *Git, t testing.TB) (url string) {
|
||||||
|
t.Helper()
|
||||||
|
gitUpdateServerInfo(c, t)
|
||||||
|
ctx, cancel := context.WithCancel(context.TODO())
|
||||||
|
|
||||||
|
ready := make(chan struct{})
|
||||||
|
done := make(chan struct{})
|
||||||
|
|
||||||
|
name := "test.git"
|
||||||
|
dir, err := c.GitDir()
|
||||||
|
if err != nil {
|
||||||
|
cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
var addr string
|
||||||
|
go func() {
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
prefix := fmt.Sprintf("/%s/", name)
|
||||||
|
mux.Handle(prefix, http.StripPrefix(prefix, http.FileServer(http.Dir(dir))))
|
||||||
|
l, err := net.Listen("tcp", "localhost:0")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = l.Addr().String()
|
||||||
|
|
||||||
|
close(ready)
|
||||||
|
|
||||||
|
s := http.Server{Handler: mux} //nolint:gosec // potential attacks are not relevant for tests
|
||||||
|
go s.Serve(l)
|
||||||
|
<-ctx.Done()
|
||||||
|
s.Shutdown(context.TODO())
|
||||||
|
l.Close()
|
||||||
|
|
||||||
|
close(done)
|
||||||
|
}()
|
||||||
|
<-ready
|
||||||
|
|
||||||
|
t.Cleanup(func() {
|
||||||
|
cancel()
|
||||||
|
<-done
|
||||||
|
})
|
||||||
|
return fmt.Sprintf("http://%s/%s", addr, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func gitUpdateServerInfo(c *Git, tb testing.TB) {
|
||||||
|
tb.Helper()
|
||||||
|
_, err := fakeGit(c, "update-server-info")
|
||||||
|
require.NoError(tb, err)
|
||||||
|
}
|
Loading…
Reference in New Issue