Skip to content

Commit 257ea7b

Browse files
nscottndeloof
authored andcommitted
Swap to Reader in bake to avoid hangs on output
Signed-off-by: Nathan Scott <[email protected]>
1 parent d219aa6 commit 257ea7b

File tree

4 files changed

+81
-4
lines changed

4 files changed

+81
-4
lines changed

pkg/compose/build_bake.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"encoding/json"
2424
"errors"
2525
"fmt"
26+
"io"
2627
"math/rand"
2728
"os"
2829
"os/exec"
@@ -321,16 +322,22 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
321322
}
322323

323324
var errMessage []string
324-
scanner := bufio.NewScanner(pipe)
325-
scanner.Split(bufio.ScanLines)
325+
reader := bufio.NewReader(pipe)
326326

327327
err = cmd.Start()
328328
if err != nil {
329329
return nil, err
330330
}
331331
eg.Go(cmd.Wait)
332-
for scanner.Scan() {
333-
line := scanner.Text()
332+
for {
333+
line, readErr := reader.ReadString('\n')
334+
if readErr != nil {
335+
if readErr == io.EOF {
336+
break
337+
} else {
338+
return nil, fmt.Errorf("failed to execute bake: %w", readErr)
339+
}
340+
}
334341
decoder := json.NewDecoder(strings.NewReader(line))
335342
var status client.SolveStatus
336343
err := decoder.Decode(&status)

pkg/e2e/build_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,3 +580,19 @@ func TestBuildSubDependencies(t *testing.T) {
580580
out = res.Combined()
581581
assert.Check(t, strings.Contains(out, "main Built"))
582582
}
583+
584+
func TestBuildLongOutputLine(t *testing.T) {
585+
c := NewParallelCLI(t)
586+
587+
t.Cleanup(func() {
588+
c.RunDockerComposeCmd(t, "-f", "fixtures/build-test/long-output-line/compose.yaml", "down", "--rmi=local")
589+
})
590+
591+
res := c.RunDockerComposeCmd(t, "-f", "fixtures/build-test/long-output-line/compose.yaml", "build", "long-line")
592+
out := res.Combined()
593+
assert.Check(t, strings.Contains(out, "long-line Built"))
594+
595+
res = c.RunDockerComposeCmd(t, "-f", "fixtures/build-test/long-output-line/compose.yaml", "up", "--build", "long-line")
596+
out = res.Combined()
597+
assert.Check(t, strings.Contains(out, "long-line Built"))
598+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Copyright 2020 Docker Compose CLI authors
2+
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
FROM alpine
15+
# We generate warnings *on purpose* to bloat the JSON output of bake
16+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
17+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
18+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
19+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
20+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
21+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
22+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
23+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
24+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
25+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
26+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
27+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
28+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
29+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
30+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
31+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
32+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
33+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
34+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
35+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
36+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
37+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
38+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
39+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
40+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
41+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
42+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
43+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
44+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
45+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
46+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
47+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
48+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
49+
ARG AWS_SECRET_ACCESS_KEY=FAKE_TO_GENERATE_WARNING_OUTPUT
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
services:
2+
long-line:
3+
build:
4+
context: .
5+
dockerfile: Dockerfile

0 commit comments

Comments
 (0)