docker.go 3.3 KB
Newer Older
雨爱无痕 已提交
1
package commonTestHelper
save  
雨爱无痕 已提交
2 3

import (
雨爱无痕 已提交
4
	"errors"
save  
雨爱无痕 已提交
5
	"fmt"
save  
雨爱无痕 已提交
6 7 8 9
	"os"
	"os/exec"
	"runtime"
	"strings"
save  
雨爱无痕 已提交
10 11
	"time"

雨爱无痕 已提交
12
	constTestHelper "github.com/easysoft/zentaoatf/test/helper/conf"
save  
雨爱无痕 已提交
13
	uiTest "github.com/easysoft/zentaoatf/test/helper/zentao/ui"
save  
雨爱无痕 已提交
14 15
)

Save  
雨爱无痕 已提交
16
func Run(version string, codeDir string) (err error) {
雨爱无痕 已提交
17
	versionNumber := strings.ReplaceAll(version, ".", "_")
Save  
雨爱无痕 已提交
18
	// codeDir = "/www/zentaopms" + versionNumber
save  
雨爱无痕 已提交
19 20

	_, err = os.Stat(codeDir)
雨爱无痕 已提交
21 22
	if os.IsExist(err) {
		os.RemoveAll(codeDir)
save  
雨爱无痕 已提交
23 24
	}

test  
雨爱无痕 已提交
25
	// cmd := exec.Command("docker", "run", "--name", "zentao"+versionNumber, "-p", "8081:80", "-v", codeDir+":/www/zentaopms", "-d", "easysoft/zentao:"+version)
雨爱无痕 已提交
26
	cmd := exec.Command("docker", "run", "--name", "zentao"+versionNumber, "-p", "8081:80", "-d", "easysoft/zentao:"+version)
save  
雨爱无痕 已提交
27
	fmt.Println(cmd.String())
Save  
雨爱无痕 已提交
28
	output, err := cmd.CombinedOutput()
save  
雨爱无痕 已提交
29
	if err != nil {
雨爱无痕 已提交
30 31 32 33
		return
	}
	if strings.Contains(string(output), "exit") {
		return errors.New("Run docker fail")
save  
雨爱无痕 已提交
34 35 36
	}
	return err
}
save  
雨爱无痕 已提交
37

雨爱无痕 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
func IsExistContainer(name string) bool {
	cmd := exec.Command("docker", "ps", "-a", "--format", "'{{.Names}}'")
	output, err := cmd.CombinedOutput()
	if err != nil {
		return false
	}
	return strings.Contains(string(output), name)
}

func IsRuning(name string) bool {
	cmd := exec.Command("docker", "ps", "--format", "'{{.Names}}'")
	output, err := cmd.CombinedOutput()
	if err != nil {
		return false
	}
	return strings.Contains(string(output), name)
}

Save  
雨爱无痕 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
func List() []string {
	cmd := exec.Command("docker", "ps", "--format", "'{{.Names}}'")
	output, err := cmd.CombinedOutput()
	if err != nil {
		return nil
	}
	dockers := strings.Split(string(output), "\n")
	for index, dockerName := range dockers {
		dockerName = strings.TrimSpace(dockerName)
		dockerName = strings.Trim(dockerName, "'")
		dockers[index] = dockerName
	}
	return dockers
}

雨爱无痕 已提交
71 72 73
func Start(name string) bool {
	cmd := exec.Command("docker", "start", name)
	output, err := cmd.CombinedOutput()
雨爱无痕 已提交
74
	fmt.Println(cmd.String())
雨爱无痕 已提交
75 76 77 78 79 80
	if err != nil {
		return false
	}
	return strings.Contains(string(output), name)
}

Save  
雨爱无痕 已提交
81 82 83 84 85 86 87 88 89 90 91 92
func StopAll() bool {
	dockers := List()
	for _, dockerName := range dockers {
		if strings.Contains(dockerName, "zentao") {
			Stop(dockerName)
		}
	}
	return true
}

func Stop(name string) bool {
	cmd := exec.Command("docker", "kill", name)
雨爱无痕 已提交
93
	fmt.Println(cmd.String())
Save  
雨爱无痕 已提交
94 95 96 97 98 99 100
	_, err := cmd.CombinedOutput()
	if err != nil {
		return false
	}
	return true
}

雨爱无痕 已提交
101
func InitZentao(version string) (err error) {
雨爱无痕 已提交
102 103
	versionNumber := strings.ReplaceAll(version, ".", "_")
	containerName := "zentao" + versionNumber
雨爱无痕 已提交
104
	isExist := IsExistContainer(containerName)
Save  
雨爱无痕 已提交
105 106 107 108 109
	apath, _ := os.Getwd()
	codeDir := apath + "/docker/www/zentao" + versionNumber
	if runtime.GOOS == "windows" {
		codeDir = apath + `\docker\www\zentao` + versionNumber
	}
雨爱无痕 已提交
110 111
	if isExist {
		if !IsRuning(containerName) {
Save  
雨爱无痕 已提交
112
			StopAll()
雨爱无痕 已提交
113
			Start(containerName)
雨爱无痕 已提交
114
			waitZentaoAccessed()
雨爱无痕 已提交
115 116
		}
	} else {
Save  
雨爱无痕 已提交
117
		StopAll()
雨爱无痕 已提交
118 119 120 121
		err = Run(version, codeDir)
		if err != nil {
			return
		}
雨爱无痕 已提交
122
		waitZentaoAccessed()
save  
雨爱无痕 已提交
123
	}
雨爱无痕 已提交
124 125
	err = uiTest.InitZentaoData(version, codeDir)
	return
save  
雨爱无痕 已提交
126
}
雨爱无痕 已提交
127

Z
zhaoke 已提交
128 129 130 131 132
func InitZentaoData() (err error) {
	err = uiTest.InitZentaoData("latest", "")
	return
}

雨爱无痕 已提交
133 134 135 136 137 138
func waitZentaoAccessed() {
	isTimeout := false
	time.AfterFunc(20*time.Second, func() {
		isTimeout = true
	})
	for {
雨爱无痕 已提交
139
		status := uiTest.GetStatus(constTestHelper.ZentaoSiteUrl)
雨爱无痕 已提交
140 141 142
		if isTimeout || status {
			return
		}
雨爱无痕 已提交
143
		time.Sleep(3 * time.Second)
雨爱无痕 已提交
144 145
	}
}