Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 3 additions & 15 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,15 +1,3 @@
FROM alpine:3.3
MAINTAINER chengtiesheng <chengtiesheng@huawei.com>

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<wangshupo@chinasoft.inc>
EXPOSE 8080
Binary file modified builder
Binary file not shown.
359 changes: 359 additions & 0 deletions builder_test.go
Original file line number Diff line number Diff line change
@@ -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
}