Skip to content

Commit 4dba5ab

Browse files
authored
Fix docker scan help command (#3191)
* Fix docker scan help command * update dep * update dependencies * add test * fix test * try fix docker integration tests * try fix docker integration tests
1 parent 4ba9ac3 commit 4dba5ab

File tree

5 files changed

+64
-33
lines changed

5 files changed

+64
-33
lines changed

buildtools/cli.go

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -393,23 +393,15 @@ func GetCommands() []cli.Command {
393393
},
394394
},
395395
{
396-
Name: "docker",
397-
Flags: cliutils.GetCommandFlags(cliutils.Docker),
398-
Usage: docker.GetDescription(),
399-
HelpName: corecommon.CreateUsage("docker", docker.GetDescription(), docker.Usage),
400-
UsageText: docker.GetArguments(),
401-
SkipFlagParsing: func() bool {
402-
for i, arg := range os.Args {
403-
// 'docker scan' isn't a docker client command. We won't skip its flags.
404-
if arg == "docker" && len(os.Args) > i+1 && os.Args[i+1] == "scan" {
405-
return false
406-
}
407-
}
408-
return true
409-
}(),
410-
BashComplete: corecommon.CreateBashCompletionFunc("login", "push", "pull", "scan"),
411-
Category: buildToolsCategory,
412-
Action: dockerCmd,
396+
Name: "docker",
397+
Flags: cliutils.GetCommandFlags(cliutils.Docker),
398+
Usage: docker.GetDescription(),
399+
HelpName: corecommon.CreateUsage("docker", docker.GetDescription(), docker.Usage),
400+
UsageText: docker.GetArguments(),
401+
SkipFlagParsing: skipFlagParsingForDockerCmd(),
402+
BashComplete: corecommon.CreateBashCompletionFunc("login", "push", "pull", "scan"),
403+
Category: buildToolsCategory,
404+
Action: dockerCmd,
413405
},
414406
{
415407
Name: "terraform-config",
@@ -453,6 +445,24 @@ func GetCommands() []cli.Command {
453445
return decorateWithFlagCapture(cmds)
454446
}
455447

448+
func skipFlagParsingForDockerCmd() bool {
449+
isDockerScan := false
450+
hasHelpFlag := false
451+
for i, arg := range os.Args {
452+
if arg == "docker" && len(os.Args) > i+1 && os.Args[i+1] == "scan" {
453+
isDockerScan = true
454+
}
455+
if arg == "--help" || arg == "-h" {
456+
hasHelpFlag = true
457+
}
458+
}
459+
// 'docker scan' isn't a docker client command. We won't skip its flags.
460+
if isDockerScan {
461+
return hasHelpFlag
462+
}
463+
return true
464+
}
465+
456466
// decorateWithFlagCapture injects a Before hook into every command returned from this package,
457467
// so we can capture user-provided flags consistently in one place for all build commands.
458468
func decorateWithFlagCapture(cmds []cli.Command) []cli.Command {
@@ -964,6 +974,9 @@ func loginCmd(c *cli.Context) error {
964974
}
965975

966976
func dockerScanCmd(c *cli.Context, imageTag string) error {
977+
if show, err := cliutils.ShowGenericCmdHelpIfNeeded(c, c.Args(), securityCLI.DockerScanCmdHiddenName); show || err != nil {
978+
return err
979+
}
967980
convertedCtx, err := components.ConvertContext(c, securityDocs.GetCommandFlags(securityDocs.DockerScan)...)
968981
if err != nil {
969982
return err

docker_test.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package main
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
6-
tests2 "github.com/jfrog/jfrog-cli-artifactory/utils/tests"
77
"os"
88
"os/exec"
99
"path"
@@ -12,6 +12,8 @@ import (
1212
"testing"
1313
"time"
1414

15+
tests2 "github.com/jfrog/jfrog-cli-artifactory/utils/tests"
16+
1517
"github.com/docker/docker/api/types/mount"
1618

1719
biutils "github.com/jfrog/build-info-go/utils"
@@ -601,17 +603,23 @@ func TestNativeDockerFlagParsing(t *testing.T) {
601603
defer cleanup()
602604

603605
dockerTestCases := []struct {
604-
name string
605-
args []string
606+
name string
607+
args []string
608+
expectedErr error
606609
}{
607-
{"docker", []string{"docker"}},
608-
{"docker version", []string{"docker", "version"}},
609-
{"docker scan", []string{"docker", "scan"}},
610-
{"cli flags after args", []string{"docker", "version", "--build-name=d", "--build-number=1", "--module=1"}},
611-
{"cli flags before args", []string{"docker", "--build-name=d", "--build-number=1", "--module=1", "version"}},
610+
{"docker", []string{"docker"}, nil},
611+
{"docker version", []string{"docker", "version"}, nil},
612+
{"docker scan", []string{"docker", "scan", "--min-severity=low"}, errors.New("a docker image name must be provided")},
613+
{"cli flags after args", []string{"docker", "version", "--build-name=d", "--build-number=1", "--module=1"}, nil},
614+
{"cli flags before args", []string{"docker", "--build-name=d", "--build-number=1", "--module=1", "version"}, nil},
612615
}
613616
for _, testCase := range dockerTestCases {
614617
t.Run(testCase.name, func(t *testing.T) {
618+
if testCase.expectedErr != nil {
619+
err := runJfrogCliWithoutAssertion(testCase.args...)
620+
assert.EqualError(t, err, testCase.expectedErr.Error())
621+
return
622+
}
615623
runCmdWithRetries(t, jfCliTask(testCase.args...))
616624
})
617625
}

go.mod

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ require (
1919
github.com/jfrog/gofrog v1.7.6
2020
github.com/jfrog/jfrog-cli-application v1.0.2-0.20251120093802-1c39a37efcae
2121
github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251118100843-ac34330a70d3
22-
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251120025936-6dba15f12343
22+
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251125083543-e689762c4ff0
2323
github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251116083852-12dc534b4d13
2424
github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251114155350-7ea4c8e32d5a
25-
github.com/jfrog/jfrog-cli-security v1.22.0
25+
github.com/jfrog/jfrog-cli-security v1.23.0
2626
github.com/jfrog/jfrog-client-go v1.55.1-0.20251119183924-d765eb708cec
2727
github.com/jszwec/csvutil v1.10.0
2828
github.com/manifoldco/promptui v0.9.0
@@ -278,6 +278,8 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl
278278

279279
// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a
280280

281-
// replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250812100044-b52afcc698c1
281+
// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/attiasas/jfrog-cli-core/v2 v2.0.0-20251104113958-abd9de5958c4
282282

283-
//replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020
283+
//replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.54.2-0.20251007084958-5eeaa42c31a6
284+
285+
// replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security dev

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,14 +1161,14 @@ github.com/jfrog/jfrog-cli-application v1.0.2-0.20251120093802-1c39a37efcae h1:L
11611161
github.com/jfrog/jfrog-cli-application v1.0.2-0.20251120093802-1c39a37efcae/go.mod h1:mBvgtVcGVjRAqc0b+TPmpYNz70nlXJqt1aitL0RGapA=
11621162
github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251118100843-ac34330a70d3 h1:sIjwBWBmyb7UEqP0IhQ22CWOedOPlNetyHzECS3sUyA=
11631163
github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251118100843-ac34330a70d3/go.mod h1:3hLZrM2xT+PkIevIGret4x1xDFTaVoNu3h374QnrKyc=
1164-
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251120025936-6dba15f12343 h1:mOEDdk2dMe3zCF83spCGwZbkvUN/LhmoJUS0vea8JxY=
1165-
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251120025936-6dba15f12343/go.mod h1:d9aADumiyjCBvZLffp8wldvP9XFHxcvk2PoOSUYms2g=
1164+
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251125083543-e689762c4ff0 h1:EsasTBE5i2MyCESS/icZxKIlObpGiOyW9K67MAaEWco=
1165+
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251125083543-e689762c4ff0/go.mod h1:d9aADumiyjCBvZLffp8wldvP9XFHxcvk2PoOSUYms2g=
11661166
github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251116083852-12dc534b4d13 h1:V9KRanq6ulMMLLwJcnbN2+UlDa0/+sWrUEC2Dex48+E=
11671167
github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251116083852-12dc534b4d13/go.mod h1:6KohlDOtLswaJ4YYi/FqflJEZTvt7yP7SA1cjGG0If4=
11681168
github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251114155350-7ea4c8e32d5a h1:2EhQHDB15mIRPDJ62MwO5pruugpHRkeZq5P0PR4jWKI=
11691169
github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251114155350-7ea4c8e32d5a/go.mod h1:qbu4iqBST9x8LgD8HhzUm91iOB3vHqtoGmaxOnmw0ok=
1170-
github.com/jfrog/jfrog-cli-security v1.22.0 h1:KNovA+BA1IpE0c0jI6jWF33fOimgylR9a7T84ZmgNJI=
1171-
github.com/jfrog/jfrog-cli-security v1.22.0/go.mod h1:uoACrGyWZViNPU0STC0fF38bVKtNXjm3hzWW/DKI0DY=
1170+
github.com/jfrog/jfrog-cli-security v1.23.0 h1:kV/NQhyID/P9Lf7D+sgscvkIDQ0l1sYMXnjs1EKWXaE=
1171+
github.com/jfrog/jfrog-cli-security v1.23.0/go.mod h1:qBAvU9kN41nReJk/O4V9Q/xwiXfAdyhqRIYaOjVm8nE=
11721172
github.com/jfrog/jfrog-client-go v1.55.1-0.20251119183924-d765eb708cec h1:tNfeGi/2FuxIUSi8urFZuqa33grynAHwLRH6iIK/DB0=
11731173
github.com/jfrog/jfrog-client-go v1.55.1-0.20251119183924-d765eb708cec/go.mod h1:ureS+L3wNs0qYUBSwH8C9PjwnraTX9ibZu7JkaqjO/E=
11741174
github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94=

main_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,14 @@ func TestSurvey_NotDisplayedOnNonHelp(t *testing.T) {
398398
assert.NotContains(t, string(contentErr), "https://")
399399
}
400400

401+
func TestDockerScanHelp(t *testing.T) {
402+
t.Setenv("CI", "false")
403+
jfrogCli := coreTests.NewJfrogCli(execMain, "jfrog", "")
404+
content, _, err := tests.GetCmdOutput(t, jfrogCli, "docker", "scan", "--help")
405+
require.NoError(t, err)
406+
assert.Contains(t, string(content), "jfrog docker scan - Scan local docker image using the docker client and Xray.")
407+
}
408+
401409
func TestSurvey_DisplayedOnHelp(t *testing.T) {
402410
t.Setenv("CI", "false")
403411
jfrogCli := coreTests.NewJfrogCli(execMain, "jfrog", "")

0 commit comments

Comments
 (0)