1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-01-18 05:18:24 +02:00

abapEnvironmentAssemblePackages store file in workspace instead of cpe (#3232)

* initial refac

* fix unit test, no publish

* fix typo
This commit is contained in:
tiloKo 2021-11-02 11:00:01 +01:00 committed by GitHub
parent 3ee4339af1
commit 9464b345d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 86 additions and 49 deletions

View File

@ -33,27 +33,33 @@ func abapAddonAssemblyKitRegisterPackages(config abapAddonAssemblyKitRegisterPac
func runAbapAddonAssemblyKitRegisterPackages(config *abapAddonAssemblyKitRegisterPackagesOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender,
cpe *abapAddonAssemblyKitRegisterPackagesCommonPipelineEnvironment, fileReader readFile) error {
var addonDescriptor abaputils.AddonDescriptor
json.Unmarshal([]byte(config.AddonDescriptor), &addonDescriptor)
conn := new(abapbuild.Connector)
conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client)
err := uploadSarFiles(addonDescriptor.Repositories, *conn, fileReader)
if err != nil {
if err := conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client); err != nil {
return err
}
// we need a second connector without the added Header
conn2 := new(abapbuild.Connector)
conn2.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client)
if err := uploadSarFiles(addonDescriptor.Repositories, *conn, fileReader); err != nil {
return err
}
conn2 := new(abapbuild.Connector) // we need a second connector without the added Header
if err := conn2.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client); err != nil {
return err
}
var err error
addonDescriptor.Repositories, err = registerPackages(addonDescriptor.Repositories, *conn2)
if err != nil {
return err
}
log.Entry().Info("Writing package status to CommonPipelineEnvironment")
backToCPE, _ := json.Marshal(addonDescriptor)
cpe.abap.addonDescriptor = string(backToCPE)
cpe.abap.addonDescriptor = addonDescriptor.AsJSONstring()
return nil
}

View File

@ -22,6 +22,8 @@ func mockReader(path string) ([]byte, error) {
func TestRegisterPackagesStep(t *testing.T) {
var config abapAddonAssemblyKitRegisterPackagesOptions
config.Username = "dummy"
config.Password = "dummy"
var cpe abapAddonAssemblyKitRegisterPackagesCommonPipelineEnvironment
t.Run("step success", func(t *testing.T) {
client := &abaputils.ClientMock{

View File

@ -1,7 +1,6 @@
package cmd
import (
"encoding/json"
"path"
"path/filepath"
"time"
@ -40,33 +39,17 @@ func abapEnvironmentAssemblePackages(config abapEnvironmentAssemblePackagesOptio
}
func runAbapEnvironmentAssemblePackages(config *abapEnvironmentAssemblePackagesOptions, telemetryData *telemetry.CustomData, com abaputils.Communication, client abapbuild.HTTPSendLoader, cpe *abapEnvironmentAssemblePackagesCommonPipelineEnvironment) error {
conn := new(abapbuild.Connector)
var connConfig abapbuild.ConnectorConfiguration
connConfig.CfAPIEndpoint = config.CfAPIEndpoint
connConfig.CfOrg = config.CfOrg
connConfig.CfSpace = config.CfSpace
connConfig.CfServiceInstance = config.CfServiceInstance
connConfig.CfServiceKeyName = config.CfServiceKeyName
connConfig.Host = config.Host
connConfig.Username = config.Username
connConfig.Password = config.Password
connConfig.AddonDescriptor = config.AddonDescriptor
connConfig.MaxRuntimeInMinutes = config.MaxRuntimeInMinutes
err := conn.InitBuildFramework(connConfig, com, client)
if err != nil {
return errors.Wrap(err, "Connector initialization for communication with the ABAP system failed")
connBuild := new(abapbuild.Connector)
if errConBuild := initAssemblePackagesConnection(connBuild, config, com, client); errConBuild != nil {
return errConBuild
}
var addonDescriptor abaputils.AddonDescriptor
err = json.Unmarshal([]byte(config.AddonDescriptor), &addonDescriptor)
if err != nil {
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]")
}
maxRuntimeInMinutes := time.Duration(config.MaxRuntimeInMinutes) * time.Minute
pollInterval := time.Duration(config.PollIntervalsInMilliseconds) * time.Millisecond
builds, err := executeBuilds(addonDescriptor.Repositories, *conn, maxRuntimeInMinutes, pollInterval)
builds, err := executeBuilds(addonDescriptor.Repositories, *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")
}
@ -76,28 +59,26 @@ func runAbapEnvironmentAssemblePackages(config *abapEnvironmentAssemblePackagesO
return errors.Wrap(err, "Checking for failed Builds and Printing Build Logs failed")
}
var filesToPublish []piperutils.Path
filesToPublish, err = downloadResultToFile(builds, "SAR_XML", filesToPublish)
_, 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")
}
filesToPublish, err = downloadResultToFile(builds, "DELIVERY_LOGS.ZIP", filesToPublish)
var filesToPublish []piperutils.Path
filesToPublish, err = downloadResultToFile(builds, "DELIVERY_LOGS.ZIP", true)
if err != nil {
//changed result storage with 2105, thus ignore errors for now
log.Entry().Error(errors.Wrap(err, "Download of Build Artifact DELIVERY_LOGS.ZIP failed"))
return errors.Wrap(err, "Download of Build Artifact DELIVERY_LOGS.ZIP failed")
}
log.Entry().Infof("Publsihing %v files", len(filesToPublish))
log.Entry().Infof("Publishing %v files", len(filesToPublish))
piperutils.PersistReportsAndLinks("abapEnvironmentAssemblePackages", "", filesToPublish, nil)
var reposBackToCPE []abaputils.Repository
for _, b := range builds {
reposBackToCPE = append(reposBackToCPE, b.repo)
}
addonDescriptor.Repositories = reposBackToCPE
backToCPE, _ := json.Marshal(addonDescriptor)
cpe.abap.addonDescriptor = string(backToCPE)
addonDescriptor.SetRepositories(reposBackToCPE)
cpe.abap.addonDescriptor = addonDescriptor.AsJSONstring()
return nil
}
@ -205,8 +186,9 @@ func (br *buildWithRepository) start() error {
return br.build.Start(phase, valuesInput)
}
func downloadResultToFile(builds []buildWithRepository, resultName string, filesToPublish []piperutils.Path) ([]piperutils.Path, error) {
envPath := filepath.Join(GeneralConfig.EnvRootPath, "commonPipelineEnvironment", "abap")
func downloadResultToFile(builds []buildWithRepository, resultName string, publish bool) ([]piperutils.Path, error) {
envPath := filepath.Join(GeneralConfig.EnvRootPath, "abapBuild")
var filesToPublish []piperutils.Path
for i, b := range builds {
if b.repo.Status != "P" {
@ -231,9 +213,10 @@ func downloadResultToFile(builds []buildWithRepository, resultName string, files
if resultName == "SAR_XML" {
builds[i].repo.SarXMLFilePath = downloadPath
}
log.Entry().Infof("Add %s to be published", resultName)
filesToPublish = append(filesToPublish, piperutils.Path{Target: downloadPath, Name: resultName, Mandatory: true})
if publish {
log.Entry().Infof("Add %s to be published", resultName)
filesToPublish = append(filesToPublish, piperutils.Path{Target: downloadPath, Name: resultName, Mandatory: true})
}
}
return filesToPublish, nil
}
@ -252,3 +235,24 @@ func checkIfFailedAndPrintLogs(builds []buildWithRepository) error {
}
return nil
}
func initAssemblePackagesConnection(conn *abapbuild.Connector, config *abapEnvironmentAssemblePackagesOptions, com abaputils.Communication, client abapbuild.HTTPSendLoader) error {
var connConfig abapbuild.ConnectorConfiguration
connConfig.CfAPIEndpoint = config.CfAPIEndpoint
connConfig.CfOrg = config.CfOrg
connConfig.CfSpace = config.CfSpace
connConfig.CfServiceInstance = config.CfServiceInstance
connConfig.CfServiceKeyName = config.CfServiceKeyName
connConfig.Host = config.Host
connConfig.Username = config.Username
connConfig.Password = config.Password
connConfig.AddonDescriptor = config.AddonDescriptor
connConfig.MaxRuntimeInMinutes = config.MaxRuntimeInMinutes
err := conn.InitBuildFramework(connConfig, com, client)
if err != nil {
return errors.Wrap(err, "Connector initialization for communication with the ABAP system failed")
}
return nil
}

View File

@ -114,7 +114,7 @@ func (conn Connector) Download(appendum string, downloadPath string) error {
}
// InitAAKaaS : initialize Connector for communication with AAKaaS backend
func (conn *Connector) InitAAKaaS(aAKaaSEndpoint string, username string, password string, inputclient piperhttp.Sender) {
func (conn *Connector) InitAAKaaS(aAKaaSEndpoint string, username string, password string, inputclient piperhttp.Sender) error {
conn.Client = inputclient
conn.Header = make(map[string][]string)
conn.Header["Accept"] = []string{"application/json"}
@ -128,6 +128,12 @@ func (conn *Connector) InitAAKaaS(aAKaaSEndpoint string, username string, passwo
CookieJar: cookieJar,
})
conn.Baseurl = aAKaaSEndpoint
if username == "" || password == "" {
return errors.New("username/password for AAKaaS must not be initial") //leads to redirect to login page which causes HTTP200 instead of HTTP401 and thus side effects
} else {
return nil
}
}
// InitBuildFramework : initialize Connector for communication with ABAP SCP instance
@ -211,9 +217,13 @@ func (conn Connector) UploadSarFileInChunks(appendum string, fileName string, sa
response, err := conn.Client.SendRequest("POST", url, nextChunk, header, nil)
if err != nil {
errorbody, _ := ioutil.ReadAll(response.Body)
response.Body.Close()
return errors.Wrapf(err, "Upload of SAR file failed: %v", string(errorbody))
if response != nil && response.Body != nil {
errorbody, _ := ioutil.ReadAll(response.Body)
response.Body.Close()
return errors.Wrapf(err, "Upload of SAR file failed: %v", string(errorbody))
} else {
return err
}
}
response.Body.Close()

View File

@ -323,6 +323,11 @@ func (c *ClientMock) SendRequest(method, url string, bdy io.Reader, hdr http.Hea
}, c.Error
}
// DownloadFile : Empty file download
func (c *ClientMock) DownloadFile(url, filename string, header http.Header, cookies []*http.Cookie) error {
return nil
}
// AUtilsMock mock
type AUtilsMock struct {
ReturnedConnectionDetailsHTTP ConnectionDetailsHTTP

View File

@ -137,6 +137,11 @@ func (me *AddonDescriptor) initFromJSON(JSON []byte) error {
return json.Unmarshal(JSON, me)
}
// initFromJSON : Init from json string
func (me *AddonDescriptor) InitFromJSONstring(JSONstring string) error {
return me.initFromJSON([]byte(JSONstring))
}
// AsJSON : dito
func (me *AddonDescriptor) AsJSON() []byte {
//hopefully no errors should happen here or they are covered by the users unit tests
@ -144,6 +149,11 @@ func (me *AddonDescriptor) AsJSON() []byte {
return jsonBytes
}
// AsJSONstring : dito
func (me *AddonDescriptor) AsJSONstring() string {
return string(me.AsJSON())
}
// SetRepositories : dito
func (me *AddonDescriptor) SetRepositories(Repositories []Repository) {
me.Repositories = Repositories