github.com/nektos/act@v0.2.63/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  }