이전 시간에 docker를 통해서 테스트를 실행하는 로직 자체는 만들었는데
프로그램 한번 눌렀을때 진행이 되는것이 편할거 같아서 script 파일을 하나 만들기로 했습니다.
그래서 어떻게 할까 고민중에 golang을 공부도 할겸 리눅스까지도 크로스컴파일이 되어야 하기 때문에 golang으로 간단한 스크립트 문을 만들기로 했습니다.
간단하게 스크립트 문이기 때문에 window에서 cmd를 통해서 파일을 실행시키는 로직 자체를 만들어 주기로 했습니다.
순서는 이러합니다.
굉장히 단순한 스크립트 파일을 만드는 거라 로직 자체는 그렇게 어려운것이 존재하지는 않습니다.
package main
import (
"fmt"
"os"
"os/exec"
"runtime"
"strings"
"time"
)
func main() {
args := os.Args
customCmd := "docker"
if len(args) > 1 {
customCmd = args[1]
}
executeCommand(customCmd)
executeCommand("docker-compose")
fmt.Println("정상적으로 docker 및 docker-compose가 설치된것을 확인했습니다.")
executeCommand("docker images")
fmt.Println("정상적으로 docker image가 설치된것을 확인했습니다.")
fmt.Println("자동 검사가 진행중입니다. 잠시만 기다려 주세요.")
executeCommand("docker-compose up")
fmt.Println("검사가 완료되었습니다. SLACK을 확인해주세요")
time.Sleep(5 * time.Second)
}
func executeCommand(command string) {
cmd := exec.Command("cmd", "/c", command)
if runtime.GOOS != "windows" {
stringArray := strings.Split(command, " ")
cmd = exec.Command(command)
if len(stringArray) > 1 {
cmd = exec.Command(stringArray[0], stringArray[1])
}
}
stdout, err := cmd.CombinedOutput()
if err != nil {
fmt.Println("ERROR : docker 및 docker-compose가 제대로 설치되었는지 확인해주세요")
time.Sleep(5 * time.Second)
panic(err)
}
if !strings.Contains(string(stdout), "autotest") && strings.Contains(command, "docker images") {
fmt.Println("docker image을 불러오고 있습니다. 시간이 소요될 수 있습니다.")
dockerCmd := exec.Command("cmd", "/c", "docker load -i test.tar")
if runtime.GOOS != "windows" {
dockerCmd = exec.Command("docker", "load", "-i", "test.tar")
}
stdoutImage, errImage := dockerCmd.CombinedOutput()
if errImage != nil {
fmt.Println("ERROR : .tar파일이 제대로있는지 확인해주세요.")
time.Sleep(5 * time.Second)
panic(err)
}
fmt.Println(string(stdoutImage))
}
}
위와 같이 window용과 linux용 script를 만들었습니다.
윈도우 용 build 명령어
set GOOS=windows
set GOARCH=amd64
go build main.go
리눅스 용 build 명령어
set GOOS=linux
set GOARCH=amd64 -> 해당 아키텍쳐는 다를수 있으니 확인하고 할것
go build main.go
해당 명령어를 통해서 build를 하였고 main.exe를 누르면 정상적으로 동작하는것을 확인했습니다.
