diff --git a/Dockerfile b/Dockerfile index 4bf1f47..00c0255 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,3 @@ -FROM alpine:3.3 -MAINTAINER chengtiesheng - -RUN apk add --no-cache \ - bash \ - iptables \ - ca-certificates \ - e2fsprogs - -ADD https://get.docker.com/builds/Linux/x86_64/docker-1.9.1 /usr/bin/docker -ADD *.sh / -COPY builder /usr/local/bin/builder -RUN chmod +x /usr/bin/docker /usr/local/bin/* && rm -fr /var/lib/docker/* - -CMD ["/run.sh"] +FROM scratch +MAINTAINER wangshupo +EXPOSE 8080 diff --git a/builder b/builder index 0cafc5d..9813944 100755 Binary files a/builder and b/builder differ diff --git a/builder_test.go b/builder_test.go new file mode 100755 index 0000000..ad26dba --- /dev/null +++ b/builder_test.go @@ -0,0 +1,359 @@ +package main + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "os/exec" + "strings" + "testing" +) + +var ( + err error + serveraddress string + + dockernode string + serveraddresstemp string + buf *bytes.Buffer + fout os.File + data PushAuth + readerForInput io.Reader + s string + Criticalsize int64 = 1024 + DockerHubAddr = "https://index.docker.io/v1/" + //for old + out []byte + fi os.FileInfo + DockerBinary = "docker" + Build = "build" + TagFlag = "-t" + PwdPath = "." + Run = "run" + Rm = "--rm" + It = "-it" + Privileged = "--privileged" + Export = "-e" + ImageName = "IMAGE_NAME=wspbuilder001" + UserName = "USERNAME=dylanpoe" + PassWord = "PASSWORD=wangshupo4507" + Email = "EMAIL=1121140449@qq.com" + DockerFileUrl = "DOCKERFILE_URL=http://192.168.10.1:8080/Dockerfile" + RepoName = "wsp/builder" + + EnvCommandsDockerFile_URL = map[string]string{ + "IMAGE_NAME": "wspbuilder001", + "USERNAME": "dylanpoe", + "PASSWORD": "wangshupo4507", + "EMAIL": "1121140449@qq.com", + "DOCKERFILE_URL": "http://192.168.10.1:8080/Dockerfile", + } + EnvCommandsDockerFile_URLN = map[string]string{ + "IMAGE_NAME": "wspbuilder001", + "USERNAME": "dylanpoe", + "PASSWORD": "wangshupo4507", + "EMAIL": "1121140449@qq.com", + "DOCKERFILE_URL": "http://192.168.10.1:8080/DockerfileNoneExist", + } + //for old + + EnvCommandsGit = map[string]string{ + "IMAGE_NAME": "wspbuilder001", + "USERNAME": "dylanpoe", + "PASSWORD": "wangshupo4507", + "EMAIL": "1121140449@qq.com", + "GIT_USER": "dylanpoe", + "GIT_REPO": "build-testNULL", + "GIT_TAG": "master", + } + EnvCommandsTar = map[string]string{ + "IMAGE_NAME": "wspbuilder001", + "USERNAME": "dylanpoe", + "PASSWORD": "wangshupo4507", + "EMAIL": "1121140449@qq.com", + "TGZ_URL": "https://github.com/Chengtiesheng/build-test/archive/master.tar.gz", + } + + partialEnvCommands = map[string]string{ + "EMAIL": "1121140449@qq.com", + "PASSWORD": "wangshupo4507", + } + EmptyEnvCommands = map[string]string{ + "IMAGE_NAME": "", + "USERNAME": "", + "PASSWORD": "", + "EMAIL": "", + "DOCKERFILE": "", + "DOCKERFILE_URL": "", + "TGZ_URL": "", + "GIT_USER": "", + "GIT_REPO": "", + "GIT_TAG": "", + } + DockerFileURLNoneExist = map[string]string{ + "DOCKERFILE_URL": "http://192.168.10.1:8080/DockerfileNoneExist", + } + + TarURLNone = map[string]string{ + "TGZ_URL": "https://github.com/Chengtiesheng/build-test/archive/None-master.tar.gz", + } + GitRepoNoneExist = map[string]string{ + "GitRepo": "build-testNoneExist", + } + + passedParams = PassedParams{ + ImageName: "", + Username: "", + Password: "", + Email: "", + Dockerfile: "", + DockerfileURL: "", + TarURL: "", + GitUsr: "", + GitRepo: "", + GitTag: "", + } +) + +func isFileExists(file string) bool { + fi, err = os.Stat(file) + + if err != nil && os.IsNotExist(err) { + fmt.Printf("file not exist!\n") + return false + } + return true +} + +func SetExportEnv(envmap map[string]string) error { + for name, str := range envmap { + err := os.Setenv(name, str) + if err != nil { + return err + } + } + return nil +} + +func GetExportVarAndErr(env map[string]string) (PassedParams, error) { + err := SetExportEnv(env) + + if nil == err { + ImageName := os.Getenv("IMAGE_NAME") + Username := os.Getenv("USERNAME") + Password := os.Getenv("PASSWORD") + Email := os.Getenv("EMAIL") + Dockerfile := os.Getenv("DOCKERFILE") + DockerfileURL := os.Getenv("DOCKERFILE_URL") + TarURL := os.Getenv("TGZ_URL") + GitUsr := os.Getenv("GIT_USER") + GitRepo := os.Getenv("GIT_REPO") + GitTag := os.Getenv("GIT_TAG") + + passedParams = PassedParams{ + ImageName: ImageName, + Username: Username, + Password: Password, + Email: Email, + Dockerfile: Dockerfile, + DockerfileURL: DockerfileURL, + TarURL: TarURL, + GitUsr: GitUsr, + GitRepo: GitRepo, + GitTag: GitTag, + } + return passedParams, nil + } + return passedParams, err +} + +//To exec the make commands +func MakefileOKInit() { + + if isFileExists("Makefile") { + out, err = exec.Command("make").Output() + if err != nil { + log.Fatalln("Fail to execute Makefile %v", err.Error()) + } + } else { + log.Fatalln("Makefile does not exist %v", err.Error()) + } + fmt.Println(string(out)) +} + +//To build docker images and add a tag +func DockerbuildTag() { + + if isFileExists("builder") { + out, err = exec.Command(DockerBinary, Build, TagFlag, RepoName, PwdPath).Output() + if err != nil { + log.Fatalln("Execute docker build -t %v", err.Error()) + } + } + + fmt.Println(string(out)) +} + +//Check tar url is available +func CheckTarURL(url string) bool { + resp, err := http.Head(url) + if err != nil { + fmt.Errorf("error in set passedParams.TarURL:%v: %v", passedParams.TarURL, err) + return false + } + defer func() { + if resp != nil { + resp.Body.Close() + } + }() + resp.Header.Set("Connection", "close") + fmt.Println("resp.ContentLength", resp.ContentLength) + if resp.ContentLength < Criticalsize { + fmt.Errorf("error in Get passedParams.TarURL:%v.", url) + return false + } + return true +} + +//Test parameters +func TestValidatePara(t *testing.T) { + _, _ = GetExportVarAndErr(EmptyEnvCommands) + passedParams, _ = GetExportVarAndErr(EmptyEnvCommands) + if Validate(passedParams) { + t.Errorf("The parameter is empty,should be wrong.") + } + + _, _ = GetExportVarAndErr(EmptyEnvCommands) + passedParams, _ = GetExportVarAndErr(partialEnvCommands) + if Validate(passedParams) { + t.Errorf("Insufficient Information. Must provide at least an Image Name and a Dockerfile/Tarurl.,%v", err) + } + + _, _ = GetExportVarAndErr(EmptyEnvCommands) + passedParams, _ = GetExportVarAndErr(EnvCommandsDockerFile_URL) + if Validate(passedParams) { + log.Printf("Test Params OK IMAGE_NAME:%v,UserName:%v,Password:%v,Email:%v,DOCKERFILE_URL:%v.", passedParams.ImageName, passedParams.Username, passedParams.Password, passedParams.Email, passedParams.DockerfileURL) + } else { + //Params didn't validate. Bad Request. + t.Errorf("Insufficient Information. Must provide at least an Image Name and a Dockerfile/Tarurl.") + return + } +} + +//Test the encryption authention +func TestStringEncAuth(t *testing.T) { + passedParams, _ = GetExportVarAndErr(EnvCommandsDockerFile_URL) + data.Username = passedParams.Username + data.Password = passedParams.Password + data.Email = passedParams.Email + data.Serveraddress = DockerHubAddr + jsonData, err := json.Marshal(data) + if err != nil { + t.Errorf("error in TestStringEncAuth: %v", err) + } + sEnc := base64.StdEncoding.EncodeToString([]byte(jsonData)) + fmt.Println(string(sEnc)) +} + +//Test server address +func TestServerAddress(t *testing.T) { + serveraddresstemp = ServerAddress(serveraddress) + fmt.Println(serveraddresstemp) + if serveraddresstemp != DockerHubAddr { + t.Errorf("error in TestServerAddress: %v", err) + } + serveraddress = "wspbuilder002" + serveraddresstemp = ServerAddress(serveraddress) + if "https://wspbuilder002/v1/" != serveraddresstemp { + t.Errorf("error in TestServerAddress: %v", err) + } +} + +//Test git repository +func TestReaderForGitRepo(t *testing.T) { + _, _ = GetExportVarAndErr(EmptyEnvCommands) + passedParams, _ = GetExportVarAndErr(EnvCommandsGit) + _, err = ReaderForInputType(passedParams) + if err == nil { + t.Errorf("error in TestReaderForGitRepo: %v", err) + return + } + + passedParams, _ = GetExportVarAndErr(GitRepoNoneExist) + _, err = ReaderForInputType(passedParams) + if err == nil { + t.Errorf("error in TestReaderForGitRepo: %v", err) + return + } +} + +//Test DockerfileURL +func TestReaderForDockerfileURL(t *testing.T) { + _, _ = GetExportVarAndErr(EmptyEnvCommands) + passedParams, _ = GetExportVarAndErr(EnvCommandsDockerFile_URL) + readerForInput, _ = ReaderForInputType(passedParams) + + buf = new(bytes.Buffer) + buf.ReadFrom(readerForInput) + s = buf.String() // Does a complete copy of the bytes in the buffer. + + if !strings.Contains(s, "MAINTAINER") { + t.Errorf("error in TestReaderForDockerfileURL the dockerfile is not exist,%v", err) + return + } + + _, _ = GetExportVarAndErr(EmptyEnvCommands) + passedParams, _ = GetExportVarAndErr(EnvCommandsDockerFile_URLN) + readerForInput, err = ReaderForInputType(passedParams) + buf = new(bytes.Buffer) + buf.ReadFrom(readerForInput) + s = buf.String() // Does a complete copy of the bytes in the buffer. + + if strings.Contains(s, "MAINTAINER") { + t.Errorf("error in TestReaderForDockerfileURL the dockerfile is not exist,%v", err) + return + } +} + +//Test for Tar URL +func TestReaderForTarURL(t *testing.T) { + _, _ = GetExportVarAndErr(EmptyEnvCommands) + passedParams, _ = GetExportVarAndErr(EnvCommandsTar) + _, err = ReaderForInputType(passedParams) + if err != nil { + t.Errorf("Get nothing in TestReaderForTarURL: %v", err) + return + } + if !CheckTarURL(passedParams.TarURL) { + t.Errorf("The url is not lead to a .tar.gz file") + return + } + passedParams, _ = GetExportVarAndErr(TarURLNone) + _, err = ReaderForInputType(passedParams) + if err != nil { + t.Errorf("Get nothing in TestReaderForTarURL: %v", err) + return + } + // fmt.Println(passedParams.TarURL) + if CheckTarURL(passedParams.TarURL) { + t.Errorf("The url should not lead to a .tar.gz file") + return + } + +} + +//Test push to hub +func TestDockerPushToHub(t *testing.T) { + MakefileOKInit() + DockerbuildTag() + out, err = exec.Command(DockerBinary, Run, Rm, It, Privileged, Export, ImageName, Export, UserName, Export, PassWord, Export, Email, Export, DockerFileUrl, RepoName).Output() + if err != nil { + t.Errorf("Execute docker run --rm -it --Privileged fail %v ", err.Error()) + } + fmt.Println(string(out)) + return +}