1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00
sap-jenkins-library/pkg/log/fatalHook.go
Oliver Nocon 43947e6ef5
Pass golang error details to Jenkins pipeline (#1443)
Do not exit with os.Exit(1) but using log.Entry().Fatal() instead
* Golang: forward error details
* extend groovy wrapper to provide proper error message
* create closure for error handling
2020-04-28 07:42:02 +02:00

52 lines
1.3 KiB
Go

package log
import (
"encoding/json"
"fmt"
"io/ioutil"
"path/filepath"
"github.com/sirupsen/logrus"
)
// FatalHook provides a logrus hook which persists details about a fatal error into the file system.
// This is helpful in order to transfer the error details to an orchestrating CI/CD system
// and by that make it possible to provide better error messages to the user.
type FatalHook struct {
Path string
CorrelationID string
}
// Levels returns the supported log level of the hook.
func (f *FatalHook) Levels() []logrus.Level {
return []logrus.Level{logrus.FatalLevel}
}
// Fire persists the error message of the fatal error as json file into the file system.
func (f *FatalHook) Fire(entry *logrus.Entry) error {
details := entry.Data
if details == nil {
details = logrus.Fields{}
}
details["message"] = entry.Message
details["result"] = "failure"
details["correlationId"] = f.CorrelationID
fileName := "errorDetails.json"
if details["stepName"] != nil {
fileName = fmt.Sprintf("%v_%v", fmt.Sprint(details["stepName"]), fileName)
}
filePath := filepath.Join(f.Path, fileName)
_, err := ioutil.ReadFile(filePath)
if err != nil {
// ignore errors, since we don't want to break the logging flow
errDetails, _ := json.Marshal(&details)
ioutil.WriteFile(filePath, errDetails, 0655)
}
return nil
}