Skip to content

Commit 1281fcd

Browse files
authored
Merge pull request #225 from tonistiigi/git-test
dockerfile: add test for building from git repo
2 parents e39675b + 367752b commit 1281fcd

File tree

3 files changed

+145
-10
lines changed

3 files changed

+145
-10
lines changed

frontend/dockerfile/dockerfile_test.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
99
"fmt"
1010
"io/ioutil"
1111
"net/http"
12+
"net/http/httptest"
1213
"os"
14+
"os/exec"
1315
"path/filepath"
1416
"sort"
1517
"strings"
@@ -27,6 +29,7 @@ import (
2729
"github.com/moby/buildkit/util/testutil/httpserver"
2830
"github.com/moby/buildkit/util/testutil/integration"
2931
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
32+
"github.com/pkg/errors"
3033
"github.com/stretchr/testify/require"
3134
)
3235

@@ -41,6 +44,7 @@ func TestIntegration(t *testing.T) {
4144
testExposeExpansion,
4245
testUser,
4346
testDockerignore,
47+
testDockerfileFromGit,
4448
})
4549
}
4650

@@ -745,6 +749,104 @@ USER nobody
745749
require.Equal(t, "nobody", ociimg.Config.User)
746750
}
747751

752+
func testDockerfileFromGit(t *testing.T, sb integration.Sandbox) {
753+
t.Parallel()
754+
755+
gitDir, err := ioutil.TempDir("", "buildkit")
756+
require.NoError(t, err)
757+
defer os.RemoveAll(gitDir)
758+
759+
dockerfile := `
760+
FROM busybox AS build
761+
RUN echo -n fromgit > foo
762+
FROM scratch
763+
COPY --from=build foo bar
764+
`
765+
766+
err = ioutil.WriteFile(filepath.Join(gitDir, "Dockerfile"), []byte(dockerfile), 0600)
767+
require.NoError(t, err)
768+
769+
err = runShell(gitDir,
770+
"git init",
771+
"git config --local user.email test",
772+
"git config --local user.name test",
773+
"git add Dockerfile",
774+
"git commit -m initial",
775+
"git branch first",
776+
)
777+
require.NoError(t, err)
778+
779+
dockerfile += `
780+
COPY --from=build foo bar2
781+
`
782+
783+
err = ioutil.WriteFile(filepath.Join(gitDir, "Dockerfile"), []byte(dockerfile), 0600)
784+
require.NoError(t, err)
785+
786+
err = runShell(gitDir,
787+
"git add Dockerfile",
788+
"git commit -m second",
789+
"git update-server-info",
790+
)
791+
require.NoError(t, err)
792+
793+
server := httptest.NewServer(http.FileServer(http.Dir(filepath.Join(gitDir, ".git"))))
794+
defer server.Close()
795+
796+
destDir, err := ioutil.TempDir("", "buildkit")
797+
require.NoError(t, err)
798+
defer os.RemoveAll(destDir)
799+
800+
c, err := client.New(sb.Address())
801+
require.NoError(t, err)
802+
defer c.Close()
803+
804+
err = c.Solve(context.TODO(), nil, client.SolveOpt{
805+
Frontend: "dockerfile.v0",
806+
FrontendAttrs: map[string]string{
807+
"context": "git://" + server.URL + "/#first",
808+
},
809+
Exporter: client.ExporterLocal,
810+
ExporterAttrs: map[string]string{
811+
"output": destDir,
812+
},
813+
}, nil)
814+
require.NoError(t, err)
815+
816+
dt, err := ioutil.ReadFile(filepath.Join(destDir, "bar"))
817+
require.NoError(t, err)
818+
require.Equal(t, "fromgit", string(dt))
819+
820+
_, err = os.Stat(filepath.Join(destDir, "bar2"))
821+
require.Error(t, err)
822+
require.True(t, os.IsNotExist(err))
823+
824+
// second request from master branch contains both files
825+
destDir, err = ioutil.TempDir("", "buildkit")
826+
require.NoError(t, err)
827+
defer os.RemoveAll(destDir)
828+
829+
err = c.Solve(context.TODO(), nil, client.SolveOpt{
830+
Frontend: "dockerfile.v0",
831+
FrontendAttrs: map[string]string{
832+
"context": "git://" + server.URL + "/",
833+
},
834+
Exporter: client.ExporterLocal,
835+
ExporterAttrs: map[string]string{
836+
"output": destDir,
837+
},
838+
}, nil)
839+
require.NoError(t, err)
840+
841+
dt, err = ioutil.ReadFile(filepath.Join(destDir, "bar"))
842+
require.NoError(t, err)
843+
require.Equal(t, "fromgit", string(dt))
844+
845+
dt, err = ioutil.ReadFile(filepath.Join(destDir, "bar2"))
846+
require.NoError(t, err)
847+
require.Equal(t, "fromgit", string(dt))
848+
}
849+
748850
func tmpdir(appliers ...fstest.Applier) (string, error) {
749851
tmpdir, err := ioutil.TempDir("", "buildkit-dockerfile")
750852
if err != nil {
@@ -760,3 +862,14 @@ func dfCmdArgs(ctx, dockerfile string) (string, string) {
760862
traceFile := filepath.Join(os.TempDir(), "trace"+identity.NewID())
761863
return fmt.Sprintf("build --no-progress --frontend dockerfile.v0 --local context=%s --local dockerfile=%s --trace=%s", ctx, dockerfile, traceFile), traceFile
762864
}
865+
866+
func runShell(dir string, cmds ...string) error {
867+
for _, args := range cmds {
868+
cmd := exec.Command("sh", "-c", args)
869+
cmd.Dir = dir
870+
if err := cmd.Run(); err != nil {
871+
return errors.Wrapf(err, "error running %v", args)
872+
}
873+
}
874+
return nil
875+
}

source/git/gitsource.go

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -370,13 +370,35 @@ func gitWithinDir(ctx context.Context, gitDir, workDir string, args ...string) (
370370
}
371371

372372
func git(ctx context.Context, dir string, args ...string) (*bytes.Buffer, error) {
373-
stdout, stderr := logs.NewLogStreams(ctx)
374-
defer stdout.Close()
375-
defer stderr.Close()
376-
cmd := exec.CommandContext(ctx, "git", args...)
377-
cmd.Dir = dir // some commands like submodule require this
378-
buf := bytes.NewBuffer(nil)
379-
cmd.Stdout = io.MultiWriter(stdout, buf)
380-
cmd.Stderr = stderr
381-
return buf, cmd.Run()
373+
for {
374+
stdout, stderr := logs.NewLogStreams(ctx)
375+
defer stdout.Close()
376+
defer stderr.Close()
377+
cmd := exec.CommandContext(ctx, "git", args...)
378+
cmd.Dir = dir // some commands like submodule require this
379+
buf := bytes.NewBuffer(nil)
380+
errbuf := bytes.NewBuffer(nil)
381+
cmd.Stdout = io.MultiWriter(stdout, buf)
382+
cmd.Stderr = io.MultiWriter(stderr, errbuf)
383+
err := cmd.Run()
384+
if err != nil {
385+
if strings.Contains(errbuf.String(), "--depth") || strings.Contains(errbuf.String(), "shallow") {
386+
if newArgs := argsNoDepth(args); len(args) > len(newArgs) {
387+
args = newArgs
388+
continue
389+
}
390+
}
391+
}
392+
return buf, err
393+
}
394+
}
395+
396+
func argsNoDepth(args []string) []string {
397+
out := make([]string, 0, len(args))
398+
for _, a := range args {
399+
if a != "--depth=1" {
400+
out = append(out, a)
401+
}
402+
}
403+
return out
382404
}

source/gitidentifier.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func NewGitIdentifier(remoteURL string) (*GitIdentifier, error) {
3535
} else {
3636
u, err := url.Parse(remoteURL)
3737
if err != nil {
38-
return &repo, err
38+
return nil, err
3939
}
4040

4141
repo.Ref, repo.Subdir = getRefAndSubdir(u.Fragment)

0 commit comments

Comments
 (0)