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 
			
		
		
		
	abapEnvironmentAssemblePackages store file in workspace instead of cpe (#3232)
* initial refac * fix unit test, no publish * fix typo
This commit is contained in:
		| @@ -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 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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{ | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user