mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
eafe383d54
* Add error category parsing to cmd execution It is now possible to define `ErrorCategoryMapping` as a `map[string][]string` on a `Command`. The format contains the category as key which has a list of error patterns assigned. Example: ``` cmd := Command{ ErrorCategoryMapping: map[string][]string "build": {"build failed"}, "compliance": {"vulnerabilities found", "outdated components found"}, "test": {"some tests failed"}, }, } ``` Setting this map triggers console log parsing when executing a command. If a match is found the error category is stored and it will automatically be added to the `errorDetails.json`. * clean up go.mod * fix test * fix test * Update DEVELOPMENT.md * fix tests * address long console content without line breaks * scan condition update * fix test * add missing comment for exported function * Update pkg/command/command.go Co-authored-by: Stephan Aßmus <stephan.assmus@sap.com> Co-authored-by: Stephan Aßmus <stephan.assmus@sap.com> Co-authored-by: Christopher Fenner <26137398+CCFenner@users.noreply.github.com>
54 lines
1.4 KiB
Go
54 lines
1.4 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["error"] = fmt.Sprint(details["error"])
|
|
details["category"] = fmt.Sprint(GetErrorCategory())
|
|
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
|
|
}
|