Compare commits

..

26 Commits

Author SHA1 Message Date
31d77efe84 Merge branch 'master' into kd-live 2023-09-05 17:16:43 +09:00
3ace1be27a stdout을 dev/null로 redirect 2023-09-05 17:16:05 +09:00
3fccae1ef5 Merge branch 'master' into kd-live 2023-07-03 14:32:09 +09:00
3dc121bc71 버전에 태그가 일찍 붙는 문제 수정 2023-07-03 14:31:55 +09:00
706339a386 Merge branch 'master' into kd-live 2023-07-03 14:18:20 +09:00
849973c449 서비스 자체 태그도 넘겨줌 2023-07-03 14:18:11 +09:00
759dcaf00b Merge branch 'master' into kd-live 2023-07-03 14:12:35 +09:00
d1a192159b 서비스 태그를 하위 버전에도 붙여줌 2023-07-03 14:12:21 +09:00
db4769687c Merge branch 'master' into kd-live 2023-07-03 14:08:46 +09:00
7a5696961f 버전에 태그를 붙임 2023-07-03 14:08:28 +09:00
7418d847b7 Merge branch 'master' into kd-live 2023-07-03 11:44:00 +09:00
4d9a25dd6b 클라이언트에서는 태그를 없애고 서버에서만 관리 2023-07-03 11:34:21 +09:00
b057730ad5 Merge branch 'master' into kd-live 2023-07-03 10:54:27 +09:00
9bd09509c8 reaonly 대신 tag로 교체 2023-07-03 10:54:13 +09:00
d526a923ca Merge branch 'master' into kd-live 2023-06-30 16:48:51 +09:00
1b57e9f87e 업로드 된 로그 파일은 지우되, 최신도 같이 지워지던 문제 수정 2023-06-30 16:48:13 +09:00
30412bce70 Merge branch 'master' into kd-live 2023-06-30 16:38:13 +09:00
4667d351a8 업로드한 로그 제거 안함 2023-06-30 16:38:01 +09:00
20dc204cb1 Merge branch 'master' into kd-live 2023-06-30 15:51:47 +09:00
571f0d76df 업로드한 로그도 제거하지 말자 2023-06-30 15:51:03 +09:00
025e583f12 Merge branch 'master' into kd-live 2023-06-29 14:13:17 +09:00
15dd1e544c 하위 폴더 복사 누락 수정 2023-06-29 14:13:04 +09:00
b3ed139431 Merge branch 'master' into kd-live 2023-06-29 12:24:22 +09:00
45ab15d345 gracefulstop 말고 바로 stop 2023-06-29 12:24:13 +09:00
c0a0f88220 Merge branch 'master' into kd-live 2023-06-29 12:05:22 +09:00
02db65e06f houston 버전 관리 2023-06-29 12:05:11 +09:00
7 changed files with 87 additions and 64 deletions

View File

@ -164,24 +164,32 @@ func gatherDeployedPrograms(storageRoot, name string) []*protos.VersionAndArgs {
} }
func (hc *houstonClient) makeOperationQueryRequest() *protos.OperationQueryRequest { func (hc *houstonClient) makeOperationQueryRequest() *protos.OperationQueryRequest {
procs := make([]*protos.ProcessDescription, 0, len(hc.childProcs)+1) var procs []*protos.ProcessDescription
var deploys []*protos.DeployedVersions
var selfname string
var selfargs []string
if hc.standalone { if hc.standalone {
procs = append(procs, &protos.ProcessDescription{ selfname = path.Base(os.Args[0])
Name: os.Args[0], selfargs = os.Args[1:]
Args: os.Args[1:],
Version: hc.version,
State: protos.ProcessState_Running,
Pid: int32(os.Getpid()),
})
} else { } else {
selfname = "houston"
selfargs = []string{}
}
procs = append(procs, &protos.ProcessDescription{ procs = append(procs, &protos.ProcessDescription{
Name: "houston", Name: selfname,
Args: []string{}, Args: selfargs,
Version: hc.version, Version: hc.version,
State: protos.ProcessState_Running, State: protos.ProcessState_Running,
Pid: int32(os.Getpid()), Pid: int32(os.Getpid()),
}) })
} deploys = append(deploys, &protos.DeployedVersions{
Name: selfname,
Versions: []*protos.VersionAndArgs{
{Version: hc.version, Args: selfargs},
},
})
for _, child := range hc.childProcs { for _, child := range hc.childProcs {
procs = append(procs, &protos.ProcessDescription{ procs = append(procs, &protos.ProcessDescription{
@ -193,13 +201,13 @@ func (hc *houstonClient) makeOperationQueryRequest() *protos.OperationQueryReque
}) })
} }
var deploys []*protos.DeployedVersions
for name, prog := range hc.deploys { for name, prog := range hc.deploys {
deploys = append(deploys, &protos.DeployedVersions{ deploys = append(deploys, &protos.DeployedVersions{
Name: name, Name: name,
Versions: prog, Versions: prog,
}) })
} }
hn, _ := os.Hostname() hn, _ := os.Hostname()
return &protos.OperationQueryRequest{ return &protos.OperationQueryRequest{
Hostname: hn, Hostname: hn,

View File

@ -102,11 +102,12 @@ func zipLogFiles(storageRoot string, req *shared.UploadRequest, start, except st
defer w.Close() defer w.Close()
oldestFile := "" oldestFile := ""
for _, file := range matches { for i, file := range matches {
if file == root { if file == root {
continue continue
} }
if len(except) > 0 && file >= except { if len(except) > 0 && file >= except {
matches = matches[:i]
break break
} }
if len(start) > 0 && file < start { if len(start) > 0 && file < start {
@ -480,11 +481,7 @@ func (hc *houstonClient) uploadFiles(req *shared.UploadRequest) error {
// 전체 파일을 대상으로 // 전체 파일을 대상으로
zipFile, srcFiles, err := zipLogFiles(hc.config.StorageRoot, req, "", "") zipFile, srcFiles, err := zipLogFiles(hc.config.StorageRoot, req, "", "")
if err == nil && len(zipFile) > 0 && len(srcFiles) > 0 { if err == nil && len(zipFile) > 0 && len(srcFiles) > 0 {
if err = hc.uploadZipLogFile(zipFile, req.Name, req.Version); err == nil { if err = hc.uploadZipLogFile(zipFile, req.Name, req.Version); err != nil {
for _, oldf := range srcFiles {
os.Remove(oldf)
}
} else {
logger.Println("uploadZipLogFile failed :", err) logger.Println("uploadZipLogFile failed :", err)
} }
} else if err != nil { } else if err != nil {

View File

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/sh
nohup /home/opdev/houston -client -logfile & nohup /home/opdev/houston -client -logfile > /dev/null &

View File

@ -11,11 +11,21 @@ import (
"time" "time"
) )
func copy(src, dst string) error { func copy(src, dst string, stdlog *log.Logger) error {
fi, err := os.Stat(src) fi, err := os.Stat(src)
if err != nil { if err != nil {
return err return err
} }
if fi.IsDir() {
entries, _ := os.ReadDir(src)
for _, ent := range entries {
if err := copy(path.Join(src, ent.Name()), path.Join(dst, ent.Name()), stdlog); err != nil {
return err
}
}
return nil
}
inmode := fi.Mode() inmode := fi.Mode()
in, err := os.Open(src) in, err := os.Open(src)
@ -45,6 +55,7 @@ func copy(src, dst string) error {
return err return err
} }
stdlog.Println("file copied :", src, dst)
return nil return nil
} }
@ -70,38 +81,21 @@ func main() {
stdlog.Println("target is terminated") stdlog.Println("target is terminated")
selfext, _ := os.Executable() // replacer 제거. 내가 돌고 있으므로 복사는 안된다.
selfext = path.Base(selfext) // 내가 실행되기 전에 이미 복사가 되서 나는 최신 버전임
nextArgs := args[4:] os.Remove(path.Join(args[2], os.Args[0]))
entries, _ := os.ReadDir(args[2]) if err := copy(args[2], "", stdlog); err != nil {
for _, ent := range entries { stdlog.Fatal(err)
if ent.Name() == selfext {
continue
} }
if ent.IsDir() { nextArgs := args[4:]
if err := os.MkdirAll(ent.Name(), 0775); err != nil { if bt, _ := os.ReadFile("@args"); len(bt) > 0 {
stdlog.Fatal(err)
}
} else {
if ent.Name() == "@args" {
var tempArgs []string var tempArgs []string
argfile, _ := os.Open(path.Join(args[2], ent.Name())) if json.Unmarshal(bt, &tempArgs) == nil {
dec := json.NewDecoder(argfile)
if dec.Decode(&tempArgs) == nil {
nextArgs = tempArgs nextArgs = tempArgs
} }
} else {
err := copy(path.Join(args[2], ent.Name()), ent.Name())
if err != nil {
stdlog.Println("copy failed :", path.Join(args[2], ent.Name()), ent.Name())
stdlog.Fatal(err)
} else {
stdlog.Println("file copied :", path.Join(args[2], ent.Name()), ent.Name())
}
}
}
} }
os.Remove("@args")
err := os.RemoveAll(args[2]) err := os.RemoveAll(args[2])
if err != nil { if err != nil {

View File

@ -34,6 +34,16 @@ func (h *houstonHandler) GetAgents(w http.ResponseWriter, r *http.Request) {
enc.Encode(allHosts) enc.Encode(allHosts)
} }
func readTagsFromFile(paths ...string) string {
raw, _ := os.ReadFile(path.Join(paths...))
if len(raw) > 0 {
tag := string(raw)
return strings.Trim(tag, "\n")
}
return ""
}
func (h *houstonHandler) GetDeploySources(w http.ResponseWriter, r *http.Request) { func (h *houstonHandler) GetDeploySources(w http.ResponseWriter, r *http.Request) {
files, err := os.ReadDir(h.deployPath) files, err := os.ReadDir(h.deployPath)
if err != nil { if err != nil {
@ -43,19 +53,31 @@ func (h *houstonHandler) GetDeploySources(w http.ResponseWriter, r *http.Request
} }
getVersions := func(name string) []string { getVersions := func(name string) []string {
var out []string
vers, _ := os.ReadDir(path.Join(h.deployPath, name)) vers, _ := os.ReadDir(path.Join(h.deployPath, name))
mytags := readTagsFromFile(h.deployPath, name, "@tags")
out := []string{
mytags,
}
for _, fd := range vers { for _, fd := range vers {
if fd.IsDir() { if fd.IsDir() {
ver := fd.Name() ver := fd.Name()
files, _ := os.ReadDir(path.Join(h.deployPath, name, ver)) files, _ := os.ReadDir(path.Join(h.deployPath, name, ver))
vertags := readTagsFromFile(h.deployPath, name, ver, "@tags")
if len(files) > 0 { if len(files) > 0 {
downloadpath := path.Join(sub_folder_name_deploys, name, ver, files[0].Name()) for _, file := range files {
ver = fmt.Sprintf("%s:%s", ver, downloadpath) if strings.HasPrefix(file.Name(), "@") {
continue
}
downloadpath := path.Join(sub_folder_name_deploys, name, ver, file.Name())
ver = fmt.Sprintf("%s:%s", ver+mytags+vertags, downloadpath)
break
}
} }
out = append(out, ver) out = append(out, ver)
} }
} }
return out return out
} }
@ -100,8 +122,12 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque
if version == "config" { if version == "config" {
filename = path.Join(h.deployPath, name, version, "config"+ext) filename = path.Join(h.deployPath, name, version, "config"+ext)
tags := readTagsFromFile(h.deployPath, name, version, "@tags")
if !strings.Contains(tags, "#hidden") {
tags = tags + "#hidden"
os.WriteFile(path.Join(h.deployPath, name, version, "@tags"), []byte(tags), 0644)
}
} else { } else {
// deploys 폴더는 파일시스템 서비스이므로 다운로드 가능
filename = path.Join(h.deployPath, name, version, name+ext) filename = path.Join(h.deployPath, name, version, name+ext)
} }
@ -223,6 +249,10 @@ func (h *houstonHandler) Deploy(w http.ResponseWriter, r *http.Request) {
continue continue
} }
if strings.HasPrefix(fd.Name(), "@") {
continue
}
fi, _ := fd.Info() fi, _ := fd.Info()
if fi.ModTime().After(latestTime) { if fi.ModTime().After(latestTime) {
latestFilename = fi.Name() latestFilename = fi.Name()

View File

@ -165,8 +165,6 @@ func marshal(argval reflect.Value, output map[string]string) map[string]string {
} }
func (os *operationServer) Query(svr protos.Operation_QueryServer) error { func (os *operationServer) Query(svr protos.Operation_QueryServer) error {
// 서버는 업데이트가 있는지 확인하고 있으면 stream에 응답을 보낸다.
// 업데이트가 없으면 대기
desc, err := svr.Recv() desc, err := svr.Recv()
if err != nil { if err != nil {
return err return err

View File

@ -186,9 +186,7 @@ func (hs *houstonServer) Start() error {
go func() { go func() {
hc.Start() hc.Start()
logger.Println("houstonClient is finished")
if atomic.AddInt32(&closeCount, 1) == 1 { if atomic.AddInt32(&closeCount, 1) == 1 {
logger.Println("try stop houstonServer")
hs.Stop() hs.Stop()
} }
}() }()
@ -197,17 +195,15 @@ func (hs *houstonServer) Start() error {
err = hs.rpcServer.Serve(lis) err = hs.rpcServer.Serve(lis)
if atomic.AddInt32(&closeCount, 1) == 1 { if atomic.AddInt32(&closeCount, 1) == 1 {
if hc != nil { if hc != nil {
logger.Println("try stop houstonClient")
hc.Shutdown() hc.Shutdown()
} }
} }
logger.Println("houstonServer is finished")
return err return err
} }
func (hs *houstonServer) Stop() { func (hs *houstonServer) Stop() {
hs.rpcServer.GracefulStop() hs.rpcServer.Stop()
} }
func (hs *houstonServer) Operation() Operation { func (hs *houstonServer) Operation() Operation {