Skip to content
This repository was archived by the owner on Jan 16, 2021. It is now read-only.

Commit fb8d807

Browse files
committed
add better error handling to deploy cmd
* we do not print the same error if it repeats multiple times * add wait time between deploy retries * print the full error message each time it is different that means we will also print script errors now
1 parent 4ce82a4 commit fb8d807

File tree

2 files changed

+63
-14
lines changed

2 files changed

+63
-14
lines changed

deploy_cmd.go

Lines changed: 55 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"sort"
1515
"strings"
1616
"sync"
17+
"time"
1718

1819
"github.com/facebookgo/errgroup"
1920
"github.com/facebookgo/jsonpipe"
@@ -32,6 +33,7 @@ type deployCmd struct {
3233
Force bool
3334
Verbose bool
3435
Retries int
36+
wait func(int) time.Duration
3537
}
3638

3739
func (d *deployCmd) getSourceFiles(
@@ -463,34 +465,75 @@ func (d *deployCmd) deploy(
463465
}, nil
464466
}
465467

468+
func (d *deployCmd) handleError(
469+
n int,
470+
err, prevErr error,
471+
e *env,
472+
) error {
473+
if err == nil {
474+
return nil
475+
}
476+
if n == d.Retries-1 {
477+
return err
478+
}
479+
480+
var waitTime time.Duration
481+
if d.wait != nil {
482+
waitTime = d.wait(n)
483+
}
484+
485+
errStr := errorString(e, err)
486+
if prevErr != nil {
487+
prevErrStr := errorString(e, prevErr)
488+
if prevErrStr == errStr {
489+
fmt.Fprintf(
490+
e.Err,
491+
"Sorry, deploy failed again with same error.\nWill retry in %d seconds.\n\n",
492+
waitTime/time.Second,
493+
)
494+
time.Sleep(waitTime)
495+
return nil
496+
}
497+
}
498+
499+
fmt.Fprintf(
500+
e.Err,
501+
"Deploy failed with error:\n%s\nWill retry in %d seconds.\n\n",
502+
errStr,
503+
waitTime/time.Second,
504+
)
505+
time.Sleep(waitTime)
506+
return nil
507+
}
508+
466509
func (d *deployCmd) run(e *env, c *client) error {
467-
first := true
510+
var prevErr error
468511
for i := 0; i < d.Retries; i++ {
469-
if !first {
470-
fmt.Fprintf(e.Err, "Deploy failed. Retrying deploy...\n\n")
471-
}
472-
config := c.Config
473-
parseVersion := config.getProjectConfig().Parse.JSSDK
512+
parseVersion := c.Config.getProjectConfig().Parse.JSSDK
474513
newDeployInfo, err := d.deploy(parseVersion, nil, false, e)
475514
if err == nil {
476515
if parseVersion == "" && newDeployInfo != nil && newDeployInfo.ParseVersion != "" {
477-
config.getProjectConfig().Parse.JSSDK = newDeployInfo.ParseVersion
478-
return storeProjectConfig(e, config)
516+
c.Config.getProjectConfig().Parse.JSSDK = newDeployInfo.ParseVersion
517+
return storeProjectConfig(e, c.Config)
479518
}
480519
return nil
481520
}
482-
483-
first = false
484-
if i == d.Retries-1 {
521+
if err := d.handleError(i, err, prevErr, e); err != nil {
485522
return err
486523
}
524+
prevErr = err
487525
}
488526

489527
return nil
490528
}
491529

492530
func newDeployCmd(e *env) *cobra.Command {
493-
d := deployCmd{Verbose: true, Retries: 5}
531+
d := deployCmd{
532+
Verbose: true,
533+
Retries: 3,
534+
wait: func(n int) time.Duration { return time.Duration(n) * time.Second },
535+
}
536+
494537
cmd := &cobra.Command{
495538
Use: "deploy [app]",
496539
Short: "Deploys a Parse App",

deploy_cmd_test.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -648,12 +648,18 @@ func TestDeployRetries(t *testing.T) {
648648
h.Err.Reset()
649649
d.Retries = 2
650650
ensure.Err(t, d.run(h.env, &client), regexp.MustCompile("no such file or directory"))
651-
ensure.DeepEqual(t, h.Err.String(), "Deploy failed. Retrying deploy...\n\n")
651+
ensure.DeepEqual(
652+
t,
653+
h.Err.String(),
654+
"Deploy failed with error:\nlstat cloud: no such file or directory\nWill retry in 0 seconds.\n\n",
655+
)
652656

653657
h.Err.Reset()
654658
d.Retries = 5
655659
ensure.Err(t, d.run(h.env, &client), regexp.MustCompile("no such file or directory"))
656-
ensure.DeepEqual(t, h.Err.String(), strings.Repeat("Deploy failed. Retrying deploy...\n\n", 4))
660+
errStr := "Deploy failed with error:\nlstat cloud: no such file or directory\nWill retry in 0 seconds.\n\n"
661+
errStr += strings.Repeat("Sorry, deploy failed again with same error.\nWill retry in 0 seconds.\n\n", 3)
662+
ensure.DeepEqual(t, h.Err.String(), errStr)
657663
}
658664

659665
func TestIgnoredFiles(t *testing.T) {

0 commit comments

Comments
 (0)