diff --git a/cmd/trivy/main.go b/cmd/trivy/main.go index 862a547edb4c..da420e03be7d 100644 --- a/cmd/trivy/main.go +++ b/cmd/trivy/main.go @@ -1,6 +1,7 @@ package main import ( + l "log" "os" "strings" @@ -59,6 +60,11 @@ OPTIONS: Name: "output, o", Usage: "output file name", }, + cli.IntFlag{ + Name: "exit-code", + Usage: "Exit code when vulnerabilities were found", + Value: 0, + }, cli.BoolFlag{ Name: "skip-update", Usage: "skip db update", @@ -79,6 +85,9 @@ OPTIONS: err := app.Run(os.Args) if err != nil { - log.Logger.Fatal(err) + if log.Logger != nil { + log.Logger.Fatal(err) + } + l.Fatal(err) } } diff --git a/pkg/git/git.go b/pkg/git/git.go index 983fbb87abc8..b696e3e068f8 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -33,6 +33,9 @@ func CloneOrPull(url, repoPath string) (map[string]struct{}, error) { updatedFiles[strings.TrimSpace(filename)] = struct{}{} } } else { + if !utils.IsCommandAvailable("git") { + log.Logger.Warn("Recommend installing git (if not, DB update is very slow)") + } log.Logger.Debug("remove an existed directory") s := spinner.New(spinner.CharSets[36], 100*time.Millisecond) @@ -74,7 +77,6 @@ func clone(url, repoPath string) error { if utils.IsCommandAvailable("git") { return cloneByOSCommand(url, repoPath) } - log.Logger.Warn("Recommend installing git (if not, DB update is very slow)") _, err := git.PlainClone(repoPath, false, &git.CloneOptions{ URL: url, diff --git a/pkg/run.go b/pkg/run.go index 3e413cfc9205..30086132a8a6 100644 --- a/pkg/run.go +++ b/pkg/run.go @@ -58,7 +58,8 @@ func Run(c *cli.Context) (err error) { for _, s := range strings.Split(c.String("severity"), ",") { severity, err := vulnerability.NewSeverity(s) if err != nil { - return xerrors.Errorf("error in severity option: %w", err) + log.Logger.Infof("error in severity option: %s", err) + cli.ShowAppHelpAndExit(c, 1) } severities = append(severities, severity) } @@ -93,7 +94,13 @@ func Run(c *cli.Context) (err error) { } if err = writer.Write(results); err != nil { - return err + return xerrors.Errorf("failed to write results: %w", err) + } + + for _, result := range results { + if len(result.Vulnerabilities) > 0 { + os.Exit(c.Int("exit-code")) + } } return nil