152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| /*
 | |
| Copyright 2018 Google LLC
 | |
| 
 | |
| Licensed under the Apache License, Version 2.0 (the "License");
 | |
| you may not use this file except in compliance with the License.
 | |
| You may obtain a copy of the License at
 | |
| 
 | |
|     http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
| Unless required by applicable law or agreed to in writing, software
 | |
| distributed under the License is distributed on an "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| See the License for the specific language governing permissions and
 | |
| limitations under the License.
 | |
| */
 | |
| 
 | |
| package integration
 | |
| 
 | |
| import (
 | |
| 	"compress/gzip"
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"path/filepath"
 | |
| 	"runtime"
 | |
| 	"sync"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/GoogleContainerTools/kaniko/pkg/util"
 | |
| 	"github.com/GoogleContainerTools/kaniko/testutil"
 | |
| )
 | |
| 
 | |
| func TestBuildWithStdin(t *testing.T) {
 | |
| 	_, ex, _, _ := runtime.Caller(0)
 | |
| 	cwd := filepath.Dir(ex)
 | |
| 
 | |
| 	testDir := "test_dir"
 | |
| 	testDirLongPath := filepath.Join(cwd, testDir)
 | |
| 
 | |
| 	if err := os.MkdirAll(testDirLongPath, 0750); err != nil {
 | |
| 		t.Errorf("Failed to create dir_where_to_extract: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	dockerfile := "Dockerfile_test_stdin"
 | |
| 
 | |
| 	files := map[string]string{
 | |
| 		dockerfile: "FROM debian:9.11\nRUN echo \"hey\"",
 | |
| 	}
 | |
| 
 | |
| 	if err := testutil.SetupFiles(testDir, files); err != nil {
 | |
| 		t.Errorf("Failed to setup files %v on %s: %v", files, testDir, err)
 | |
| 	}
 | |
| 
 | |
| 	if err := os.Chdir(testDir); err != nil {
 | |
| 		t.Fatalf("Failed to Chdir on %s: %v", testDir, err)
 | |
| 	}
 | |
| 
 | |
| 	tarPath := fmt.Sprintf("%s.tar.gz", dockerfile)
 | |
| 
 | |
| 	var wg sync.WaitGroup
 | |
| 	wg.Add(1)
 | |
| 	// Create Tar Gz File with dockerfile inside
 | |
| 	go func(wg *sync.WaitGroup) {
 | |
| 		defer wg.Done()
 | |
| 		tarFile, err := os.Create(tarPath)
 | |
| 		if err != nil {
 | |
| 			t.Errorf("Failed to create %s: %v", tarPath, err)
 | |
| 		}
 | |
| 		defer tarFile.Close()
 | |
| 
 | |
| 		gw := gzip.NewWriter(tarFile)
 | |
| 		defer gw.Close()
 | |
| 
 | |
| 		tw := util.NewTar(gw)
 | |
| 		defer tw.Close()
 | |
| 
 | |
| 		if err := tw.AddFileToTar(dockerfile); err != nil {
 | |
| 			t.Errorf("Failed to add %s to %s: %v", dockerfile, tarPath, err)
 | |
| 		}
 | |
| 	}(&wg)
 | |
| 
 | |
| 	// Waiting for the Tar Gz file creation to be done before moving on
 | |
| 	wg.Wait()
 | |
| 
 | |
| 	// Build with docker
 | |
| 
 | |
| 	dockerImage := GetDockerImage(config.imageRepo, dockerfile)
 | |
| 	dockerCmd := exec.Command("docker",
 | |
| 		append([]string{"build",
 | |
| 			"-t", dockerImage,
 | |
| 			"-f", dockerfile,
 | |
| 			"."})...)
 | |
| 
 | |
| 	_, err := RunCommandWithoutTest(dockerCmd)
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("can't run %s: %v", dockerCmd.String(), err)
 | |
| 	}
 | |
| 
 | |
| 	// Build with kaniko using Stdin
 | |
| 	kanikoImageStdin := GetKanikoImage(config.imageRepo, dockerfile)
 | |
| 	tarCmd := exec.Command("tar", "-cf", "-", dockerfile)
 | |
| 	gzCmd := exec.Command("gzip", "-9")
 | |
| 
 | |
| 	dockerRunFlags := []string{"run", "--interactive", "--net=host", "-v", cwd + ":/workspace"}
 | |
| 	dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)
 | |
| 	dockerRunFlags = append(dockerRunFlags,
 | |
| 		ExecutorImage,
 | |
| 		"-f", dockerfile,
 | |
| 		"-c", "tar://stdin",
 | |
| 		"-d", kanikoImageStdin)
 | |
| 
 | |
| 	kanikoCmdStdin := exec.Command("docker", dockerRunFlags...)
 | |
| 
 | |
| 	gzCmd.Stdin, err = tarCmd.StdoutPipe()
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("can't set gzCmd stdin: %v", err)
 | |
| 	}
 | |
| 	kanikoCmdStdin.Stdin, err = gzCmd.StdoutPipe()
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("can't set kanikoCmd stdin: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	if err := kanikoCmdStdin.Start(); err != nil {
 | |
| 		t.Fatalf("can't start %s: %v", kanikoCmdStdin.String(), err)
 | |
| 	}
 | |
| 
 | |
| 	if err := gzCmd.Start(); err != nil {
 | |
| 		t.Fatalf("can't start %s: %v", gzCmd.String(), err)
 | |
| 	}
 | |
| 
 | |
| 	if err := tarCmd.Run(); err != nil {
 | |
| 		t.Fatalf("can't start %s: %v", tarCmd.String(), err)
 | |
| 	}
 | |
| 
 | |
| 	if err := gzCmd.Wait(); err != nil {
 | |
| 		t.Fatalf("can't wait %s: %v", gzCmd.String(), err)
 | |
| 	}
 | |
| 
 | |
| 	if err := kanikoCmdStdin.Wait(); err != nil {
 | |
| 		t.Fatalf("can't wait %s: %v", kanikoCmdStdin.String(), err)
 | |
| 	}
 | |
| 
 | |
| 	diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImageStdin, "--no-cache")
 | |
| 
 | |
| 	expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImageStdin, dockerImage, kanikoImageStdin)
 | |
| 	checkContainerDiffOutput(t, diff, expected)
 | |
| 
 | |
| 	if err := os.RemoveAll(testDirLongPath); err != nil {
 | |
| 		t.Errorf("Failed to remove %s: %v", testDirLongPath, err)
 | |
| 	}
 | |
| }
 |