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 
			
		
		
		
	Add GO logging with logrus (#938)
* add log package * add logrus dependency * add logging to karma step * add log stepName to generator, respect verbose flag
This commit is contained in:
		
				
					committed by
					
						 Oliver Nocon
						Oliver Nocon
					
				
			
			
				
	
			
			
			
						parent
						
							5b2d3a1663
						
					
				
				
					commit
					742a67fc60
				
			| @@ -4,30 +4,39 @@ import ( | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/command" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"github.com/SAP/jenkins-library/pkg/log" | ||||
| ) | ||||
|  | ||||
| func karmaExecuteTests(myKarmaExecuteTestsOptions karmaExecuteTestsOptions) error { | ||||
| 	c := command.Command{} | ||||
| 	return runKarma(myKarmaExecuteTestsOptions, &c) | ||||
| 	// reroute command output to loging framework | ||||
| 	// also log stdout as Karma reports into it | ||||
| 	c.Stdout = log.Entry().Writer() | ||||
| 	c.Stderr = log.Entry().Writer() | ||||
| 	runKarma(myKarmaExecuteTestsOptions, &c) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func runKarma(myKarmaExecuteTestsOptions karmaExecuteTestsOptions, command execRunner) error { | ||||
| func runKarma(myKarmaExecuteTestsOptions karmaExecuteTestsOptions, command execRunner) { | ||||
| 	installCommandTokens := tokenize(myKarmaExecuteTestsOptions.InstallCommand) | ||||
| 	command.Dir(myKarmaExecuteTestsOptions.ModulePath) | ||||
| 	err := command.RunExecutable(installCommandTokens[0], installCommandTokens[1:]...) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrapf(err, "failed to execute install command '%v'", myKarmaExecuteTestsOptions.InstallCommand) | ||||
| 		log.Entry(). | ||||
| 			WithError(err). | ||||
| 			WithField("command", myKarmaExecuteTestsOptions.InstallCommand). | ||||
| 			Fatal("failed to execute install command") | ||||
| 	} | ||||
|  | ||||
| 	runCommandTokens := tokenize(myKarmaExecuteTestsOptions.RunCommand) | ||||
| 	command.Dir(myKarmaExecuteTestsOptions.ModulePath) | ||||
| 	err = command.RunExecutable(runCommandTokens[0], runCommandTokens[1:]...) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrapf(err, "failed to execute run command '%v'", myKarmaExecuteTestsOptions.RunCommand) | ||||
| 		log.Entry(). | ||||
| 			WithError(err). | ||||
| 			WithField("command", myKarmaExecuteTestsOptions.RunCommand). | ||||
| 			Fatal("failed to execute run command") | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func tokenize(command string) []string { | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import ( | ||||
| 	//"os" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/config" | ||||
| 	"github.com/SAP/jenkins-library/pkg/log" | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
|  | ||||
| @@ -34,6 +35,8 @@ In the Docker network, the containers can be referenced by the values provided i | ||||
| !!! note | ||||
|     In a Kubernetes environment, the containers both need to be referenced with ` + "`" + `localhost` + "`" + `.`, | ||||
| 		PreRunE: func(cmd *cobra.Command, args []string) error { | ||||
| 			log.SetStepName("karmaExecuteTests") | ||||
| 			log.SetVerbose(generalConfig.verbose) | ||||
| 			return PrepareConfig(cmd, &metadata, "karmaExecuteTests", &myKarmaExecuteTestsOptions, openPiperFile) | ||||
| 		}, | ||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package cmd | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/log" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| @@ -11,9 +12,7 @@ func TestRunKarma(t *testing.T) { | ||||
| 		opts := karmaExecuteTestsOptions{ModulePath: "./test", InstallCommand: "npm install test", RunCommand: "npm run test"} | ||||
|  | ||||
| 		e := execMockRunner{} | ||||
| 		err := runKarma(opts, &e) | ||||
|  | ||||
| 		assert.NoError(t, err, "error occured but no error expected") | ||||
| 		runKarma(opts, &e) | ||||
|  | ||||
| 		assert.Equal(t, e.dir[0], "./test", "install command dir incorrect") | ||||
| 		assert.Equal(t, e.calls[0], execCall{exec: "npm", params: []string{"install", "test"}}, "install command/params incorrect") | ||||
| @@ -24,18 +23,24 @@ func TestRunKarma(t *testing.T) { | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("error case install command", func(t *testing.T) { | ||||
| 		var hasFailed bool | ||||
| 		log.Entry().Logger.ExitFunc = func(int) { hasFailed = true } | ||||
|  | ||||
| 		opts := karmaExecuteTestsOptions{ModulePath: "./test", InstallCommand: "fail install test", RunCommand: "npm run test"} | ||||
|  | ||||
| 		e := execMockRunner{} | ||||
| 		err := runKarma(opts, &e) | ||||
| 		assert.Error(t, err, "error expected but none occcured") | ||||
| 		runKarma(opts, &e) | ||||
| 		assert.True(t, hasFailed, "expected command to exit with fatal") | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("error case run command", func(t *testing.T) { | ||||
| 		var hasFailed bool | ||||
| 		log.Entry().Logger.ExitFunc = func(int) { hasFailed = true } | ||||
|  | ||||
| 		opts := karmaExecuteTestsOptions{ModulePath: "./test", InstallCommand: "npm install test", RunCommand: "fail run test"} | ||||
|  | ||||
| 		e := execMockRunner{} | ||||
| 		err := runKarma(opts, &e) | ||||
| 		assert.Error(t, err, "error expected but none occcured") | ||||
| 		runKarma(opts, &e) | ||||
| 		assert.True(t, hasFailed, "expected command to exit with fatal") | ||||
| 	}) | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import ( | ||||
| 	//"os" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/config" | ||||
| 	"github.com/SAP/jenkins-library/pkg/log" | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
|  | ||||
| @@ -21,6 +22,8 @@ func VersionCommand() *cobra.Command { | ||||
| 		Short: "Returns the version of the piper binary", | ||||
| 		Long:  `Writes the commit hash and the tag (if any) to stdout and exits with 0.`, | ||||
| 		PreRunE: func(cmd *cobra.Command, args []string) error { | ||||
| 			log.SetStepName("version") | ||||
| 			log.SetVerbose(generalConfig.verbose) | ||||
| 			return PrepareConfig(cmd, &metadata, "version", &myVersionOptions, openPiperFile) | ||||
| 		}, | ||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | ||||
|   | ||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							| @@ -5,6 +5,7 @@ go 1.13 | ||||
| require ( | ||||
| 	github.com/ghodss/yaml v1.0.0 | ||||
| 	github.com/pkg/errors v0.8.1 | ||||
| 	github.com/sirupsen/logrus v1.4.2 | ||||
| 	github.com/spf13/cobra v0.0.5 | ||||
| 	github.com/spf13/pflag v1.0.5 | ||||
| 	github.com/stretchr/testify v1.2.2 | ||||
|   | ||||
							
								
								
									
										6
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								go.sum
									
									
									
									
									
								
							| @@ -12,6 +12,7 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME | ||||
| github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= | ||||
| github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= | ||||
| github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | ||||
| github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= | ||||
| github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= | ||||
| @@ -21,6 +22,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE | ||||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | ||||
| github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= | ||||
| github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | ||||
| github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | ||||
| github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||||
| github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= | ||||
| @@ -30,12 +33,15 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn | ||||
| github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | ||||
| github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||
| github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= | ||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= | ||||
| github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= | ||||
| golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= | ||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | ||||
|   | ||||
| @@ -33,6 +33,7 @@ import ( | ||||
| 	//"os" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/config" | ||||
| 	"github.com/SAP/jenkins-library/pkg/log" | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
|  | ||||
| @@ -52,6 +53,8 @@ func {{.CobraCmdFuncName}}() *cobra.Command { | ||||
| 		Short: "{{.Short}}", | ||||
| 		Long: {{ $tick := "` + "`" + `" }}{{ $tick }}{{.Long | longName }}{{ $tick }}, | ||||
| 		PreRunE: func(cmd *cobra.Command, args []string) error { | ||||
| 			log.SetStepName("{{ .StepName }}") | ||||
| 			log.SetVerbose(generalConfig.verbose) | ||||
| 			return PrepareConfig(cmd, &metadata, "{{ .StepName }}", &my{{ .StepName | title}}Options, openPiperFile) | ||||
| 		}, | ||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import ( | ||||
| 	//"os" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/config" | ||||
| 	"github.com/SAP/jenkins-library/pkg/log" | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
|  | ||||
| @@ -24,6 +25,8 @@ func TestStepCommand() *cobra.Command { | ||||
| 		Short: "Test description", | ||||
| 		Long: `Long Test description`, | ||||
| 		PreRunE: func(cmd *cobra.Command, args []string) error { | ||||
| 			log.SetStepName("testStep") | ||||
| 			log.SetVerbose(generalConfig.verbose) | ||||
| 			return PrepareConfig(cmd, &metadata, "testStep", &myTestStepOptions, openPiperFile) | ||||
| 		}, | ||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | ||||
|   | ||||
							
								
								
									
										28
									
								
								pkg/log/log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								pkg/log/log.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| package log | ||||
|  | ||||
| import ( | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | ||||
| var logger *logrus.Entry | ||||
|  | ||||
| // Entry returns the logger entry or creates one if none is present. | ||||
| func Entry() *logrus.Entry { | ||||
| 	if logger == nil { | ||||
| 		logger = logrus.WithField("library", "sap/jenkins-library") | ||||
| 	} | ||||
| 	return logger | ||||
| } | ||||
|  | ||||
| // SetVerbose sets the log level with respect to verbose flag. | ||||
| func SetVerbose(verbose bool) { | ||||
| 	if verbose { | ||||
| 		//Logger().Debugf("logging set to level: %s", level) | ||||
| 		logrus.SetLevel(logrus.DebugLevel) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // SetStepName sets the stepName field. | ||||
| func SetStepName(stepName string) { | ||||
| 	logger = Entry().WithField("stepName", stepName) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user