Merge pull request #1532 from chris-crone/fix-scan-msg

Fix scan message with quiet flag
This commit is contained in:
Nicolas De loof 2021-04-13 15:30:23 +02:00 committed by GitHub
commit 5841e75cb2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 77 additions and 10 deletions

View File

@ -86,6 +86,8 @@ type BuildOptions struct {
Args types.Mapping Args types.Mapping
// NoCache disables cache use // NoCache disables cache use
NoCache bool NoCache bool
// Quiet make the build process not output to the console
Quiet bool
} }
// CreateOptions group options of the Create API // CreateOptions group options of the Create API

View File

@ -97,6 +97,7 @@ func runBuild(ctx context.Context, opts buildOptions, services []string) error {
Progress: opts.progress, Progress: opts.progress,
Args: types.NewMapping(opts.args), Args: types.NewMapping(opts.args),
NoCache: opts.noCache, NoCache: opts.noCache,
Quiet: opts.quiet,
}) })
}) })
return err return err

View File

@ -57,6 +57,17 @@ func isCommandFlag(word string) bool {
return utils.StringContains(commandFlags, word) return utils.StringContains(commandFlags, word)
} }
// HasQuietFlag returns true if one of the arguments is `--quiet` or `-q`
func HasQuietFlag(args []string) bool {
for _, a := range args {
switch a {
case "--quiet", "-q":
return true
}
}
return false
}
// GetCommand get the invoked command // GetCommand get the invoked command
func GetCommand(args []string) string { func GetCommand(args []string) string {
result := "" result := ""

View File

@ -22,6 +22,36 @@ import (
"gotest.tools/v3/assert" "gotest.tools/v3/assert"
) )
func TestHasQuietFlag(t *testing.T) {
cases := []struct {
name string
args []string
expected bool
}{
{
name: "long flag",
args: []string{"build", "-t", "tag", "--quiet", "."},
expected: true,
},
{
name: "short flag",
args: []string{"build", "-t", "tag", "-q", "."},
expected: true,
},
{
name: "no flag",
args: []string{"build", "-t", "tag", "."},
expected: false,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
result := HasQuietFlag(c.args)
assert.Equal(t, c.expected, result)
})
}
}
func TestGetCommand(t *testing.T) { func TestGetCommand(t *testing.T) {
testCases := []struct { testCases := []struct {
name string name string

View File

@ -80,7 +80,7 @@ func Exec(root *cobra.Command) {
os.Exit(1) os.Exit(1)
} }
command := metrics.GetCommand(os.Args[1:]) command := metrics.GetCommand(os.Args[1:])
if command == "build" { if command == "build" && !metrics.HasQuietFlag(os.Args[1:]) {
utils.DisplayScanSuggestMsg() utils.DisplayScanSuggestMsg()
} }
metrics.Track(store.DefaultContextType, os.Args[1:], metrics.SuccessStatus) metrics.Track(store.DefaultContextType, os.Args[1:], metrics.SuccessStatus)

View File

@ -75,7 +75,7 @@ func (s *composeService) Build(ctx context.Context, project *types.Project, opti
err := s.build(ctx, project, opts, Containers{}, options.Progress) err := s.build(ctx, project, opts, Containers{}, options.Progress)
if err == nil { if err == nil {
if len(imagesToBuild) > 0 { if len(imagesToBuild) > 0 && !options.Quiet {
utils.DisplayScanSuggestMsg() utils.DisplayScanSuggestMsg()
} }
} }

View File

@ -42,19 +42,43 @@ func TestDisplayScanMessageAfterBuild(t *testing.T) {
t.Run("display when docker build", func(t *testing.T) { t.Run("display when docker build", func(t *testing.T) {
res := c.RunDockerCmd("build", "-t", "test-image-scan-msg", "./fixtures/simple-build-test/nginx-build") res := c.RunDockerCmd("build", "-t", "test-image-scan-msg", "./fixtures/simple-build-test/nginx-build")
res.Assert(t, icmd.Expected{Out: "Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them"}) defer c.RunDockerCmd("rmi", "-f", "test-image-scan-msg")
res.Assert(t, icmd.Expected{Err: "Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them"})
}) })
t.Run("do not display if envvar DOCKER_SCAN_SUGGEST=false", func(t *testing.T) { t.Run("do not display with docker build and quiet flag", func(t *testing.T) {
res := c.RunDockerCmd("build", "-t", "test-image-scan-msg-quiet", "--quiet", "./fixtures/simple-build-test/nginx-build")
defer c.RunDockerCmd("rmi", "-f", "test-image-scan-msg-quiet")
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"))
res = c.RunDockerCmd("build", "-t", "test-image-scan-msg-q", "-q", "./fixtures/simple-build-test/nginx-build")
defer c.RunDockerCmd("rmi", "-f", "test-image-scan-msg-q")
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"))
})
t.Run("do not display if envvar DOCKER_SCAN_SUGGEST=false", func(t *testing.T) {
cmd := c.NewDockerCmd("build", "-t", "test-image-scan-msg", "./fixtures/build-test/nginx-build") cmd := c.NewDockerCmd("build", "-t", "test-image-scan-msg", "./fixtures/build-test/nginx-build")
defer c.RunDockerCmd("rmi", "-f", "test-image-scan-msg")
cmd.Env = append(cmd.Env, "DOCKER_SCAN_SUGGEST=false") cmd.Env = append(cmd.Env, "DOCKER_SCAN_SUGGEST=false")
res := icmd.StartCmd(cmd) res := icmd.StartCmd(cmd)
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined()) assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined())
}) })
t.Run("display on compose build", func(t *testing.T) { t.Run("display on compose build", func(t *testing.T) {
res := c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "build") res := c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test-compose-build", "build")
res.Assert(t, icmd.Expected{Out: "Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them"}) defer c.RunDockerCmd("rmi", "-f", "scan-msg-test-compose-build_nginx")
res.Assert(t, icmd.Expected{Err: "Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them"})
})
t.Run("do not display on compose build with quiet flag", func(t *testing.T) {
res := c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test-quiet", "build", "--quiet")
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined())
res = c.RunDockerCmd("rmi", "-f", "scan-msg-test-quiet_nginx")
assert.Assert(t, !strings.Contains(res.Combined(), "No such image"))
res = c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test-q", "build", "-q")
defer c.RunDockerCmd("rmi", "-f", "scan-msg-test-q_nginx")
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined())
}) })
_ = c.RunDockerOrExitError("rmi", "scan-msg-test_nginx") _ = c.RunDockerOrExitError("rmi", "scan-msg-test_nginx")
@ -62,12 +86,12 @@ func TestDisplayScanMessageAfterBuild(t *testing.T) {
t.Run("display on compose up if image is built", func(t *testing.T) { t.Run("display on compose up if image is built", func(t *testing.T) {
res := c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "up", "-d") res := c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "up", "-d")
defer c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "down") defer c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "down")
res.Assert(t, icmd.Expected{Out: "Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them"}) res.Assert(t, icmd.Expected{Err: "Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them"})
}) })
t.Run("do not display on compose up if no image built", func(t *testing.T) { // re-run the same Compose aproject t.Run("do not display on compose up if no image built", func(t *testing.T) { // re-run the same Compose aproject
res := c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "up", "-d") res := c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "up", "-d")
defer c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "down") defer c.RunDockerCmd("compose", "-f", "./fixtures/simple-build-test/compose.yml", "-p", "scan-msg-test", "down", "--rmi", "all")
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined()) assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined())
}) })

View File

@ -39,8 +39,7 @@ func DisplayScanSuggestMsg() {
if scanAlreadyInvoked() { if scanAlreadyInvoked() {
return return
} }
fmt.Println() fmt.Fprintf(os.Stderr, "\nUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them\n")
fmt.Println("Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them")
} }
func scanAlreadyInvoked() bool { func scanAlreadyInvoked() bool {