Skip to content

Commit

Permalink
Merge pull request #10034 from rhatdan/build
Browse files Browse the repository at this point in the history
Fix flake on failed podman-remote build : try 2
  • Loading branch information
openshift-merge-robot authored Apr 15, 2021
2 parents df6c7c2 + 855a5a8 commit b2a3bb4
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
10 changes: 6 additions & 4 deletions pkg/api/handlers/compat/images_build.go
Original file line number Diff line number Diff line change
Expand Up @@ -464,15 +464,16 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {

var (
imageID string
failed bool
success bool
)

runCtx, cancel := context.WithCancel(context.Background())
go func() {
defer cancel()
imageID, _, err = runtime.Build(r.Context(), buildOptions, query.Dockerfile)
if err != nil {
failed = true
if err == nil {
success = true
} else {
stderr.Write([]byte(err.Error() + "\n"))
}
}()
Expand Down Expand Up @@ -534,7 +535,8 @@ loop:
}
flush()
case <-runCtx.Done():
if !failed {
flush()
if success {
if !utils.IsLibpodRequest(r) {
m.Stream = fmt.Sprintf("Successfully built %12.12s\n", imageID)
if err := enc.Encode(m); err != nil {
Expand Down
16 changes: 14 additions & 2 deletions pkg/bindings/images/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -340,30 +340,42 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
re := regexp.MustCompile(`[0-9a-f]{12}`)

var id string
var mErr error
for {
var s struct {
Stream string `json:"stream,omitempty"`
Error string `json:"error,omitempty"`
}
if err := dec.Decode(&s); err != nil {
if errors.Is(err, io.EOF) {
return &entities.BuildReport{ID: id}, nil
if mErr == nil && id == "" {
mErr = errors.New("stream dropped, unexpected failure")
}
break
}
s.Error = err.Error() + "\n"
}

select {
case <-response.Request.Context().Done():
return &entities.BuildReport{ID: id}, mErr
default:
// non-blocking select
}

switch {
case s.Stream != "":
stdout.Write([]byte(s.Stream))
if re.Match([]byte(s.Stream)) {
id = strings.TrimSuffix(s.Stream, "\n")
}
case s.Error != "":
return nil, errors.New(s.Error)
mErr = errors.New(s.Error)
default:
return &entities.BuildReport{ID: id}, errors.New("failed to parse build results stream, unexpected input")
}
}
return &entities.BuildReport{ID: id}, mErr
}

func nTar(excludes []string, sources ...string) (io.ReadCloser, error) {
Expand Down

0 comments on commit b2a3bb4

Please sign in to comment.