You've already forked sap-jenkins-library
							
							
				mirror of
				https://github.com/SAP/jenkins-library.git
				synced 2025-10-30 23:57:50 +02:00 
			
		
		
		
	feat: url log parsing / reporting when executing a command (#3461)
* Initial PR for url reporting * Rename URLReport var to URLReportFileName * Remove URLReportFileName from piper flags * Update pkg/command/command.go * Update pkg/command/command.go * Update pkg/command/command.go Co-authored-by: Oliver Nocon <33484802+OliverNocon@users.noreply.github.com>
This commit is contained in:
		| @@ -7,6 +7,7 @@ import ( | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
|  | ||||
| @@ -15,9 +16,14 @@ import ( | ||||
| 	"github.com/pkg/errors" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	RelaxedURLRegEx = `(?:\b)((http(s?):\/\/)?(((www\.)?[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(\/[a-zA-Z0-9\_\-\.\/\?\%\#\&\=]*)?)(?:\s|\b)` | ||||
| ) | ||||
|  | ||||
| // Command defines the information required for executing a call to any executable | ||||
| type Command struct { | ||||
| 	ErrorCategoryMapping map[string][]string | ||||
| 	URLReportFileName    string | ||||
| 	dir                  string | ||||
| 	stdin                io.Reader | ||||
| 	stdout               io.Writer | ||||
| @@ -255,18 +261,50 @@ func (c *Command) startCmd(cmd *exec.Cmd) (*execution, error) { | ||||
| 	} | ||||
|  | ||||
| 	go func() { | ||||
| 		_, execution.errCopyStdout = piperutils.CopyData(c.stdout, srcOut) | ||||
| 		if c.URLReportFileName != "" { | ||||
| 			var buf bytes.Buffer | ||||
| 			br := bufio.NewWriter(&buf) | ||||
| 			_, execution.errCopyStdout = piperutils.CopyData(io.MultiWriter(c.stdout, br), srcOut) | ||||
| 			br.Flush() | ||||
| 			handleURLs(buf.String(), c.URLReportFileName) | ||||
| 		} else { | ||||
| 			_, execution.errCopyStdout = piperutils.CopyData(c.stdout, srcOut) | ||||
| 		} | ||||
| 		execution.wg.Done() | ||||
| 	}() | ||||
|  | ||||
| 	go func() { | ||||
| 		_, execution.errCopyStderr = piperutils.CopyData(c.stderr, srcErr) | ||||
| 		if c.URLReportFileName != "" { | ||||
| 			var buf bytes.Buffer | ||||
| 			bw := bufio.NewWriter(&buf) | ||||
| 			_, execution.errCopyStderr = piperutils.CopyData(io.MultiWriter(c.stderr, bw), srcErr) | ||||
| 			bw.Flush() | ||||
| 			handleURLs(buf.String(), c.URLReportFileName) | ||||
| 		} else { | ||||
| 			_, execution.errCopyStderr = piperutils.CopyData(c.stderr, srcErr) | ||||
| 		} | ||||
| 		execution.wg.Done() | ||||
| 	}() | ||||
|  | ||||
| 	return &execution, nil | ||||
| } | ||||
|  | ||||
| func handleURLs(s, file string) { | ||||
| 	reg := regexp.MustCompile(RelaxedURLRegEx) | ||||
| 	matches := reg.FindAllStringSubmatch(s, -1) | ||||
| 	f, err := os.Create(file) | ||||
| 	if err != nil { | ||||
| 		log.Entry().WithError(err).Info("failed to create url report file") | ||||
| 	} | ||||
| 	defer f.Close() | ||||
| 	for _, match := range matches { | ||||
| 		_, err = f.WriteString(match[1] + "\n") | ||||
| 		if err != nil { | ||||
| 			log.Entry().WithError(err).Info("failed to write record to url report") | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Command) scanLog(in io.Reader) { | ||||
| 	scanner := bufio.NewScanner(in) | ||||
| 	scanner.Split(scanShortLines) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user