From 938437fe9c548536d5359db5f6cd995a1f44f70e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tilo=20K=C3=B6rner?= <70266685+tiloKo@users.noreply.github.com> Date: Thu, 20 Jun 2024 10:44:12 +0200 Subject: [PATCH] errorcause and remove telemetry warnings (#4951) --- cmd/abapAddonAssemblyKitCheck.go | 6 +- cmd/abapAddonAssemblyKitCheckCVs.go | 6 +- cmd/abapAddonAssemblyKitCheckCVs_test.go | 8 +- cmd/abapAddonAssemblyKitCheckPV.go | 7 +- cmd/abapAddonAssemblyKitCheckPV_test.go | 6 +- cmd/abapAddonAssemblyKitCheck_test.go | 4 +- cmd/abapAddonAssemblyKitCreateTargetVector.go | 6 +- ...AddonAssemblyKitCreateTargetVector_test.go | 8 +- ...abapAddonAssemblyKitPublishTargetVector.go | 7 +- ...ddonAssemblyKitPublishTargetVector_test.go | 8 +- cmd/abapAddonAssemblyKitRegisterPackages.go | 8 +- ...apAddonAssemblyKitRegisterPackages_test.go | 8 +- cmd/abapAddonAssemblyKitReleasePackages.go | 7 +- ...bapAddonAssemblyKitReleasePackages_test.go | 8 +- ...abapAddonAssemblyKitReserveNextPackages.go | 8 +- ...ddonAssemblyKitReserveNextPackages_test.go | 9 +- cmd/abapEnvironmentAssembleConfirm.go | 7 +- cmd/abapEnvironmentAssemblePackages.go | 82 +++++++++++++------ cmd/abapEnvironmentAssemblePackages_test.go | 4 +- cmd/abapEnvironmentBuild.go | 7 +- cmd/abapEnvironmentBuild_test.go | 12 +-- pkg/abap/build/bfw.go | 55 +++++++++---- pkg/abaputils/descriptor.go | 2 + 23 files changed, 182 insertions(+), 101 deletions(-) diff --git a/cmd/abapAddonAssemblyKitCheck.go b/cmd/abapAddonAssemblyKitCheck.go index 923c27631c..c4ce5950d0 100644 --- a/cmd/abapAddonAssemblyKitCheck.go +++ b/cmd/abapAddonAssemblyKitCheck.go @@ -11,14 +11,16 @@ import ( func abapAddonAssemblyKitCheck(config abapAddonAssemblyKitCheckOptions, telemetryData *telemetry.CustomData, commonPipelineEnvironment *abapAddonAssemblyKitCheckCommonPipelineEnvironment) { utils := aakaas.NewAakBundle() + telemetryData.BuildTool = "AAKaaS" - err := runAbapAddonAssemblyKitCheck(&config, telemetryData, utils, commonPipelineEnvironment) + err := runAbapAddonAssemblyKitCheck(&config, utils, commonPipelineEnvironment) if err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapAddonAssemblyKitCheck(config *abapAddonAssemblyKitCheckOptions, telemetryData *telemetry.CustomData, utils aakaas.AakUtils, commonPipelineEnvironment *abapAddonAssemblyKitCheckCommonPipelineEnvironment) error { +func runAbapAddonAssemblyKitCheck(config *abapAddonAssemblyKitCheckOptions, utils aakaas.AakUtils, commonPipelineEnvironment *abapAddonAssemblyKitCheckCommonPipelineEnvironment) error { log.Entry().Info("╔═══════════════════════════╗") log.Entry().Info("║ abapAddonAssemblyKitCheck ║") diff --git a/cmd/abapAddonAssemblyKitCheckCVs.go b/cmd/abapAddonAssemblyKitCheckCVs.go index 2ba5406ca6..e51574230e 100644 --- a/cmd/abapAddonAssemblyKitCheckCVs.go +++ b/cmd/abapAddonAssemblyKitCheckCVs.go @@ -11,12 +11,14 @@ import ( func abapAddonAssemblyKitCheckCVs(config abapAddonAssemblyKitCheckCVsOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitCheckCVsCommonPipelineEnvironment) { utils := aakaas.NewAakBundle() - if err := runAbapAddonAssemblyKitCheckCVs(&config, telemetryData, &utils, cpe); err != nil { + telemetryData.BuildTool = "AAKaaS" + if err := runAbapAddonAssemblyKitCheckCVs(&config, &utils, cpe); err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapAddonAssemblyKitCheckCVs(config *abapAddonAssemblyKitCheckCVsOptions, telemetryData *telemetry.CustomData, utils *aakaas.AakUtils, cpe *abapAddonAssemblyKitCheckCVsCommonPipelineEnvironment) error { +func runAbapAddonAssemblyKitCheckCVs(config *abapAddonAssemblyKitCheckCVsOptions, utils *aakaas.AakUtils, cpe *abapAddonAssemblyKitCheckCVsCommonPipelineEnvironment) error { log.Entry().Info("╔══════════════════════════════╗") log.Entry().Info("║ abapAddonAssemblyKitCheckCVs ║") diff --git a/cmd/abapAddonAssemblyKitCheckCVs_test.go b/cmd/abapAddonAssemblyKitCheckCVs_test.go index ce1c20eb1e..6a16f1583f 100644 --- a/cmd/abapAddonAssemblyKitCheckCVs_test.go +++ b/cmd/abapAddonAssemblyKitCheckCVs_test.go @@ -22,7 +22,7 @@ func TestCheckCVsStep(t *testing.T) { config.Password = "dummyPassword" t.Run("step success", func(t *testing.T) { config.AddonDescriptorFileName = "success" - err := runAbapAddonAssemblyKitCheckCVs(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitCheckCVs(&config, &utils, &cpe) assert.NoError(t, err, "Did not expect error") var addonDescriptorFinal abaputils.AddonDescriptor err = json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal) @@ -34,13 +34,13 @@ func TestCheckCVsStep(t *testing.T) { }) t.Run("step error - in validate(no CommitID)", func(t *testing.T) { config.AddonDescriptorFileName = "noCommitID" - err := runAbapAddonAssemblyKitCheckCVs(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitCheckCVs(&config, &utils, &cpe) assert.Error(t, err, "Must end with error") assert.Contains(t, err.Error(), "CommitID missing in repo") }) t.Run("step error - in ReadAddonDescriptor", func(t *testing.T) { config.AddonDescriptorFileName = "failing" - err := runAbapAddonAssemblyKitCheckCVs(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitCheckCVs(&config, &utils, &cpe) assert.Error(t, err, "Must end with error") assert.Contains(t, "error in ReadAddonDescriptor", err.Error()) }) @@ -48,7 +48,7 @@ func TestCheckCVsStep(t *testing.T) { config.AddonDescriptorFileName = "success" bundle.SetBody("ErrorBody") bundle.SetError("error during validation") - err := runAbapAddonAssemblyKitCheckCVs(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitCheckCVs(&config, &utils, &cpe) assert.Error(t, err, "Must end with error") }) } diff --git a/cmd/abapAddonAssemblyKitCheckPV.go b/cmd/abapAddonAssemblyKitCheckPV.go index 8ec346d863..e4847edf15 100644 --- a/cmd/abapAddonAssemblyKitCheckPV.go +++ b/cmd/abapAddonAssemblyKitCheckPV.go @@ -11,12 +11,13 @@ import ( func abapAddonAssemblyKitCheckPV(config abapAddonAssemblyKitCheckPVOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitCheckPVCommonPipelineEnvironment) { utils := aakaas.NewAakBundle() - // error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end - if err := runAbapAddonAssemblyKitCheckPV(&config, telemetryData, utils, cpe); err != nil { + telemetryData.BuildTool = "AAKaaS" + if err := runAbapAddonAssemblyKitCheckPV(&config, utils, cpe); err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapAddonAssemblyKitCheckPV(config *abapAddonAssemblyKitCheckPVOptions, telemetryData *telemetry.CustomData, utils aakaas.AakUtils, cpe *abapAddonAssemblyKitCheckPVCommonPipelineEnvironment) error { +func runAbapAddonAssemblyKitCheckPV(config *abapAddonAssemblyKitCheckPVOptions, utils aakaas.AakUtils, cpe *abapAddonAssemblyKitCheckPVCommonPipelineEnvironment) error { log.Entry().Info("╔═════════════════════════════╗") log.Entry().Info("║ abapAddonAssemblyKitCheckPV ║") diff --git a/cmd/abapAddonAssemblyKitCheckPV_test.go b/cmd/abapAddonAssemblyKitCheckPV_test.go index a8d2dc567e..31925e3d42 100644 --- a/cmd/abapAddonAssemblyKitCheckPV_test.go +++ b/cmd/abapAddonAssemblyKitCheckPV_test.go @@ -22,7 +22,7 @@ func TestCheckPVStep(t *testing.T) { config.Password = "dummyPassword" t.Run("step success", func(t *testing.T) { config.AddonDescriptorFileName = "success" - err := runAbapAddonAssemblyKitCheckPV(&config, nil, utils, &cpe) + err := runAbapAddonAssemblyKitCheckPV(&config, utils, &cpe) assert.NoError(t, err, "Did not expect error") var addonDescriptorFinal abaputils.AddonDescriptor err = json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal) @@ -33,7 +33,7 @@ func TestCheckPVStep(t *testing.T) { }) t.Run("step error - in ReadAddonDescriptor", func(t *testing.T) { config.AddonDescriptorFileName = "failing" - err := runAbapAddonAssemblyKitCheckPV(&config, nil, utils, &cpe) + err := runAbapAddonAssemblyKitCheckPV(&config, utils, &cpe) assert.Error(t, err, "Did expect error") assert.Equal(t, err.Error(), "error in ReadAddonDescriptor") }) @@ -41,7 +41,7 @@ func TestCheckPVStep(t *testing.T) { config.AddonDescriptorFileName = "success" bundle.SetBody("ErrorBody") bundle.SetError("error during validation") - err := runAbapAddonAssemblyKitCheckPV(&config, nil, utils, &cpe) + err := runAbapAddonAssemblyKitCheckPV(&config, utils, &cpe) assert.Error(t, err, "Did expect error") }) } diff --git a/cmd/abapAddonAssemblyKitCheck_test.go b/cmd/abapAddonAssemblyKitCheck_test.go index a9b2f41fbe..809127dc66 100644 --- a/cmd/abapAddonAssemblyKitCheck_test.go +++ b/cmd/abapAddonAssemblyKitCheck_test.go @@ -37,7 +37,7 @@ func TestRunAbapAddonAssemblyKitCheck(t *testing.T) { }, } - err := runAbapAddonAssemblyKitCheck(&config, nil, utils, &cpe) + err := runAbapAddonAssemblyKitCheck(&config, utils, &cpe) assert.NoError(t, err) }) @@ -53,7 +53,7 @@ func TestRunAbapAddonAssemblyKitCheck(t *testing.T) { }, } - err := runAbapAddonAssemblyKitCheck(&config, nil, utils, &cpe) + err := runAbapAddonAssemblyKitCheck(&config, utils, &cpe) assert.EqualError(t, err, "addonDescriptor must contain at least one software component repository") }) diff --git a/cmd/abapAddonAssemblyKitCreateTargetVector.go b/cmd/abapAddonAssemblyKitCreateTargetVector.go index 5701f02a07..6d7a7bf316 100644 --- a/cmd/abapAddonAssemblyKitCreateTargetVector.go +++ b/cmd/abapAddonAssemblyKitCreateTargetVector.go @@ -19,15 +19,17 @@ func abapAddonAssemblyKitCreateTargetVector(config abapAddonAssemblyKitCreateTar c.Stderr(log.Writer()) client := piperhttp.Client{} + telemetryData.BuildTool = "AAKaaS" // error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end - err := runAbapAddonAssemblyKitCreateTargetVector(&config, telemetryData, &client, cpe) + err := runAbapAddonAssemblyKitCreateTargetVector(&config, &client, cpe) if err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapAddonAssemblyKitCreateTargetVector(config *abapAddonAssemblyKitCreateTargetVectorOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender, cpe *abapAddonAssemblyKitCreateTargetVectorCommonPipelineEnvironment) error { +func runAbapAddonAssemblyKitCreateTargetVector(config *abapAddonAssemblyKitCreateTargetVectorOptions, client piperhttp.Sender, cpe *abapAddonAssemblyKitCreateTargetVectorCommonPipelineEnvironment) error { conn := new(abapbuild.Connector) if err := conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client, config.AbapAddonAssemblyKitOriginHash, config.AbapAddonAssemblyKitCertificateFile, config.AbapAddonAssemblyKitCertificatePass); err != nil { return err diff --git a/cmd/abapAddonAssemblyKitCreateTargetVector_test.go b/cmd/abapAddonAssemblyKitCreateTargetVector_test.go index c63b473381..0174024ecf 100644 --- a/cmd/abapAddonAssemblyKitCreateTargetVector_test.go +++ b/cmd/abapAddonAssemblyKitCreateTargetVector_test.go @@ -45,7 +45,7 @@ func TestCreateTargetVectorStep(t *testing.T) { t.Run("step success test", func(t *testing.T) { //act - err := runAbapAddonAssemblyKitCreateTargetVector(&config, nil, client, &cpe) + err := runAbapAddonAssemblyKitCreateTargetVector(&config, client, &cpe) //assert assert.NoError(t, err, "Did not expect error") @@ -62,7 +62,7 @@ func TestCreateTargetVectorStep(t *testing.T) { Error: errors.New("dummy"), } //act - err := runAbapAddonAssemblyKitCreateTargetVector(&config, nil, client, &cpe) + err := runAbapAddonAssemblyKitCreateTargetVector(&config, client, &cpe) //assert assert.Error(t, err, "Must end with error") }) @@ -77,7 +77,7 @@ func TestCreateTargetVectorStep(t *testing.T) { adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) //act - err := runAbapAddonAssemblyKitCreateTargetVector(&config, nil, client, &cpe) + err := runAbapAddonAssemblyKitCreateTargetVector(&config, client, &cpe) //assert assert.Error(t, err, "Must end with error") }) @@ -104,7 +104,7 @@ func TestCreateTargetVectorStep(t *testing.T) { adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) //act - err := runAbapAddonAssemblyKitCreateTargetVector(&config, nil, client, &cpe) + err := runAbapAddonAssemblyKitCreateTargetVector(&config, client, &cpe) //assert assert.Error(t, err, "Must end with error") }) diff --git a/cmd/abapAddonAssemblyKitPublishTargetVector.go b/cmd/abapAddonAssemblyKitPublishTargetVector.go index ddd5bf3b1b..a77a47ffa2 100644 --- a/cmd/abapAddonAssemblyKitPublishTargetVector.go +++ b/cmd/abapAddonAssemblyKitPublishTargetVector.go @@ -13,14 +13,15 @@ import ( func abapAddonAssemblyKitPublishTargetVector(config abapAddonAssemblyKitPublishTargetVectorOptions, telemetryData *telemetry.CustomData) { utils := aakaas.NewAakBundleWithTime(time.Duration(config.MaxRuntimeInMinutes), time.Duration(config.PollingIntervalInSeconds)) + telemetryData.BuildTool = "AAKaaS" - // error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end - if err := runAbapAddonAssemblyKitPublishTargetVector(&config, telemetryData, &utils); err != nil { + if err := runAbapAddonAssemblyKitPublishTargetVector(&config, &utils); err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapAddonAssemblyKitPublishTargetVector(config *abapAddonAssemblyKitPublishTargetVectorOptions, telemetryData *telemetry.CustomData, utils *aakaas.AakUtils) error { +func runAbapAddonAssemblyKitPublishTargetVector(config *abapAddonAssemblyKitPublishTargetVectorOptions, utils *aakaas.AakUtils) error { conn := new(abapbuild.Connector) if err := conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, *utils, config.AbapAddonAssemblyKitOriginHash, config.AbapAddonAssemblyKitCertificateFile, config.AbapAddonAssemblyKitCertificatePass); err != nil { diff --git a/cmd/abapAddonAssemblyKitPublishTargetVector_test.go b/cmd/abapAddonAssemblyKitPublishTargetVector_test.go index 176216cc23..ea6bb5edec 100644 --- a/cmd/abapAddonAssemblyKitPublishTargetVector_test.go +++ b/cmd/abapAddonAssemblyKitPublishTargetVector_test.go @@ -37,7 +37,7 @@ func TestPublishTargetVectorStep(t *testing.T) { utils := bundle.GetUtils() //act - err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, &utils) + err := runAbapAddonAssemblyKitPublishTargetVector(&config, &utils) //assert assert.NoError(t, err, "Did not expect error") }) @@ -54,7 +54,7 @@ func TestPublishTargetVectorStep(t *testing.T) { utils := bundle.GetUtils() //act - err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, &utils) + err := runAbapAddonAssemblyKitPublishTargetVector(&config, &utils) //assert assert.NoError(t, err, "Did not expect error") }) @@ -67,7 +67,7 @@ func TestPublishTargetVectorStep(t *testing.T) { utils := bundle.GetUtils() //act - err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, &utils) + err := runAbapAddonAssemblyKitPublishTargetVector(&config, &utils) //assert assert.Error(t, err, "Must end with error") }) @@ -80,7 +80,7 @@ func TestPublishTargetVectorStep(t *testing.T) { utils := bundle.GetUtils() //act - err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, &utils) + err := runAbapAddonAssemblyKitPublishTargetVector(&config, &utils) //assert assert.Error(t, err, "Must end with error") }) diff --git a/cmd/abapAddonAssemblyKitRegisterPackages.go b/cmd/abapAddonAssemblyKitRegisterPackages.go index db460423ba..07b15edcf8 100644 --- a/cmd/abapAddonAssemblyKitRegisterPackages.go +++ b/cmd/abapAddonAssemblyKitRegisterPackages.go @@ -23,15 +23,15 @@ func abapAddonAssemblyKitRegisterPackages(config abapAddonAssemblyKitRegisterPac c.Stderr(log.Writer()) client := piperhttp.Client{} + telemetryData.BuildTool = "AAKaaS" - // error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end - err := runAbapAddonAssemblyKitRegisterPackages(&config, telemetryData, &client, cpe, reader) - if err != nil { + if err := runAbapAddonAssemblyKitRegisterPackages(&config, &client, cpe, reader); err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapAddonAssemblyKitRegisterPackages(config *abapAddonAssemblyKitRegisterPackagesOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender, +func runAbapAddonAssemblyKitRegisterPackages(config *abapAddonAssemblyKitRegisterPackagesOptions, client piperhttp.Sender, cpe *abapAddonAssemblyKitRegisterPackagesCommonPipelineEnvironment, fileReader readFile) error { var addonDescriptor abaputils.AddonDescriptor diff --git a/cmd/abapAddonAssemblyKitRegisterPackages_test.go b/cmd/abapAddonAssemblyKitRegisterPackages_test.go index 67c6f44326..5f6aee0f36 100644 --- a/cmd/abapAddonAssemblyKitRegisterPackages_test.go +++ b/cmd/abapAddonAssemblyKitRegisterPackages_test.go @@ -47,7 +47,7 @@ func TestRegisterPackagesStep(t *testing.T) { } adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) - err := runAbapAddonAssemblyKitRegisterPackages(&config, nil, client, &cpe, mockReader) + err := runAbapAddonAssemblyKitRegisterPackages(&config, client, &cpe, mockReader) assert.NoError(t, err, "Did not expect error") var addonDescriptorFinal abaputils.AddonDescriptor @@ -70,7 +70,7 @@ func TestRegisterPackagesStep(t *testing.T) { } adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) - err := runAbapAddonAssemblyKitRegisterPackages(&config, nil, client, &cpe, mockReader) + err := runAbapAddonAssemblyKitRegisterPackages(&config, client, &cpe, mockReader) assert.Error(t, err, "Did expect error") }) @@ -90,7 +90,7 @@ func TestRegisterPackagesStep(t *testing.T) { } adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) - err := runAbapAddonAssemblyKitRegisterPackages(&config, nil, client, &cpe, mockReader) + err := runAbapAddonAssemblyKitRegisterPackages(&config, client, &cpe, mockReader) assert.Error(t, err, "Did expect error") }) t.Run("step error - registerPackages - invalid input", func(t *testing.T) { @@ -107,7 +107,7 @@ func TestRegisterPackagesStep(t *testing.T) { } adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) - err := runAbapAddonAssemblyKitRegisterPackages(&config, nil, client, &cpe, mockReader) + err := runAbapAddonAssemblyKitRegisterPackages(&config, client, &cpe, mockReader) assert.Error(t, err, "Did expect error") }) } diff --git a/cmd/abapAddonAssemblyKitReleasePackages.go b/cmd/abapAddonAssemblyKitReleasePackages.go index 293ed45876..98811b0dec 100644 --- a/cmd/abapAddonAssemblyKitReleasePackages.go +++ b/cmd/abapAddonAssemblyKitReleasePackages.go @@ -14,14 +14,15 @@ import ( func abapAddonAssemblyKitReleasePackages(config abapAddonAssemblyKitReleasePackagesOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitReleasePackagesCommonPipelineEnvironment) { utils := aakaas.NewAakBundleWithTime(time.Duration(config.MaxRuntimeInMinutes), time.Duration(config.PollingIntervalInSeconds)) + telemetryData.BuildTool = "AAKaaS" - // error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end - if err := runAbapAddonAssemblyKitReleasePackages(&config, telemetryData, &utils, cpe); err != nil { + if err := runAbapAddonAssemblyKitReleasePackages(&config, &utils, cpe); err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapAddonAssemblyKitReleasePackages(config *abapAddonAssemblyKitReleasePackagesOptions, telemetryData *telemetry.CustomData, utils *aakaas.AakUtils, +func runAbapAddonAssemblyKitReleasePackages(config *abapAddonAssemblyKitReleasePackagesOptions, utils *aakaas.AakUtils, cpe *abapAddonAssemblyKitReleasePackagesCommonPipelineEnvironment) error { conn := new(abapbuild.Connector) if err := conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, *utils, config.AbapAddonAssemblyKitOriginHash, config.AbapAddonAssemblyKitCertificateFile, config.AbapAddonAssemblyKitCertificatePass); err != nil { diff --git a/cmd/abapAddonAssemblyKitReleasePackages_test.go b/cmd/abapAddonAssemblyKitReleasePackages_test.go index 2174deb046..4b08d2359b 100644 --- a/cmd/abapAddonAssemblyKitReleasePackages_test.go +++ b/cmd/abapAddonAssemblyKitReleasePackages_test.go @@ -39,7 +39,7 @@ func TestReleasePackagesStep(t *testing.T) { adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) //act - err := runAbapAddonAssemblyKitReleasePackages(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitReleasePackages(&config, &utils, &cpe) //assert assert.NoError(t, err, "Did not expect error") var addonDescriptorFinal abaputils.AddonDescriptor @@ -60,7 +60,7 @@ func TestReleasePackagesStep(t *testing.T) { adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) //act - err := runAbapAddonAssemblyKitReleasePackages(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitReleasePackages(&config, &utils, &cpe) //assert assert.Error(t, err, "Did expect error") assert.Equal(t, err.Error(), "Parameter missing. Please provide the name of the package which should be released") @@ -81,7 +81,7 @@ func TestReleasePackagesStep(t *testing.T) { adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) //act - err := runAbapAddonAssemblyKitReleasePackages(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitReleasePackages(&config, &utils, &cpe) //assert assert.Error(t, err, "Did expect error") assert.Equal(t, err.Error(), "Release of all packages failed/timed out - Aborting as abapEnvironmentAssembleConfirm step is not needed: Timed out") @@ -116,7 +116,7 @@ func TestReleasePackagesStepMix(t *testing.T) { adoDesc, _ := json.Marshal(addonDescriptor) config.AddonDescriptor = string(adoDesc) //act - err := runAbapAddonAssemblyKitReleasePackages(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitReleasePackages(&config, &utils, &cpe) //assert assert.NoError(t, err, "Did not expect error") var addonDescriptorFinal abaputils.AddonDescriptor diff --git a/cmd/abapAddonAssemblyKitReserveNextPackages.go b/cmd/abapAddonAssemblyKitReserveNextPackages.go index 4f0bfc67a8..9699da241e 100644 --- a/cmd/abapAddonAssemblyKitReserveNextPackages.go +++ b/cmd/abapAddonAssemblyKitReserveNextPackages.go @@ -15,13 +15,15 @@ import ( func abapAddonAssemblyKitReserveNextPackages(config abapAddonAssemblyKitReserveNextPackagesOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment) { utils := aakaas.NewAakBundleWithTime(time.Duration(config.MaxRuntimeInMinutes), time.Duration(config.PollingIntervalInSeconds)) - // error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end - if err := runAbapAddonAssemblyKitReserveNextPackages(&config, telemetryData, &utils, cpe); err != nil { + telemetryData.BuildTool = "AAKaaS" + + if err := runAbapAddonAssemblyKitReserveNextPackages(&config, &utils, cpe); err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapAddonAssemblyKitReserveNextPackages(config *abapAddonAssemblyKitReserveNextPackagesOptions, telemetryData *telemetry.CustomData, utils *aakaas.AakUtils, +func runAbapAddonAssemblyKitReserveNextPackages(config *abapAddonAssemblyKitReserveNextPackagesOptions, utils *aakaas.AakUtils, cpe *abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment) error { log.Entry().Info("╔═════════════════════════════════════════╗") diff --git a/cmd/abapAddonAssemblyKitReserveNextPackages_test.go b/cmd/abapAddonAssemblyKitReserveNextPackages_test.go index 2642e4b3e4..ee6fe9ca82 100644 --- a/cmd/abapAddonAssemblyKitReserveNextPackages_test.go +++ b/cmd/abapAddonAssemblyKitReserveNextPackages_test.go @@ -45,7 +45,7 @@ func TestReserveNextPackagesStep(t *testing.T) { }) bodyList := []string{responseReserveNextPackageReleased, responseReserveNextPackagePlanned, responseReserveNextPackagePostReleased, "myToken", responseReserveNextPackagePostPlanned, "myToken"} bundle.SetBodyList(bodyList) - err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitReserveNextPackages(&config, &utils, &cpe) assert.NoError(t, err, "Did not expect error") var addonDescriptorFinal abaputils.AddonDescriptor err = json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal) @@ -71,7 +71,7 @@ func TestReserveNextPackagesStep(t *testing.T) { }) bodyList := []string{responseReserveNextPackageReleased, responseReserveNextPackagePlanned, responseReserveNextPackagePostReleased, "myToken", responseReserveNextPackagePostPlanned, "myToken"} bundle.SetBodyList(bodyList) - err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitReserveNextPackages(&config, &utils, &cpe) assert.NoError(t, err, "Did not expect error") var addonDescriptorFinal abaputils.AddonDescriptor err = json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal) @@ -87,7 +87,7 @@ func TestReserveNextPackagesStep(t *testing.T) { }, }, }) - err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe) + err := runAbapAddonAssemblyKitReserveNextPackages(&config, &utils, &cpe) assert.Error(t, err, "Did expect error") }) t.Run("step error - timeout", func(t *testing.T) { @@ -102,7 +102,8 @@ func TestReserveNextPackagesStep(t *testing.T) { bodyList := []string{responseReserveNextPackageCreationTriggered, responseReserveNextPackagePostPlanned, "myToken"} bundle.SetBodyList(bodyList) bundle.SetMaxRuntime(time.Duration(1 * time.Microsecond)) - err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe) + bundle.ClientMock.ErrorInsteadOfDump = true + err := runAbapAddonAssemblyKitReserveNextPackages(&config, &utils, &cpe) assert.Error(t, err, "Did expect error") }) } diff --git a/cmd/abapEnvironmentAssembleConfirm.go b/cmd/abapEnvironmentAssembleConfirm.go index 94e84888b1..a6a914e3a6 100644 --- a/cmd/abapEnvironmentAssembleConfirm.go +++ b/cmd/abapEnvironmentAssembleConfirm.go @@ -24,14 +24,17 @@ func abapEnvironmentAssembleConfirm(config abapEnvironmentAssembleConfirmOptions Exec: &c, } + telemetryData.BuildTool = "ABAP Build Framework" + client := piperhttp.Client{} - err := runAbapEnvironmentAssembleConfirm(&config, telemetryData, &autils, &client, cpe) + err := runAbapEnvironmentAssembleConfirm(&config, &autils, &client, cpe) if err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapEnvironmentAssembleConfirm(config *abapEnvironmentAssembleConfirmOptions, telemetryData *telemetry.CustomData, com abaputils.Communication, client abapbuild.HTTPSendLoader, cpe *abapEnvironmentAssembleConfirmCommonPipelineEnvironment) error { +func runAbapEnvironmentAssembleConfirm(config *abapEnvironmentAssembleConfirmOptions, com abaputils.Communication, client abapbuild.HTTPSendLoader, cpe *abapEnvironmentAssembleConfirmCommonPipelineEnvironment) error { conn := new(abapbuild.Connector) var connConfig abapbuild.ConnectorConfiguration connConfig.CfAPIEndpoint = config.CfAPIEndpoint diff --git a/cmd/abapEnvironmentAssemblePackages.go b/cmd/abapEnvironmentAssemblePackages.go index 5b4a8f6395..92df409019 100644 --- a/cmd/abapEnvironmentAssemblePackages.go +++ b/cmd/abapEnvironmentAssemblePackages.go @@ -1,6 +1,7 @@ package cmd import ( + "fmt" "path" "path/filepath" "time" @@ -33,55 +34,81 @@ func abapEnvironmentAssemblePackages(config abapEnvironmentAssemblePackagesOptio client := piperhttp.Client{} utils := piperutils.Files{} - err := runAbapEnvironmentAssemblePackages(&config, telemetryData, &autils, &utils, &client, cpe) - if err != nil { + + telemetryData.BuildTool = "ABAP Build Framework" + + if err := runAbapEnvironmentAssemblePackages(&config, &autils, &utils, &client, cpe); err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapEnvironmentAssemblePackages(config *abapEnvironmentAssemblePackagesOptions, telemetryData *telemetry.CustomData, com abaputils.Communication, utils piperutils.FileUtils, client abapbuild.HTTPSendLoader, cpe *abapEnvironmentAssemblePackagesCommonPipelineEnvironment) error { - connBuild := new(abapbuild.Connector) - if errConBuild := initAssemblePackagesConnection(connBuild, config, com, client); errConBuild != nil { - return errConBuild - } +func runAbapEnvironmentAssemblePackages(config *abapEnvironmentAssemblePackagesOptions, com abaputils.Communication, utils piperutils.FileUtils, client abapbuild.HTTPSendLoader, cpe *abapEnvironmentAssemblePackagesCommonPipelineEnvironment) error { + log.Entry().Info("╔═════════════════════════════════╗") + log.Entry().Info("║ abapEnvironmentAssemblePackages ║") + log.Entry().Info("╚═════════════════════════════════╝") addonDescriptor := new(abaputils.AddonDescriptor) if err := addonDescriptor.InitFromJSONstring(config.AddonDescriptor); err != nil { return errors.Wrap(err, "Reading AddonDescriptor failed [Make sure abapAddonAssemblyKit...CheckCVs|CheckPV|ReserveNextPackages steps have been run before]") } + builds, assembleError := runAssemblePackages(config, com, utils, client, addonDescriptor) + if assembleError != nil && builds != nil { + addonDescriptor.ErrorText = assembleError.Error() + log.Entry().Info("---------------------------------") + log.Entry().Error("During the Assembly errors occured on following levels:") + for _, build := range builds { + var errorText string + if build.repo.ErrorText == "" { + errorText = "" + } else { + errorText = build.repo.ErrorText + } + log.Entry().Errorf("Software Component %s: %s", build.repo.Name, errorText) + } + log.Entry().Errorf("Product %s: %s", addonDescriptor.AddonProduct, addonDescriptor.ErrorText) + } + + var reposBackToCPE []abaputils.Repository + for _, b := range builds { + reposBackToCPE = append(reposBackToCPE, b.repo) + } + addonDescriptor.SetRepositories(reposBackToCPE) + cpe.abap.addonDescriptor = addonDescriptor.AsJSONstring() + + return assembleError +} + +func runAssemblePackages(config *abapEnvironmentAssemblePackagesOptions, com abaputils.Communication, utils piperutils.FileUtils, client abapbuild.HTTPSendLoader, addonDescriptor *abaputils.AddonDescriptor) ([]buildWithRepository, error) { + connBuild := new(abapbuild.Connector) + if errConBuild := initAssemblePackagesConnection(connBuild, config, com, client); errConBuild != nil { + return nil, errConBuild + } + builds, err := executeBuilds(addonDescriptor, *connBuild, time.Duration(config.MaxRuntimeInMinutes)*time.Minute, time.Duration(config.PollIntervalsInMilliseconds)*time.Millisecond) if err != nil { - return errors.Wrap(err, "Starting Builds for Repositories with reserved AAKaaS packages failed") + return builds, errors.Wrap(err, "Starting Builds for Repositories with reserved AAKaaS packages failed") } - err = checkIfFailedAndPrintLogs(builds) - if err != nil { - return errors.Wrap(err, "Checking for failed Builds and Printing Build Logs failed") + if err := checkIfFailedAndPrintLogs(builds); err != nil { + return builds, errors.Wrap(err, "Checking for failed Builds and Printing Build Logs failed") } - _, err = downloadResultToFile(builds, "SAR_XML", false) //File is present in ABAP build system and uploaded to AAKaaS, no need to fill up jenkins with it - if err != nil { - return errors.Wrap(err, "Download of Build Artifact SAR_XML failed") + if _, err := downloadResultToFile(builds, "SAR_XML", false); err != nil { + return builds, errors.Wrap(err, "Download of Build Artifact SAR_XML failed") } var filesToPublish []piperutils.Path filesToPublish, err = downloadResultToFile(builds, "DELIVERY_LOGS.ZIP", true) if err != nil { - return errors.Wrap(err, "Download of Build Artifact DELIVERY_LOGS.ZIP failed") + return builds, errors.Wrap(err, "Download of Build Artifact DELIVERY_LOGS.ZIP failed") } log.Entry().Infof("Publishing %v files", len(filesToPublish)) piperutils.PersistReportsAndLinks("abapEnvironmentAssemblePackages", "", utils, filesToPublish, nil) - var reposBackToCPE []abaputils.Repository - for _, b := range builds { - reposBackToCPE = append(reposBackToCPE, b.repo) - } - addonDescriptor.SetRepositories(reposBackToCPE) - cpe.abap.addonDescriptor = addonDescriptor.AsJSONstring() - - return nil + return builds, nil } func executeBuilds(addonDescriptor *abaputils.AddonDescriptor, conn abapbuild.Connector, maxRuntimeInMinutes time.Duration, pollInterval time.Duration) ([]buildWithRepository, error) { @@ -101,6 +128,7 @@ func executeBuilds(addonDescriptor *abaputils.AddonDescriptor, conn abapbuild.Co err := buildRepo.start(addonDescriptor) if err != nil { buildRepo.build.RunState = abapbuild.Failed + buildRepo.repo.ErrorText = fmt.Sprint(err) log.Entry().Error(err) log.Entry().Info("Continueing with other builds (if any)") } else { @@ -108,6 +136,7 @@ func executeBuilds(addonDescriptor *abaputils.AddonDescriptor, conn abapbuild.Co if err != nil { buildRepo.build.RunState = abapbuild.Failed log.Entry().Error(err) + buildRepo.repo.ErrorText = fmt.Sprint(err) log.Entry().Error("Continuing with other builds (if any) but keep in Mind that even if this build finishes beyond timeout the result is not trustworthy due to possible side effects!") } } @@ -256,7 +285,14 @@ func checkIfFailedAndPrintLogs(builds []buildWithRepository) error { if err := builds[i].build.PrintLogs(); err != nil { return err } + cause, err := builds[i].build.DetermineFailureCause() + if err != nil { + return err + } else if cause != "" { + builds[i].repo.ErrorText = cause + } } + } if buildFailed { return errors.New("At least the assembly of one package failed") diff --git a/cmd/abapEnvironmentAssemblePackages_test.go b/cmd/abapEnvironmentAssemblePackages_test.go index c7692d6dc2..cfc72483e2 100644 --- a/cmd/abapEnvironmentAssemblePackages_test.go +++ b/cmd/abapEnvironmentAssemblePackages_test.go @@ -95,7 +95,7 @@ func TestStep(t *testing.T) { PollIntervalsInMilliseconds: 1, } - err := runAbapEnvironmentAssemblePackages(config, nil, autils, &mock.FilesMock{}, &client, cpe) + err := runAbapEnvironmentAssemblePackages(config, autils, &mock.FilesMock{}, &client, cpe) assert.NoError(t, err) assert.NotContains(t, cpe.abap.addonDescriptor, `"InBuildScope"`) }) @@ -106,7 +106,7 @@ func TestStep(t *testing.T) { PollIntervalsInMilliseconds: 1, } - err := runAbapEnvironmentAssemblePackages(config, nil, autils, &mock.FilesMock{}, &client, cpe) + err := runAbapEnvironmentAssemblePackages(config, autils, &mock.FilesMock{}, &client, cpe) assert.NoError(t, err) assert.Contains(t, cpe.abap.addonDescriptor, `SAPK-001AAINITAPC1.SAR`) assert.Contains(t, cpe.abap.addonDescriptor, `"InBuildScope":true`) diff --git a/cmd/abapEnvironmentBuild.go b/cmd/abapEnvironmentBuild.go index 7791a971bc..aa25dc63c9 100644 --- a/cmd/abapEnvironmentBuild.go +++ b/cmd/abapEnvironmentBuild.go @@ -94,12 +94,15 @@ func newAbapEnvironmentBuildUtils(maxRuntime time.Duration, pollingInterval time func abapEnvironmentBuild(config abapEnvironmentBuildOptions, telemetryData *telemetry.CustomData, cpe *abapEnvironmentBuildCommonPipelineEnvironment) { utils := newAbapEnvironmentBuildUtils(time.Duration(config.MaxRuntimeInMinutes), time.Duration(config.PollingIntervalInSeconds)) - if err := runAbapEnvironmentBuild(&config, telemetryData, utils, cpe); err != nil { + telemetryData.BuildTool = "ABAP Build Framework" + + if err := runAbapEnvironmentBuild(&config, utils, cpe); err != nil { + telemetryData.ErrorCode = err.Error() log.Entry().WithError(err).Fatal("step execution failed") } } -func runAbapEnvironmentBuild(config *abapEnvironmentBuildOptions, telemetryData *telemetry.CustomData, utils abapEnvironmentBuildUtils, cpe *abapEnvironmentBuildCommonPipelineEnvironment) error { +func runAbapEnvironmentBuild(config *abapEnvironmentBuildOptions, utils abapEnvironmentBuildUtils, cpe *abapEnvironmentBuildCommonPipelineEnvironment) error { log.Entry().Info("╔════════════════════════════════╗") log.Entry().Info("║ abapEnvironmentBuild ║") diff --git a/cmd/abapEnvironmentBuild_test.go b/cmd/abapEnvironmentBuild_test.go index cd969e2bcd..e0af9ef40a 100644 --- a/cmd/abapEnvironmentBuild_test.go +++ b/cmd/abapEnvironmentBuild_test.go @@ -76,7 +76,7 @@ func TestRunAbapEnvironmentBuild(t *testing.T) { config.PublishAllDownloadedResultFiles = true utils := newAbapEnvironmentBuildTestsUtils() // test - err := runAbapEnvironmentBuild(&config, nil, utils, &cpe) + err := runAbapEnvironmentBuild(&config, utils, &cpe) // assert finalValues := `[{"value_id":"PHASE","value":"AUNIT"},{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"},{"value_id":"MyId1","value":"AunitValue1"},{"value_id":"MyId2","value":"AunitValue2"},{"value_id":"BUILD_FRAMEWORK_MODE","value":"P"}]` assert.NoError(t, err) @@ -93,7 +93,7 @@ func TestRunAbapEnvironmentBuild(t *testing.T) { config.AbapSourceClient = "001" utils := newAbapEnvironmentBuildTestsUtilsWithClient() // test - err := runAbapEnvironmentBuild(&config, nil, utils, &cpe) + err := runAbapEnvironmentBuild(&config, utils, &cpe) // assert finalValues := `[{"value_id":"PHASE","value":"AUNIT"},{"value_id":"SUN","value":"SUMMER"}]` assert.NoError(t, err) @@ -111,7 +111,7 @@ func TestRunAbapEnvironmentBuild(t *testing.T) { config.PublishResultFilenames = []string{"SAR_XML"} utils := newAbapEnvironmentBuildTestsUtils() // test - err := runAbapEnvironmentBuild(&config, nil, utils, &cpe) + err := runAbapEnvironmentBuild(&config, utils, &cpe) // assert assert.NoError(t, err) }) @@ -130,7 +130,7 @@ func TestRunAbapEnvironmentBuild(t *testing.T) { config.UseFieldsOfAddonDescriptor = `[{"use":"Name","renameTo":"MyId1"},{"use":"Status","renameTo":"MyId2"}]` utils := newAbapEnvironmentBuildTestsUtils() // test - err := runAbapEnvironmentBuild(&config, nil, utils, &cpe) + err := runAbapEnvironmentBuild(&config, utils, &cpe) // assert finalValues := `[{"value_id":"PACKAGES","value":"/BUILD/AUNIT_DUMMY_TESTS"}]` err = json.Unmarshal([]byte(finalValues), &expectedValueList) @@ -152,7 +152,7 @@ func TestRunAbapEnvironmentBuild(t *testing.T) { config.PublishResultFilenames = []string{"SAR_XML"} utils := newAbapEnvironmentBuildTestsUtils() // test - err := runAbapEnvironmentBuild(&config, nil, utils, &cpe) + err := runAbapEnvironmentBuild(&config, utils, &cpe) // assert assert.Error(t, err) }) @@ -168,7 +168,7 @@ func TestRunAbapEnvironmentBuild(t *testing.T) { config.PublishAllDownloadedResultFiles = true utils := newAbapEnvironmentBuildTestsUtils() // test - err := runAbapEnvironmentBuild(&config, nil, utils, &cpe) + err := runAbapEnvironmentBuild(&config, utils, &cpe) // assert assert.Error(t, err) }) diff --git a/pkg/abap/build/bfw.go b/pkg/abap/build/bfw.go index 335dc9ddee..56801927d8 100644 --- a/pkg/abap/build/bfw.go +++ b/pkg/abap/build/bfw.go @@ -26,21 +26,19 @@ const ( warning resultState = "WARNING" erroneous resultState = "ERRONEOUS" aborted resultState = "ABORTED" - // Initializing : Build Framework prepared - Initializing RunState = "INITIALIZING" - // Accepted : Build Framework triggered - Accepted RunState = "ACCEPTED" - // Running : Build Framework performs build - Running RunState = "RUNNING" - // Finished : Build Framework ended successful - Finished RunState = "FINISHED" - // Failed : Build Framework endded with error - Failed RunState = "FAILED" - loginfo msgty = "I" - logwarning msgty = "W" - logerror msgty = "E" - logaborted msgty = "A" - dummyResultName string = "Dummy" + + Initializing RunState = "INITIALIZING" // Initializing : Build Framework prepared + Accepted RunState = "ACCEPTED" // Accepted : Build Framework triggered + Running RunState = "RUNNING" // Running : Build Framework performs build + Finished RunState = "FINISHED" // Finished : Build Framework ended successful + Failed RunState = "FAILED" // Failed : Build Framework endded with error + + loginfo msgty = "I" + logwarning msgty = "W" + logerror msgty = "E" + logaborted msgty = "A" + + dummyResultName string = "Dummy" ) // ******** structs needed for json convertion ******** @@ -316,6 +314,33 @@ func (b *Build) PrintLogs() error { return nil } +func (b *Build) DetermineFailureCause() (string, error) { + if err := b.getTasks(); err != nil { + return "", err + } + //The errors of the last executed task should contain some hints about the cause of the failure + lastTaskIndex := len(b.Tasks) - 1 + if lastTaskIndex < 0 { + return "", errors.New("No Tasks to evaluate") + } + failedTask := b.Tasks[lastTaskIndex] + if err := failedTask.getLogs(); err != nil { + return "", err + } + return failedTask.determineFailureCause(), nil +} + +func (t *task) determineFailureCause() string { + var cause strings.Builder + for _, logLine := range t.Logs { + if logLine.Msgty == logaborted || logLine.Msgty == logerror { + cause.WriteString(logLine.Logline + "\n") + } + } + causeString := cause.String() + return causeString +} + // GetResults : Gets all Build results func (b *Build) GetResults() error { if err := b.getTasks(); err != nil { diff --git a/pkg/abaputils/descriptor.go b/pkg/abaputils/descriptor.go index e2add90192..e63e9c2196 100644 --- a/pkg/abaputils/descriptor.go +++ b/pkg/abaputils/descriptor.go @@ -32,6 +32,7 @@ type AddonDescriptor struct { AddonPatchLevel string TargetVectorID string `json:",omitempty"` Repositories []Repository `json:"repositories"` + ErrorText string `json:",omitempty"` } // Repository contains fields for the repository/component version @@ -54,6 +55,7 @@ type Repository struct { SarXMLFilePath string `json:",omitempty"` Languages []string `json:"languages,omitempty"` InBuildScope bool `json:",omitempty"` + ErrorText string `json:",omitempty"` } // ReadAddonDescriptorType is the type for ReadAddonDescriptor for mocking