diff --git a/pkg/compose/build_bake.go b/pkg/compose/build_bake.go index 801162605..0fa99f3a4 100644 --- a/pkg/compose/build_bake.go +++ b/pkg/compose/build_bake.go @@ -23,6 +23,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "math/rand" "os" "os/exec" @@ -321,16 +322,22 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project } var errMessage []string - scanner := bufio.NewScanner(pipe) - scanner.Split(bufio.ScanLines) + reader := bufio.NewReader(pipe) err = cmd.Start() if err != nil { return nil, err } eg.Go(cmd.Wait) - for scanner.Scan() { - line := scanner.Text() + for { + line, readErr := reader.ReadString('\n') + if readErr != nil { + if readErr == io.EOF { + break + } else { + return nil, fmt.Errorf("failed to execute bake: %w", readErr) + } + } decoder := json.NewDecoder(strings.NewReader(line)) var status client.SolveStatus err := decoder.Decode(&status) diff --git a/pkg/e2e/build_test.go b/pkg/e2e/build_test.go index 5a7e06d01..0449a46e7 100644 --- a/pkg/e2e/build_test.go +++ b/pkg/e2e/build_test.go @@ -580,3 +580,19 @@ func TestBuildSubDependencies(t *testing.T) { out = res.Combined() assert.Check(t, strings.Contains(out, "main Built")) } + +func TestBuildLongOutputLine(t *testing.T) { + c := NewParallelCLI(t) + + t.Cleanup(func() { + c.RunDockerComposeCmd(t, "-f", "fixtures/build-test/long-output-line/compose.yaml", "down", "--rmi=local") + }) + + res := c.RunDockerComposeCmd(t, "-f", "fixtures/build-test/long-output-line/compose.yaml", "build", "long-line") + out := res.Combined() + assert.Check(t, strings.Contains(out, "long-line Built")) + + res = c.RunDockerComposeCmd(t, "-f", "fixtures/build-test/long-output-line/compose.yaml", "up", "--build", "long-line") + out = res.Combined() + assert.Check(t, strings.Contains(out, "long-line Built")) +} diff --git a/pkg/e2e/fixtures/build-test/long-output-line/Dockerfile b/pkg/e2e/fixtures/build-test/long-output-line/Dockerfile new file mode 100644 index 000000000..5227a4914 --- /dev/null +++ b/pkg/e2e/fixtures/build-test/long-output-line/Dockerfile @@ -0,0 +1,49 @@ +# 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. +FROM alpine +# We generate warnings *on purpose* to bloat the JSON output of bake +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT +ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT \ No newline at end of file diff --git a/pkg/e2e/fixtures/build-test/long-output-line/compose.yaml b/pkg/e2e/fixtures/build-test/long-output-line/compose.yaml new file mode 100644 index 000000000..d0e2a4fff --- /dev/null +++ b/pkg/e2e/fixtures/build-test/long-output-line/compose.yaml @@ -0,0 +1,5 @@ +services: + long-line: + build: + context: . + dockerfile: Dockerfile