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  }