github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/e2e/build_test.go (about) 1 package e2e 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path" 9 "strings" 10 "testing" 11 12 "github.com/docker/app/internal/image" 13 14 "gotest.tools/fs" 15 16 "github.com/docker/app/internal/store" 17 18 "github.com/deislabs/cnab-go/bundle" 19 "gotest.tools/assert" 20 "gotest.tools/icmd" 21 ) 22 23 func TestBuild(t *testing.T) { 24 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 25 cmd := info.configuredCmd 26 tmp := fs.NewDir(t, "TestBuild") 27 28 testDir := path.Join("testdata", "build") 29 iidfile := tmp.Join("iidfile") 30 cmd.Command = dockerCli.Command("app", "build", "--tag", "single:1.0.0", "--iidfile", iidfile, "-f", path.Join(testDir, "single.dockerapp"), testDir) 31 icmd.RunCmd(cmd).Assert(t, icmd.Success) 32 33 _, err := os.Stat(iidfile) 34 assert.NilError(t, err) 35 bytes, err := ioutil.ReadFile(iidfile) 36 assert.NilError(t, err) 37 iid := string(bytes) 38 39 cfg := getDockerConfigDir(t, cmd) 40 41 s := strings.Split(iid, ":") 42 f := path.Join(cfg, "app", "bundles", "contents", s[0], s[1], image.BundleFilename) 43 bndl, err := image.FromFile(f) 44 assert.NilError(t, err) 45 46 built := []string{bndl.InvocationImages[0].Digest, bndl.Images["web"].Digest, bndl.Images["worker"].Digest} 47 for _, ref := range built { 48 cmd.Command = dockerCli.Command("inspect", ref) 49 icmd.RunCmd(cmd).Assert(t, icmd.Success) 50 } 51 52 for _, img := range bndl.Images { 53 // Check all image not being built locally get a fixed reference 54 assert.Assert(t, img.Image == "" || strings.Contains(img.Image, "@sha256:")) 55 } 56 57 actualID, err := store.FromAppImage(bndl) 58 assert.NilError(t, err) 59 assert.Equal(t, iid, fmt.Sprintf("sha256:%s", actualID.String())) 60 }) 61 } 62 63 func TestBuildMultiTag(t *testing.T) { 64 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 65 cmd := info.configuredCmd 66 tmp := fs.NewDir(t, "TestBuild") 67 testDir := path.Join("testdata", "build") 68 iidfile := tmp.Join("iidfile") 69 tags := []string{"1.0.0", "latest"} 70 cmd.Command = dockerCli.Command("app", "build", "--tag", "single:"+tags[0], "--tag", "single:"+tags[1], "--iidfile", iidfile, "-f", path.Join(testDir, "single.dockerapp"), testDir) 71 icmd.RunCmd(cmd).Assert(t, icmd.Success) 72 }) 73 } 74 75 func TestQuietBuild(t *testing.T) { 76 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 77 cmd := info.configuredCmd 78 tmp := fs.NewDir(t, "TestBuild") 79 80 testDir := path.Join("testdata", "build") 81 iidfile := tmp.Join("iidfile") 82 cmd.Command = dockerCli.Command("app", "build", "--quiet", "--iidfile", iidfile, "-f", path.Join(testDir, "single.dockerapp"), testDir) 83 out := icmd.RunCmd(cmd).Assert(t, icmd.Success).Combined() 84 out = strings.Trim(out, "\r\n") 85 86 _, err := os.Stat(iidfile) 87 assert.NilError(t, err) 88 bytes, err := ioutil.ReadFile(iidfile) 89 assert.NilError(t, err) 90 iid := string(bytes) 91 assert.NilError(t, err) 92 assert.Equal(t, iid, out) 93 }) 94 } 95 96 func TestBuildWithoutTag(t *testing.T) { 97 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 98 cmd := info.configuredCmd 99 100 testDir := path.Join("testdata", "build") 101 cmd.Command = dockerCli.Command("app", "build", "-f", path.Join(testDir, "single.dockerapp"), testDir) 102 icmd.RunCmd(cmd).Assert(t, icmd.Success) 103 104 cfg := getDockerConfigDir(t, cmd) 105 106 f := path.Join(cfg, "app", "bundles", "contents", "sha256") 107 infos, err := ioutil.ReadDir(f) 108 assert.NilError(t, err) 109 assert.Equal(t, len(infos), 1) 110 id := infos[0].Name() 111 112 f = path.Join(cfg, "app", "bundles", "contents", "sha256", id, image.BundleFilename) 113 data, err := ioutil.ReadFile(f) 114 assert.NilError(t, err) 115 var bndl bundle.Bundle 116 err = json.Unmarshal(data, &bndl) 117 assert.NilError(t, err) 118 119 built := []string{bndl.InvocationImages[0].Digest, bndl.Images["web"].Digest, bndl.Images["worker"].Digest} 120 for _, ref := range built { 121 cmd.Command = dockerCli.Command("inspect", ref) 122 icmd.RunCmd(cmd).Assert(t, icmd.Success) 123 } 124 }) 125 } 126 127 func TestBuildWithArgs(t *testing.T) { 128 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 129 cmd := info.configuredCmd 130 131 testDir := path.Join("testdata", "build") 132 cmd.Command = dockerCli.Command("app", "build", "-f", path.Join(testDir, "single.dockerapp"), testDir, "--build-arg", "REPLACE_BY_BUILD_ARG=replaced") 133 icmd.RunCmd(cmd).Assert(t, icmd.Success) 134 135 cfg := getDockerConfigDir(t, cmd) 136 137 f := path.Join(cfg, "app", "bundles", "contents", "sha256") 138 infos, err := ioutil.ReadDir(f) 139 assert.NilError(t, err) 140 assert.Equal(t, len(infos), 1) 141 id := infos[0].Name() 142 143 f = path.Join(cfg, "app", "bundles", "contents", "sha256", id, image.BundleFilename) 144 data, err := ioutil.ReadFile(f) 145 assert.NilError(t, err) 146 var bndl bundle.Bundle 147 err = json.Unmarshal(data, &bndl) 148 assert.NilError(t, err) 149 150 cmd.Command = dockerCli.Command("inspect", bndl.Images["worker"].Digest) 151 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 152 ExitCode: 0, 153 Out: `"com.docker.labelled.arg": "replaced"`, 154 }) 155 }) 156 } 157 158 func TestBuildWithArgsDefinedTwice(t *testing.T) { 159 runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) { 160 cmd := info.configuredCmd 161 162 testDir := path.Join("testdata", "build") 163 cmd.Command = dockerCli.Command("app", "build", "-f", path.Join(testDir, "single.dockerapp"), testDir, 164 "--build-arg", "REPLACE_BY_BUILD_ARG=replaced", "--build-arg", "REPLACE_BY_BUILD_ARG=replaced_twice") 165 icmd.RunCmd(cmd).Assert(t, icmd.Expected{ 166 ExitCode: 1, 167 Err: `'--build-arg REPLACE_BY_BUILD_ARG' is defined twice`, 168 }) 169 }) 170 } 171 172 func getDockerConfigDir(t *testing.T, cmd icmd.Cmd) string { 173 var cfg string 174 for _, s := range cmd.Env { 175 if strings.HasPrefix(s, "DOCKER_CONFIG=") { 176 cfg = s[14:] 177 } 178 } 179 if cfg == "" { 180 t.Fatalf("Failed to retrieve docker config folder") 181 } 182 return cfg 183 }