mirror of
https://github.com/containers/podman.git
synced 2025-06-19 08:09:12 +08:00
Fix flake on failed podman-remote build : try 2
This time we are checking if the function actually succeeded, otherwise we will report an error. Also if we did not get the id, report unexpected failure. [NO TESTS NEEDED] Still no good way to test this, but manually. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
@ -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"))
|
||||
}
|
||||
}()
|
||||
@ -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 {
|
||||
|
@ -340,6 +340,7 @@ 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"`
|
||||
@ -347,11 +348,21 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
|
||||
}
|
||||
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))
|
||||
@ -359,11 +370,12 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
|
||||
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) {
|
||||
|
Reference in New Issue
Block a user