1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-07-17 01:42:43 +02:00

feat(golangBuild): upload reports to GCS (#3550)

Co-authored-by: Oliver Nocon <33484802+OliverNocon@users.noreply.github.com>
This commit is contained in:
Christian Volk
2022-02-17 17:56:45 +01:00
committed by GitHub
parent dbb8173be8
commit 25abbe42cc
2 changed files with 67 additions and 0 deletions

View File

@ -5,13 +5,17 @@ package cmd
import (
"fmt"
"os"
"reflect"
"strings"
"time"
"github.com/SAP/jenkins-library/pkg/config"
"github.com/SAP/jenkins-library/pkg/gcs"
"github.com/SAP/jenkins-library/pkg/log"
"github.com/SAP/jenkins-library/pkg/splunk"
"github.com/SAP/jenkins-library/pkg/telemetry"
"github.com/SAP/jenkins-library/pkg/validation"
"github.com/bmatcuk/doublestar"
"github.com/spf13/cobra"
)
@ -40,6 +44,43 @@ type golangBuildOptions struct {
ArtifactVersion string `json:"artifactVersion,omitempty"`
}
type golangBuildReports struct {
}
func (p *golangBuildReports) persist(stepConfig golangBuildOptions, gcpJsonKeyFilePath string, gcsBucketId string, gcsFolderPath string, gcsSubFolder string) {
if gcsBucketId == "" {
log.Entry().Info("persisting reports to GCS is disabled, because gcsBucketId is empty")
return
}
log.Entry().Info("Uploading reports to Google Cloud Storage...")
content := []gcs.ReportOutputParam{
{FilePattern: "**/bom.xml", ParamRef: "", StepResultType: "sbom"},
{FilePattern: "**/TEST-*.xml", ParamRef: "", StepResultType: "junit"},
{FilePattern: "**/cobertura-coverage.xml", ParamRef: "", StepResultType: "cobertura-coverage"},
}
envVars := []gcs.EnvVar{
{Name: "GOOGLE_APPLICATION_CREDENTIALS", Value: gcpJsonKeyFilePath, Modified: false},
}
gcsClient, err := gcs.NewClient(gcs.WithEnvVars(envVars))
if err != nil {
log.Entry().Errorf("creation of GCS client failed: %v", err)
}
defer gcsClient.Close()
structVal := reflect.ValueOf(&stepConfig).Elem()
inputParameters := map[string]string{}
for i := 0; i < structVal.NumField(); i++ {
field := structVal.Type().Field(i)
if field.Type.String() == "string" {
paramName := strings.Split(field.Tag.Get("json"), ",")
paramValue, _ := structVal.Field(i).Interface().(string)
inputParameters[paramName[0]] = paramValue
}
}
if err := gcs.PersistReportsToGCS(gcsClient, content, inputParameters, gcsFolderPath, gcsBucketId, gcsSubFolder, doublestar.Glob, os.Stat); err != nil {
log.Entry().Errorf("failed to persist reports: %v", err)
}
}
// GolangBuildCommand This step will execute a golang build.
func GolangBuildCommand() *cobra.Command {
const STEP_NAME = "golangBuild"
@ -47,6 +88,7 @@ func GolangBuildCommand() *cobra.Command {
metadata := golangBuildMetadata()
var stepConfig golangBuildOptions
var startTime time.Time
var reports golangBuildReports
var logCollector *log.CollectorHook
var splunkClient *splunk.Splunk
telemetryClient := &telemetry.Telemetry{}
@ -106,6 +148,7 @@ If the build is successful the resulting artifact can be uploaded to e.g. a bina
stepTelemetryData := telemetry.CustomData{}
stepTelemetryData.ErrorCode = "1"
handler := func() {
reports.persist(stepConfig, GeneralConfig.GCPJsonKeyFilePath, GeneralConfig.GCSBucketId, GeneralConfig.GCSFolderPath, GeneralConfig.GCSSubFolder)
config.RemoveVaultSecretFiles()
stepTelemetryData.Duration = fmt.Sprintf("%v", time.Since(startTime).Milliseconds())
stepTelemetryData.ErrorCategory = log.GetErrorCategory().String()
@ -411,6 +454,19 @@ func golangBuildMetadata() config.StepData {
Containers: []config.Container{
{Name: "golang", Image: "golang:1", Options: []config.Option{{Name: "-u", Value: "0"}}},
},
Outputs: config.StepOutputs{
Resources: []config.StepResources{
{
Name: "reports",
Type: "reports",
Parameters: []map[string]interface{}{
{"filePattern": "**/bom.xml", "type": "sbom"},
{"filePattern": "**/TEST-*.xml", "type": "junit"},
{"filePattern": "**/cobertura-coverage.xml", "type": "cobertura-coverage"},
},
},
},
},
},
}
return theMetaData