Skip to content

Commit 1f4b424

Browse files
committed
Add operation history logs
1 parent 13413bd commit 1f4b424

File tree

5 files changed

+127
-84
lines changed

5 files changed

+127
-84
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,7 @@ harp -s prod console <<<(ls)
466466
```
467467

468468
Note: harp console doesn't support blocking calls like `tail -f file.log`.
469+
470+
### Deployment history
471+
472+
harp saves a one-line deployment/restart/kill/rollback log in `~/harp/$APP_Name/log/history.log`.

harp.go

+52-30
Original file line numberDiff line numberDiff line change
@@ -306,17 +306,18 @@ func main() {
306306
case "log":
307307
option.toTailLog = true
308308
case "restart":
309-
option.noBuild = true
310-
option.noUpload = true
311-
deploy(servers)
309+
// option.noBuild = true
310+
// option.noUpload = true
311+
// deploy(servers)
312+
restart(servers)
312313
case "inspect":
313314
inspectScript(servers, args[1])
314315
case "rollback":
315316
if len(args) == 1 {
316317
fmt.Println("please specify rollback command or version")
317318
os.Exit(1)
318319
}
319-
if args[1] == "ls" || args[1] == "list" {
320+
if args[1] == "l" || args[1] == "ls" || args[1] == "list" {
320321
lsRollbackVersions(servers, args[1] == "list")
321322
} else {
322323
rollback(servers, strings.TrimSpace(args[1]))
@@ -454,7 +455,7 @@ func getBuildLog() string {
454455
vcs, checksum := retrieveChecksum()
455456
info += vcs + " Checksum: " + checksum
456457

457-
info += "Composer: " + retrieveAuthor()
458+
info += "Composer: " + retrieveAuthor() + "\n"
458459

459460
info += "Build At: " + time.Now().String()
460461

@@ -480,23 +481,21 @@ func retrieveChecksum() (vcs, checksum string) {
480481
return
481482
}
482483

483-
func retrieveAuthor() (author string) {
484+
func retrieveAuthor() string {
484485
name, err := ioutil.ReadFile(".harp-composer")
485486
if err == nil && len(name) > 0 {
486-
return string(name)
487+
return strings.TrimSpace(string(name))
487488
}
488489

489-
author = tryCmd("git", "config", "user.name")
490-
if author != "" {
491-
return
490+
if author := tryCmd("git", "config", "user.name"); author != "" {
491+
return strings.TrimSpace(author)
492492
}
493493

494-
author = tryCmd("whoami")
495-
if author != "" {
496-
return
494+
if author := tryCmd("whoami"); author != "" {
495+
return strings.TrimSpace(author)
497496
}
498497

499-
return "Unknown"
498+
return "anonymous"
500499
}
501500

502501
func isUsingGit() bool {
@@ -718,9 +717,9 @@ func inspectScript(servers []*Server, name string) {
718717
case "deploy":
719718
fmt.Println(s.retrieveDeployScript())
720719
case "restart":
721-
fmt.Println(s.retrieveRestartScript())
720+
fmt.Println(s.retrieveRestartScript(retrieveAuthor()))
722721
case "kill":
723-
fmt.Println(s.retrieveKillScript())
722+
fmt.Println(s.retrieveKillScript(retrieveAuthor()))
724723
case "rollback":
725724
fmt.Println(s.retrieveRollbackScript())
726725
default:
@@ -738,7 +737,7 @@ func kill(servers []*Server) {
738737

739738
session := s.getSession()
740739
defer session.Close()
741-
output, err := session.CombinedOutput(s.retrieveKillScript())
740+
output, err := session.CombinedOutput(s.retrieveKillScript(retrieveAuthor()))
742741
if err != nil {
743742
exitf("failed to exec %s: %s %s", option.script, string(output), err)
744743
}
@@ -748,13 +747,28 @@ func kill(servers []*Server) {
748747
wg.Wait()
749748
}
750749

751-
func (s *Server) retrieveKillScript() string {
750+
var killScriptTmpl = template.Must(template.New("").Parse(`set -e
751+
if [[ -f {{.Home}}/harp/{{.App.Name}}/app.pid ]]; then
752+
target=$(cat {{.Home}}/harp/{{.App.Name}}/app.pid);
753+
if ps -p $target > /dev/null; then
754+
kill -KILL $target; > /dev/null 2>&1;
755+
fi
756+
{{.GetHarpComposer}}
757+
echo "[harp] $(date) $harp_composer killed server" | tee -a {{.LogPath}} {{.HistoryLogPath}} >/dev/null
758+
fi`))
759+
760+
func (s *Server) retrieveKillScript(who string) string {
752761
s.initPathes()
753762
var buf bytes.Buffer
754763
if err := killScriptTmpl.Execute(&buf, struct {
755764
Config
756765
*Server
757-
}{Config: cfg, Server: s}); err != nil {
766+
GetHarpComposer string
767+
}{
768+
Config: cfg,
769+
Server: s,
770+
GetHarpComposer: s.GetHarpComposer(who),
771+
}); err != nil {
758772
exitf(err.Error())
759773
}
760774
if option.debug {
@@ -763,14 +777,24 @@ func (s *Server) retrieveKillScript() string {
763777
return buf.String()
764778
}
765779

766-
var killScriptTmpl = template.Must(template.New("").Parse(`set -e
767-
if [[ -f {{.Home}}/harp/{{.App.Name}}/app.pid ]]; then
768-
target=$(cat {{.Home}}/harp/{{.App.Name}}/app.pid);
769-
if ps -p $target > /dev/null; then
770-
kill -KILL $target; > /dev/null 2>&1;
771-
fi
772-
echo "[harp] $(date) server killed" >> {{.LogPath}}
773-
fi`))
780+
func restart(servers []*Server) {
781+
var wg sync.WaitGroup
782+
for _, server := range servers {
783+
wg.Add(1)
784+
go func(s *Server) {
785+
defer func() { wg.Done() }()
786+
787+
session := s.getSession()
788+
defer session.Close()
789+
output, err := session.CombinedOutput(s.retrieveRestartScript(retrieveAuthor()))
790+
if err != nil {
791+
exitf("failed to exec %s: %s %s", option.script, string(output), err)
792+
}
793+
log.Printf("%s restarted\n", s)
794+
}(server)
795+
}
796+
wg.Wait()
797+
}
774798

775799
func initXC() {
776800
goroot := strings.TrimSpace(cmd("go", "env", "GOROOT"))
@@ -795,6 +819,4 @@ func cleanCaches() {
795819
}
796820
}
797821

798-
func printVersion() {
799-
fmt.Printf("0.5.%d\n", version)
800-
}
822+
func printVersion() { fmt.Printf("0.6.%d\n", version) }

rollback.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,17 @@ func rollback(servers []*Server, version string) {
3939
s.initPathes()
4040
session := s.getSession()
4141
if option.debug {
42-
log.Println(s.retrieveRollbackScript())
42+
// log.Println(s.retrieveRollbackScript())
43+
cmd := fmt.Sprintf("cat %s/harp/%s/rollback.sh", s.Home, cfg.App.Name)
44+
output, err := session.CombinedOutput(cmd)
45+
if err != nil {
46+
log.Printf("failed to run %s\n", cmd)
47+
os.Exit(1)
48+
}
49+
fmt.Println(string(output))
4350
}
4451
// TODO: should return error when release does not exist
45-
output, err := session.CombinedOutput(fmt.Sprintf("%s/harp/%s/rollback.sh %s", s.Home, cfg.App.Name, version))
52+
output, err := session.CombinedOutput(fmt.Sprintf("harp_composer=%s %s/harp/%s/rollback.sh %s", retrieveAuthor(), s.Home, cfg.App.Name, version))
4653
if err != nil {
4754
log.Printf("rollback on %s error: %s\n%s\n", s, err, output)
4855
os.Exit(1)

0 commit comments

Comments
 (0)