Skip to content

Commit

Permalink
Merge pull request #799 from 89luca89/tests/parallelize_tests
Browse files Browse the repository at this point in the history
tests: parallelize tests using labels and matrix
  • Loading branch information
pascalbreuninger authored Nov 20, 2023
2 parents 3a90c4d + d3ebf20 commit b748265
Show file tree
Hide file tree
Showing 14 changed files with 2,516 additions and 2,404 deletions.
7 changes: 6 additions & 1 deletion .github/workflows/e2e-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ env:
jobs:
test-e2e:
runs-on: ubuntu-latest
strategy:
fail-fast: true
max-parallel: 16
matrix:
label: ["build", "ide", "integration", "machine", "machineprovider", "provider", "proxyprovider", "ssh", "up", "up-docker", "up-podman", "up-docker-compose"]

steps:
- name: Checkout repo
Expand Down Expand Up @@ -56,4 +61,4 @@ jobs:
- name: E2E test
working-directory: ./e2e
run: |
sudo KUBECONFIG=/home/runner/.kube/config go test -v -ginkgo.v -timeout 3600s
sudo KUBECONFIG=/home/runner/.kube/config go test -v -ginkgo.v -timeout 3600s --ginkgo.label-filter=${{ matrix.label }}
330 changes: 166 additions & 164 deletions e2e/tests/build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,170 +15,172 @@ import (
)

var _ = DevPodDescribe("devpod build test suite", func() {
var initialDir string
var dockerHelper *docker.DockerHelper

ginkgo.BeforeEach(func() {
var err error
initialDir, err = os.Getwd()
framework.ExpectNoError(err)
dockerHelper = &docker.DockerHelper{DockerCommand: "docker"}
})

ginkgo.It("build docker buildx", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/docker")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

cfg := getDevcontainerConfig(tempDir)

dockerfilePath := tempDir + "/.devcontainer/Dockerfile"
dockerfileContent, err := os.ReadFile(dockerfilePath)
framework.ExpectNoError(err)
_, modifiedDockerfileContents, err := dockerfile.EnsureDockerfileHasFinalStageName(string(dockerfileContent), config.DockerfileDefaultTarget)
framework.ExpectNoError(err)

prebuildRepo := "test-repo"

// do the build
err = f.DevPodBuild(ctx, tempDir, "--force-build", "--platform", "linux/amd64,linux/arm64", "--repository", prebuildRepo, "--skip-push")
framework.ExpectNoError(err)

// make sure images are there
prebuildHash, err := config.CalculatePrebuildHash(cfg, "linux/amd64", "amd64", filepath.Dir(cfg.Origin), dockerfilePath, modifiedDockerfileContents, log.Default)
framework.ExpectNoError(err)
_, err = dockerHelper.InspectImage(ctx, prebuildRepo+":"+prebuildHash, false)
framework.ExpectNoError(err)

prebuildHash, err = config.CalculatePrebuildHash(cfg, "linux/arm64", "arm64", filepath.Dir(cfg.Origin), dockerfilePath, modifiedDockerfileContents, log.Default)
framework.ExpectNoError(err)
_, err = dockerHelper.InspectImage(ctx, prebuildRepo+":"+prebuildHash, false)
framework.ExpectNoError(err)
})

ginkgo.It("should build image without repository specified if skip-push flag is set", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/docker")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

cfg := getDevcontainerConfig(tempDir)

dockerfilePath := tempDir + "/.devcontainer/Dockerfile"
dockerfileContent, err := os.ReadFile(dockerfilePath)
framework.ExpectNoError(err)
_, modifiedDockerfileContents, err := dockerfile.EnsureDockerfileHasFinalStageName(string(dockerfileContent), config.DockerfileDefaultTarget)
framework.ExpectNoError(err)

// do the build
err = f.DevPodBuild(ctx, tempDir, "--skip-push")
framework.ExpectNoError(err)

// make sure images are there
prebuildHash, err := config.CalculatePrebuildHash(cfg, "linux/amd64", "amd64", filepath.Dir(cfg.Origin), dockerfilePath, modifiedDockerfileContents, log.Default)
framework.ExpectNoError(err)
_, err = dockerHelper.InspectImage(ctx, dockerdriver.GetImageName(tempDir, prebuildHash), false)
framework.ExpectNoError(err)
})

ginkgo.It("should build the image of the referenced service from the docker compose file", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/docker-compose")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

prebuildRepo := "test-repo"

// do the build
err = f.DevPodBuild(ctx, tempDir, "--repository", prebuildRepo, "--skip-push")
framework.ExpectNoError(err)
})

ginkgo.It("build docker internal buildkit", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/docker")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

cfg := getDevcontainerConfig(tempDir)

dockerfilePath := tempDir + "/.devcontainer/Dockerfile"
dockerfileContent, err := os.ReadFile(dockerfilePath)
framework.ExpectNoError(err)
_, modifiedDockerfileContents, err := dockerfile.EnsureDockerfileHasFinalStageName(string(dockerfileContent), config.DockerfileDefaultTarget)
framework.ExpectNoError(err)

prebuildRepo := "test-repo"

// do the build
err = f.DevPodBuild(ctx, tempDir, "--force-build", "--force-internal-buildkit", "--repository", prebuildRepo, "--skip-push")
framework.ExpectNoError(err)

// make sure images are there
prebuildHash, err := config.CalculatePrebuildHash(cfg, "linux/amd64", "amd64", filepath.Dir(cfg.Origin), dockerfilePath, modifiedDockerfileContents, log.Default)
framework.ExpectNoError(err)

_, err = dockerHelper.InspectImage(ctx, prebuildRepo+":"+prebuildHash, false)
framework.ExpectNoError(err)
})

ginkgo.It("build kubernetes dockerless", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/kubernetes")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "kubernetes")
err = f.DevPodProviderAdd(ctx, "kubernetes")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "kubernetes", "-o", "KUBERNETES_NAMESPACE=devpod")
framework.ExpectNoError(err)

ginkgo.DeferCleanup(f.DevPodWorkspaceDelete, context.Background(), tempDir)

// do the up
err = f.DevPodUp(ctx, tempDir)
framework.ExpectNoError(err)

// check if ssh works
out, err := f.DevPodSSH(ctx, tempDir, "echo -n $MY_TEST")
framework.ExpectNoError(err)
framework.ExpectEqual(out, "test456", "should contain my-test")
ginkgo.Context("testing build", ginkgo.Label("build"), ginkgo.Ordered, func() {
var initialDir string
var dockerHelper *docker.DockerHelper

ginkgo.BeforeEach(func() {
var err error
initialDir, err = os.Getwd()
framework.ExpectNoError(err)
dockerHelper = &docker.DockerHelper{DockerCommand: "docker"}
})

ginkgo.It("build docker buildx", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/docker")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

cfg := getDevcontainerConfig(tempDir)

dockerfilePath := tempDir + "/.devcontainer/Dockerfile"
dockerfileContent, err := os.ReadFile(dockerfilePath)
framework.ExpectNoError(err)
_, modifiedDockerfileContents, err := dockerfile.EnsureDockerfileHasFinalStageName(string(dockerfileContent), config.DockerfileDefaultTarget)
framework.ExpectNoError(err)

prebuildRepo := "test-repo"

// do the build
err = f.DevPodBuild(ctx, tempDir, "--force-build", "--platform", "linux/amd64,linux/arm64", "--repository", prebuildRepo, "--skip-push")
framework.ExpectNoError(err)

// make sure images are there
prebuildHash, err := config.CalculatePrebuildHash(cfg, "linux/amd64", "amd64", filepath.Dir(cfg.Origin), dockerfilePath, modifiedDockerfileContents, log.Default)
framework.ExpectNoError(err)
_, err = dockerHelper.InspectImage(ctx, prebuildRepo+":"+prebuildHash, false)
framework.ExpectNoError(err)

prebuildHash, err = config.CalculatePrebuildHash(cfg, "linux/arm64", "arm64", filepath.Dir(cfg.Origin), dockerfilePath, modifiedDockerfileContents, log.Default)
framework.ExpectNoError(err)
_, err = dockerHelper.InspectImage(ctx, prebuildRepo+":"+prebuildHash, false)
framework.ExpectNoError(err)
})

ginkgo.It("should build image without repository specified if skip-push flag is set", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/docker")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

cfg := getDevcontainerConfig(tempDir)

dockerfilePath := tempDir + "/.devcontainer/Dockerfile"
dockerfileContent, err := os.ReadFile(dockerfilePath)
framework.ExpectNoError(err)
_, modifiedDockerfileContents, err := dockerfile.EnsureDockerfileHasFinalStageName(string(dockerfileContent), config.DockerfileDefaultTarget)
framework.ExpectNoError(err)

// do the build
err = f.DevPodBuild(ctx, tempDir, "--skip-push")
framework.ExpectNoError(err)

// make sure images are there
prebuildHash, err := config.CalculatePrebuildHash(cfg, "linux/amd64", "amd64", filepath.Dir(cfg.Origin), dockerfilePath, modifiedDockerfileContents, log.Default)
framework.ExpectNoError(err)
_, err = dockerHelper.InspectImage(ctx, dockerdriver.GetImageName(tempDir, prebuildHash), false)
framework.ExpectNoError(err)
})

ginkgo.It("should build the image of the referenced service from the docker compose file", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/docker-compose")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

prebuildRepo := "test-repo"

// do the build
err = f.DevPodBuild(ctx, tempDir, "--repository", prebuildRepo, "--skip-push")
framework.ExpectNoError(err)
})

ginkgo.It("build docker internal buildkit", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/docker")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

cfg := getDevcontainerConfig(tempDir)

dockerfilePath := tempDir + "/.devcontainer/Dockerfile"
dockerfileContent, err := os.ReadFile(dockerfilePath)
framework.ExpectNoError(err)
_, modifiedDockerfileContents, err := dockerfile.EnsureDockerfileHasFinalStageName(string(dockerfileContent), config.DockerfileDefaultTarget)
framework.ExpectNoError(err)

prebuildRepo := "test-repo"

// do the build
err = f.DevPodBuild(ctx, tempDir, "--force-build", "--force-internal-buildkit", "--repository", prebuildRepo, "--skip-push")
framework.ExpectNoError(err)

// make sure images are there
prebuildHash, err := config.CalculatePrebuildHash(cfg, "linux/amd64", "amd64", filepath.Dir(cfg.Origin), dockerfilePath, modifiedDockerfileContents, log.Default)
framework.ExpectNoError(err)

_, err = dockerHelper.InspectImage(ctx, prebuildRepo+":"+prebuildHash, false)
framework.ExpectNoError(err)
})

ginkgo.It("build kubernetes dockerless", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/build/testdata/kubernetes")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "kubernetes")
err = f.DevPodProviderAdd(ctx, "kubernetes")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "kubernetes", "-o", "KUBERNETES_NAMESPACE=devpod")
framework.ExpectNoError(err)

ginkgo.DeferCleanup(f.DevPodWorkspaceDelete, context.Background(), tempDir)

// do the up
err = f.DevPodUp(ctx, tempDir)
framework.ExpectNoError(err)

// check if ssh works
out, err := f.DevPodSSH(ctx, tempDir, "echo -n $MY_TEST")
framework.ExpectNoError(err)
framework.ExpectEqual(out, "test456", "should contain my-test")
})
})
})

Expand Down
Loading

0 comments on commit b748265

Please sign in to comment.