Skip to content

Commit 9bfd2a4

Browse files
authored
Merge pull request #3462 from crazy-max/bake-input-context
bake: set input:context for remote builds
2 parents cd84123 + f60c7c9 commit 9bfd2a4

File tree

4 files changed

+148
-1
lines changed

4 files changed

+148
-1
lines changed

bake/bake.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1306,7 +1306,7 @@ func updateContext(t *build.Inputs, inp *Input) {
13061306
continue
13071307
}
13081308
st := llb.Scratch().File(llb.Copy(*inp.State, v.Path, "/"), llb.WithCustomNamef("set context %s to %s", k, v.Path))
1309-
t.NamedContexts[k] = build.NamedContext{State: &st}
1309+
t.NamedContexts[k] = build.NamedContext{State: &st, Path: inp.URL}
13101310
}
13111311

13121312
if t.ContextPath == "." {
@@ -1326,6 +1326,7 @@ func updateContext(t *build.Inputs, inp *Input) {
13261326
llb.WithCustomNamef("set context to %s", t.ContextPath),
13271327
)
13281328
t.ContextState = &st
1329+
t.ContextPath = inp.URL
13291330
}
13301331

13311332
func isRemoteContext(t build.Inputs, inp *Input) bool {

build/opt.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"github.com/moby/buildkit/client/llb"
3636
"github.com/moby/buildkit/client/ociindex"
3737
"github.com/moby/buildkit/exporter/containerimage/exptypes"
38+
"github.com/moby/buildkit/frontend/dockerfile/dfgitutil"
3839
"github.com/moby/buildkit/frontend/dockerui"
3940
gateway "github.com/moby/buildkit/frontend/gateway/client"
4041
"github.com/moby/buildkit/identity"
@@ -657,6 +658,9 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp *Inputs, pw pro
657658
}
658659
target.FrontendInputs["context"] = *inp.ContextState
659660
target.FrontendInputs["dockerfile"] = *inp.ContextState
661+
if _, ok, _ := dfgitutil.ParseGitRef(inp.ContextPath); ok {
662+
target.FrontendAttrs["input:context"] = inp.ContextPath
663+
}
660664
case inp.ContextPath == "-":
661665
if inp.DockerfilePath == "-" {
662666
return nil, errors.Errorf("invalid argument: can't use stdin for both build context and dockerfile")
@@ -810,6 +814,9 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp *Inputs, pw pro
810814
caps["moby.buildkit.frontend.contexts+forward"] = struct{}{}
811815
if v.State != nil {
812816
target.FrontendAttrs["context:"+k] = "input:" + k
817+
if _, ok, _ := dfgitutil.ParseGitRef(v.Path); ok {
818+
target.FrontendAttrs["input:git_state_"+k] = v.Path
819+
}
813820
if target.FrontendInputs == nil {
814821
target.FrontendInputs = make(map[string]llb.State)
815822
}

tests/bake.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ var bakeTests = []func(t *testing.T, sb integration.Sandbox){
4141
testBakePrintSensitive,
4242
testBakePrintOverrideEmpty,
4343
testBakePrintKeepEscaped,
44+
testBakePrintRemoteContextSubdir,
4445
testBakeLocal,
4546
testBakeLocalMulti,
4647
testBakeRemote,
@@ -529,6 +530,78 @@ EOT
529530
require.NoError(t, err, string(out))
530531
}
531532

533+
func testBakePrintRemoteContextSubdir(t *testing.T, sb integration.Sandbox) {
534+
bakefile := []byte(`
535+
target default {
536+
context = "bar"
537+
}
538+
`)
539+
dockerfile := []byte(`
540+
FROM scratch
541+
COPY super-cool.txt /
542+
`)
543+
544+
dir := tmpdir(
545+
t,
546+
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
547+
fstest.CreateDir("bar", 0700),
548+
fstest.CreateFile("bar/Dockerfile", dockerfile, 0600),
549+
fstest.CreateFile("bar/super-cool.txt", []byte("super cool"), 0600),
550+
)
551+
552+
git, err := gitutil.New(gitutil.WithWorkingDir(dir))
553+
require.NoError(t, err)
554+
gittestutil.GitInit(git, t)
555+
gittestutil.GitAdd(git, t, "docker-bake.hcl", "bar")
556+
gittestutil.GitCommit(git, t, "initial commit")
557+
addr := gittestutil.GitServeHTTP(git, t)
558+
559+
tests := []struct {
560+
name string
561+
ref string
562+
expectedContext string
563+
}{
564+
{
565+
name: "no ref",
566+
expectedContext: addr,
567+
},
568+
{
569+
name: "branch ref",
570+
ref: "main",
571+
expectedContext: addr + "#main",
572+
},
573+
}
574+
for _, tt := range tests {
575+
t.Run(tt.name, func(t *testing.T) {
576+
u := addr
577+
if tt.ref != "" {
578+
u += "#" + tt.ref
579+
}
580+
cmd := buildxCmd(sb, withDir("/tmp"), withArgs("bake", u, "--print"))
581+
stdout := bytes.Buffer{}
582+
stderr := bytes.Buffer{}
583+
cmd.Stdout = &stdout
584+
cmd.Stderr = &stderr
585+
require.NoError(t, cmd.Run(), stdout.String(), stderr.String())
586+
require.JSONEq(t, fmt.Sprintf(`{
587+
"group": {
588+
"default": {
589+
"targets": [
590+
"default"
591+
]
592+
}
593+
},
594+
"target": {
595+
"default": {
596+
"context": %q,
597+
"dockerfile": "Dockerfile"
598+
}
599+
}
600+
}`, tt.expectedContext), stdout.String())
601+
})
602+
}
603+
}
604+
532605
func testBakeLocal(t *testing.T, sb integration.Sandbox) {
533606
dockerfile := []byte(`
534607
FROM scratch

tests/history.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,72 @@ COPY foo /foo
240240
require.Equal(t, md.BuildRef, rec.Ref)
241241
require.Equal(t, addr+"#main", rec.Name)
242242
})
243+
244+
t.Run("bake git", func(t *testing.T) {
245+
bakefile := []byte(`
246+
target "default" {
247+
dockerfile-inline = <<EOT
248+
FROM scratch
249+
COPY foo /foo
250+
EOT
251+
}
252+
`)
253+
dir := tmpdir(
254+
t,
255+
fstest.CreateFile("docker-bake.hcl", bakefile, 0600),
256+
fstest.CreateFile("foo", []byte("foo"), 0600),
257+
)
258+
dirDest := t.TempDir()
259+
260+
git, err := gitutil.New(gitutil.WithWorkingDir(dir))
261+
require.NoError(t, err)
262+
263+
gittestutil.GitInit(git, t)
264+
gittestutil.GitAdd(git, t, "docker-bake.hcl", "foo")
265+
gittestutil.GitCommit(git, t, "initial commit")
266+
addr := gittestutil.GitServeHTTP(git, t)
267+
268+
out, err := bakeCmd(sb, withDir(dir),
269+
withArgs(addr, "--set", "*.output=type=local,dest="+dirDest, "--metadata-file", filepath.Join(dir, "md.json")),
270+
)
271+
require.NoError(t, err, out)
272+
require.FileExists(t, filepath.Join(dirDest, "foo"))
273+
274+
dt, err := os.ReadFile(filepath.Join(dir, "md.json"))
275+
require.NoError(t, err)
276+
277+
type mdT struct {
278+
Default struct {
279+
BuildRef string `json:"buildx.build.ref"`
280+
} `json:"default"`
281+
}
282+
var md mdT
283+
err = json.Unmarshal(dt, &md)
284+
require.NoError(t, err)
285+
286+
refParts := strings.Split(md.Default.BuildRef, "/")
287+
require.Len(t, refParts, 3)
288+
289+
cmd := buildxCmd(sb, withArgs("history", "ls", "--filter=ref="+refParts[2], "--format=json"))
290+
bout, err := cmd.Output()
291+
require.NoError(t, err, string(bout))
292+
293+
type recT struct {
294+
Ref string `json:"ref"`
295+
Name string `json:"name"`
296+
Status string `json:"status"`
297+
CreatedAt *time.Time `json:"created_at"`
298+
CompletedAt *time.Time `json:"completed_at"`
299+
TotalSteps int32 `json:"total_steps"`
300+
CompletedSteps int32 `json:"completed_steps"`
301+
CachedSteps int32 `json:"cached_steps"`
302+
}
303+
var rec recT
304+
err = json.Unmarshal(bout, &rec)
305+
require.NoError(t, err)
306+
require.Equal(t, md.Default.BuildRef, rec.Ref)
307+
require.Equal(t, addr, rec.Name)
308+
})
243309
}
244310

245311
type buildRef struct {

0 commit comments

Comments
 (0)