зеркало из https://github.com/docker/compose.git
Merge pull request #10047 from thaJeztah/cleanup_output
Cleanup tips from output
This commit is contained in:
Коммит
6b4ad0d1db
|
@ -48,8 +48,6 @@ func (s *composeService) Build(ctx context.Context, project *types.Project, opti
|
|||
|
||||
func (s *composeService) build(ctx context.Context, project *types.Project, options api.BuildOptions) error {
|
||||
opts := map[string]build.Options{}
|
||||
var imagesToBuild []string
|
||||
|
||||
args := flatten(options.Args.Resolve(envResolver(project.Environment)))
|
||||
|
||||
services, err := project.GetServices(options.Services...)
|
||||
|
@ -62,7 +60,6 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
|
|||
continue
|
||||
}
|
||||
imageName := api.GetImageNameOrDefault(service, project.Name)
|
||||
imagesToBuild = append(imagesToBuild, imageName)
|
||||
buildOptions, err := s.toBuildOptions(project, service, imageName, options.SSHs)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -97,12 +94,6 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
|
|||
}
|
||||
|
||||
_, err = s.doBuild(ctx, project, opts, options.Progress)
|
||||
if err == nil {
|
||||
if len(imagesToBuild) > 0 && !options.Quiet {
|
||||
utils.DisplayScanSuggestMsg()
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -136,9 +127,6 @@ func (s *composeService) ensureImagesExists(ctx context.Context, project *types.
|
|||
return err
|
||||
}
|
||||
|
||||
if len(builtImages) > 0 {
|
||||
utils.DisplayScanSuggestMsg()
|
||||
}
|
||||
for name, digest := range builtImages {
|
||||
images[name] = digest
|
||||
}
|
||||
|
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
Copyright 2020 Docker Compose CLI authors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package e2e
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/compose/v2/pkg/utils"
|
||||
|
||||
"gotest.tools/v3/assert"
|
||||
"gotest.tools/v3/icmd"
|
||||
)
|
||||
|
||||
func TestDisplayScanMessageAfterBuild(t *testing.T) {
|
||||
c := NewParallelCLI(t)
|
||||
|
||||
// assert docker scan plugin is available
|
||||
c.RunDockerOrExitError(t, "scan", "--help")
|
||||
|
||||
t.Run("display on compose build", func(t *testing.T) {
|
||||
res := c.RunDockerComposeCmd(t, "-f", "fixtures/simple-build-test/compose.yaml", "-p",
|
||||
"scan-msg-test-compose-build", "build")
|
||||
defer c.RunDockerOrExitError(t, "rmi", "-f", "scan-msg-test-compose-build-nginx")
|
||||
res.Assert(t, icmd.Expected{Err: utils.ScanSuggestMsg})
|
||||
})
|
||||
|
||||
t.Run("do not display on compose build with quiet flag", func(t *testing.T) {
|
||||
res := c.RunDockerComposeCmd(t, "-f", "fixtures/simple-build-test/compose.yaml", "-p", "scan-msg-test-quiet",
|
||||
"build", "--quiet")
|
||||
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined())
|
||||
res = c.RunDockerCmd(t, "rmi", "-f", "scan-msg-test-quiet-nginx")
|
||||
assert.Assert(t, !strings.Contains(res.Combined(), "No such image"))
|
||||
|
||||
res = c.RunDockerComposeCmd(t, "-f", "fixtures/simple-build-test/compose.yaml", "-p", "scan-msg-test-q",
|
||||
"build", "-q")
|
||||
defer c.RunDockerOrExitError(t, "rmi", "-f", "scan-msg-test-q-nginx")
|
||||
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined())
|
||||
})
|
||||
|
||||
_ = c.RunDockerOrExitError(t, "rmi", "scan-msg-test-nginx")
|
||||
|
||||
t.Run("display on compose up if image is built", func(t *testing.T) {
|
||||
res := c.RunDockerComposeCmd(t, "-f", "fixtures/simple-build-test/compose.yaml", "-p", "scan-msg-test", "up",
|
||||
"-d")
|
||||
defer c.RunDockerComposeCmd(t, "-f", "fixtures/simple-build-test/compose.yaml", "-p", "scan-msg-test", "down")
|
||||
res.Assert(t, icmd.Expected{Err: utils.ScanSuggestMsg})
|
||||
})
|
||||
|
||||
t.Run("do not display on compose up if no image built", func(t *testing.T) { // re-run the same Compose aproject
|
||||
res := c.RunDockerComposeCmd(t, "-f", "fixtures/simple-build-test/compose.yaml", "-p", "scan-msg-test", "up",
|
||||
"-d")
|
||||
defer c.RunDockerComposeCmd(t, "-f", "fixtures/simple-build-test/compose.yaml", "-p", "scan-msg-test", "down", "--rmi", "all")
|
||||
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined())
|
||||
})
|
||||
|
||||
t.Run("do not display if scan already invoked", func(t *testing.T) {
|
||||
_ = os.MkdirAll(filepath.Join(c.ConfigDir, "scan"), 0o755)
|
||||
scanConfigFile := filepath.Join(c.ConfigDir, "scan", "config.json")
|
||||
err := os.WriteFile(scanConfigFile, []byte(`{"optin":true}`), 0o644)
|
||||
assert.NilError(t, err)
|
||||
|
||||
res := c.RunDockerCmd(t, "build", "-t", "test-image-scan-msg", "fixtures/simple-build-test/nginx-build")
|
||||
assert.Assert(t, !strings.Contains(res.Combined(), "docker scan"), res.Combined())
|
||||
})
|
||||
}
|
|
@ -1,86 +0,0 @@
|
|||
/*
|
||||
Copyright 2020 Docker Compose CLI authors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package utils
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
pluginmanager "github.com/docker/cli/cli-plugins/manager"
|
||||
"github.com/docker/cli/cli/command"
|
||||
cliConfig "github.com/docker/cli/cli/config"
|
||||
)
|
||||
|
||||
// ScanSuggestMsg display a message after a successful build to suggest use of `docker scan` command
|
||||
const ScanSuggestMsg = "Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them"
|
||||
|
||||
// DisplayScanSuggestMsg displlay a message suggesting users can scan new image
|
||||
func DisplayScanSuggestMsg() {
|
||||
if os.Getenv("DOCKER_SCAN_SUGGEST") == "false" {
|
||||
return
|
||||
}
|
||||
if !scanAvailable() {
|
||||
return
|
||||
}
|
||||
if scanAlreadyInvoked() {
|
||||
return
|
||||
}
|
||||
fmt.Fprintf(os.Stderr, "\n"+ScanSuggestMsg+"\n")
|
||||
}
|
||||
|
||||
func scanAlreadyInvoked() bool {
|
||||
filename := filepath.Join(cliConfig.Dir(), "scan", "config.json")
|
||||
f, err := os.Stat(filename)
|
||||
if os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
if f.IsDir() { // should never happen, do not bother user with suggestion if something goes wrong
|
||||
return true
|
||||
}
|
||||
type scanOptin struct {
|
||||
Optin bool `json:"optin"`
|
||||
}
|
||||
data, err := os.ReadFile(filename)
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
scanConfig := scanOptin{}
|
||||
err = json.Unmarshal(data, &scanConfig)
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
return scanConfig.Optin
|
||||
}
|
||||
|
||||
func scanAvailable() bool {
|
||||
cli, err := command.NewDockerCli()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
plugins, err := pluginmanager.ListPlugins(cli, nil)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
for _, plugin := range plugins {
|
||||
if plugin.Name == "scan" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
Загрузка…
Ссылка в новой задаче