1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
package dockerfile
import (
"bytes"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"testing"
"text/template"
"github.com/containerd/continuity/fs/fstest"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/frontend/dockerui"
"github.com/moby/buildkit/util/testutil/integration"
"github.com/stretchr/testify/require"
"github.com/tonistiigi/fsutil"
)
var addGitTests = integration.TestFuncs(
testAddGit,
)
func init() {
allTests = append(allTests, addGitTests...)
}
func testAddGit(t *testing.T, sb integration.Sandbox) {
integration.SkipOnPlatform(t, "windows")
f := getFrontend(t, sb)
gitDir, err := os.MkdirTemp("", "buildkit")
require.NoError(t, err)
defer os.RemoveAll(gitDir)
gitCommands := []string{
"git init",
"git config --local user.email test",
"git config --local user.name test",
}
makeCommit := func(tag string) []string {
return []string{
"echo foo of " + tag + " >foo",
"git add foo",
"git commit -m " + tag,
"git tag " + tag,
}
}
gitCommands = append(gitCommands, makeCommit("v0.0.1")...)
gitCommands = append(gitCommands, makeCommit("v0.0.2")...)
gitCommands = append(gitCommands, makeCommit("v0.0.3")...)
gitCommands = append(gitCommands, "git update-server-info")
err = runShell(gitDir, gitCommands...)
require.NoError(t, err)
server := httptest.NewServer(http.FileServer(http.Dir(filepath.Join(gitDir))))
defer server.Close()
serverURL := server.URL
t.Logf("serverURL=%q", serverURL)
dockerfile, err := applyTemplate(`
FROM alpine
# Basic case
ADD {{.ServerURL}}/.git#v0.0.1 /x
RUN cd /x && \
[ "$(cat foo)" = "foo of v0.0.1" ]
# Complicated case
ARG REPO="{{.ServerURL}}/.git"
ARG TAG="v0.0.2"
ADD --keep-git-dir=true --chown=4242:8484 ${REPO}#${TAG} /buildkit-chowned
RUN apk add git
USER 4242
RUN cd /buildkit-chowned && \
[ "$(cat foo)" = "foo of v0.0.2" ] && \
[ "$(stat -c %u foo)" = "4242" ] && \
[ "$(stat -c %g foo)" = "8484" ] && \
[ -z "$(git status -s)" ]
`, map[string]string{
"ServerURL": serverURL,
})
require.NoError(t, err)
t.Logf("dockerfile=%s", dockerfile)
dir := integration.Tmpdir(t,
fstest.CreateFile("Dockerfile", []byte(dockerfile), 0600),
)
c, err := client.New(sb.Context(), sb.Address())
require.NoError(t, err)
defer c.Close()
_, err = f.Solve(sb.Context(), c, client.SolveOpt{
LocalMounts: map[string]fsutil.FS{
dockerui.DefaultLocalNameDockerfile: dir,
dockerui.DefaultLocalNameContext: dir,
},
}, nil)
require.NoError(t, err)
}
func applyTemplate(tmpl string, x interface{}) (string, error) {
var buf bytes.Buffer
parsed, err := template.New("").Parse(tmpl)
if err != nil {
return "", err
}
if err := parsed.Execute(&buf, x); err != nil {
return "", err
}
return buf.String(), nil
}
|