github.com/nektos/act@v0.2.63-0.20240520024548-8acde99bfa9c/pkg/container/docker_logger.go (about) 1 //go:build !(WITHOUT_DOCKER || !(linux || darwin || windows || netbsd)) 2 3 package container 4 5 import ( 6 "bufio" 7 "encoding/json" 8 "errors" 9 "io" 10 11 "github.com/sirupsen/logrus" 12 ) 13 14 type dockerMessage struct { 15 ID string `json:"id"` 16 Stream string `json:"stream"` 17 Error string `json:"error"` 18 ErrorDetail struct { 19 Message string 20 } 21 Status string `json:"status"` 22 Progress string `json:"progress"` 23 } 24 25 const logPrefix = " \U0001F433 " 26 27 func logDockerResponse(logger logrus.FieldLogger, dockerResponse io.ReadCloser, isError bool) error { 28 if dockerResponse == nil { 29 return nil 30 } 31 defer dockerResponse.Close() 32 33 scanner := bufio.NewScanner(dockerResponse) 34 msg := dockerMessage{} 35 36 for scanner.Scan() { 37 line := scanner.Bytes() 38 39 msg.ID = "" 40 msg.Stream = "" 41 msg.Error = "" 42 msg.ErrorDetail.Message = "" 43 msg.Status = "" 44 msg.Progress = "" 45 46 if err := json.Unmarshal(line, &msg); err != nil { 47 writeLog(logger, false, "Unable to unmarshal line [%s] ==> %v", string(line), err) 48 continue 49 } 50 51 if msg.Error != "" { 52 writeLog(logger, isError, "%s", msg.Error) 53 return errors.New(msg.Error) 54 } 55 56 if msg.ErrorDetail.Message != "" { 57 writeLog(logger, isError, "%s", msg.ErrorDetail.Message) 58 return errors.New(msg.Error) 59 } 60 61 if msg.Status != "" { 62 if msg.Progress != "" { 63 writeLog(logger, isError, "%s :: %s :: %s\n", msg.Status, msg.ID, msg.Progress) 64 } else { 65 writeLog(logger, isError, "%s :: %s\n", msg.Status, msg.ID) 66 } 67 } else if msg.Stream != "" { 68 writeLog(logger, isError, "%s", msg.Stream) 69 } else { 70 writeLog(logger, false, "Unable to handle line: %s", string(line)) 71 } 72 } 73 74 return nil 75 } 76 77 func writeLog(logger logrus.FieldLogger, isError bool, format string, args ...interface{}) { 78 if isError { 79 logger.Errorf(format, args...) 80 } else { 81 logger.Debugf(format, args...) 82 } 83 }