1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-10-30 23:57:50 +02:00

New Configuration Parameters for gCTS steps (#4214)

* Adding new query configuration parameter for gCTS Piper steps

* Add skipSSLVerification parameter to gCTSExecuteQualityChecks

* Add skipSSLVerification to gCTSDeploy

* Add SkipSSLVerification for pull by commit

* Add SkipSSLVerification to rollback

* Add SkipSSLVerification parameter to rollback

* Handling maximum number of charachter for the queryParameter

* Remove extra new lines in yaml files

* Add new line yaml files
This commit is contained in:
Rinita Asani
2023-02-14 11:38:46 +01:00
committed by GitHub
parent d7e0bfe4f9
commit eecddf689c
17 changed files with 558 additions and 89 deletions

View File

@@ -47,6 +47,12 @@ func cloneRepository(config *gctsCloneRepositoryOptions, telemetryData *telemetr
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/clone?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return urlErr
}
resp, httpErr := httpClient.SendRequest("POST", url, nil, header, nil)
defer func() {

View File

@@ -16,11 +16,13 @@ import (
)
type gctsCloneRepositoryOptions struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Repository string `json:"repository,omitempty"`
Host string `json:"host,omitempty"`
Client string `json:"client,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Repository string `json:"repository,omitempty"`
Host string `json:"host,omitempty"`
Client string `json:"client,omitempty"`
QueryParameters map[string]interface{} `json:"queryParameters,omitempty"`
SkipSSLVerification bool `json:"skipSSLVerification,omitempty"`
}
// GctsCloneRepositoryCommand Clones a Git repository
@@ -124,6 +126,8 @@ func addGctsCloneRepositoryFlags(cmd *cobra.Command, stepConfig *gctsCloneReposi
cmd.Flags().StringVar(&stepConfig.Host, "host", os.Getenv("PIPER_host"), "Specifies the protocol and host address, including the port. Please provide in the format `<protocol>://<host>:<port>`. Supported protocols are `http` and `https`.")
cmd.Flags().StringVar(&stepConfig.Client, "client", os.Getenv("PIPER_client"), "Specifies the client of the ABAP system to be addressed")
cmd.Flags().BoolVar(&stepConfig.SkipSSLVerification, "skipSSLVerification", false, "You can skip the SSL (Secure Socket Layer) verification for the http client")
cmd.MarkFlagRequired("username")
cmd.MarkFlagRequired("password")
cmd.MarkFlagRequired("repository")
@@ -202,6 +206,23 @@ func gctsCloneRepositoryMetadata() config.StepData {
Aliases: []config.Alias{},
Default: os.Getenv("PIPER_client"),
},
{
Name: "queryParameters",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "map[string]interface{}",
Mandatory: false,
Aliases: []config.Alias{},
},
{
Name: "skipSSLVerification",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "bool",
Mandatory: false,
Aliases: []config.Alias{},
Default: false,
},
},
},
},

View File

@@ -84,6 +84,13 @@ func createRepository(config *gctsCreateRepositoryOptions, telemetryData *teleme
url := config.Host + "/sap/bc/cts_abapvcs/repository?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return urlErr
}
resp, httpErr := httpClient.SendRequest("POST", url, bytes.NewBuffer(jsonBody), header, nil)
defer func() {

View File

@@ -16,15 +16,17 @@ import (
)
type gctsCreateRepositoryOptions struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Repository string `json:"repository,omitempty"`
Host string `json:"host,omitempty"`
Client string `json:"client,omitempty"`
RemoteRepositoryURL string `json:"remoteRepositoryURL,omitempty"`
Role string `json:"role,omitempty" validate:"possible-values=SOURCE TARGET"`
VSID string `json:"vSID,omitempty"`
Type string `json:"type,omitempty" validate:"possible-values=GIT"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Repository string `json:"repository,omitempty"`
Host string `json:"host,omitempty"`
Client string `json:"client,omitempty"`
RemoteRepositoryURL string `json:"remoteRepositoryURL,omitempty"`
Role string `json:"role,omitempty" validate:"possible-values=SOURCE TARGET"`
VSID string `json:"vSID,omitempty"`
Type string `json:"type,omitempty" validate:"possible-values=GIT"`
QueryParameters map[string]interface{} `json:"queryParameters,omitempty"`
SkipSSLVerification bool `json:"skipSSLVerification,omitempty"`
}
// GctsCreateRepositoryCommand Creates a Git repository on an ABAP system
@@ -132,6 +134,8 @@ func addGctsCreateRepositoryFlags(cmd *cobra.Command, stepConfig *gctsCreateRepo
cmd.Flags().StringVar(&stepConfig.VSID, "vSID", os.Getenv("PIPER_vSID"), "Virtual SID of the local repository. The vSID corresponds to the transport route that delivers content to the remote Git repository")
cmd.Flags().StringVar(&stepConfig.Type, "type", `GIT`, "Type of the used source code management tool")
cmd.Flags().BoolVar(&stepConfig.SkipSSLVerification, "skipSSLVerification", false, "You can skip the SSL (Secure Socket Layer) verification for the http client")
cmd.MarkFlagRequired("username")
cmd.MarkFlagRequired("password")
cmd.MarkFlagRequired("repository")
@@ -246,6 +250,23 @@ func gctsCreateRepositoryMetadata() config.StepData {
Aliases: []config.Alias{},
Default: `GIT`,
},
{
Name: "queryParameters",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "map[string]interface{}",
Mandatory: false,
Aliases: []config.Alias{},
},
{
Name: "skipSSLVerification",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "bool",
Mandatory: false,
Aliases: []config.Alias{},
Default: false,
},
},
},
},

View File

@@ -49,10 +49,11 @@ func gctsDeployRepository(config *gctsDeployOptions, telemetryData *telemetry.Cu
return errors.Wrap(cookieErr, "creating a cookie jar failed")
}
clientOptions := piperhttp.ClientOptions{
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: maxRetries,
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: maxRetries,
TransportSkipVerification: config.SkipSSLVerification,
}
httpClient.SetOptions(clientOptions)
log.Entry().Infof("Start of gCTS Deploy Step with Configuration Values: %v", config)
@@ -73,6 +74,8 @@ func gctsDeployRepository(config *gctsDeployOptions, telemetryData *telemetry.Cu
Role: config.Role,
VSID: config.VSID,
Type: config.Type,
QueryParameters: config.QueryParameters,
SkipSSLVerification: config.SkipSSLVerification,
}
log.Entry().Infof("gCTS Deploy : Checking if repository %v already exists", config.Repository)
repoMetadataInitState, getRepositoryErr := getRepository(config, httpClient)
@@ -97,11 +100,13 @@ func gctsDeployRepository(config *gctsDeployOptions, telemetryData *telemetry.Cu
}
cloneRepoOptions := gctsCloneRepositoryOptions{
Username: config.Username,
Password: config.Password,
Repository: config.Repository,
Host: config.Host,
Client: config.Client,
Username: config.Username,
Password: config.Password,
Repository: config.Repository,
Host: config.Host,
Client: config.Client,
QueryParameters: config.QueryParameters,
SkipSSLVerification: config.SkipSSLVerification,
}
// No Import has to be set when there is a commit or branch parameter set
// This is required so that during the clone of the repo it is not imported into the system
@@ -236,11 +241,12 @@ func pullByCommitWithRollback(config *gctsDeployOptions, telemetryData *telemetr
if config.Rollback {
//Rollback to last commit.
rollbackOptions := gctsRollbackOptions{
Username: config.Username,
Password: config.Password,
Repository: config.Repository,
Host: config.Host,
Client: config.Client,
Username: config.Username,
Password: config.Password,
Repository: config.Repository,
Host: config.Host,
Client: config.Client,
SkipSSLVerification: config.SkipSSLVerification,
}
rollbackErr := rollback(&rollbackOptions, telemetryData, command, httpClient)
if rollbackErr != nil {
@@ -308,6 +314,14 @@ func switchBranch(config *gctsDeployOptions, httpClient piperhttp.Sender, curren
requestURL := config.Host +
"/sap/bc/cts_abapvcs/repository/" + config.Repository + "/branches/" + currentBranch +
"/switch?branch=" + targetBranch + "&sap-client=" + config.Client
requestURL, urlErr := addQueryToURL(requestURL, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
resp, httpErr := httpClient.SendRequest("GET", requestURL, nil, nil, nil)
defer func() {
if resp != nil && resp.Body != nil {
@@ -340,6 +354,14 @@ func deployCommitToAbapSystem(config *gctsDeployOptions, httpClient piperhttp.Se
requestURL := config.Host +
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/deploy?sap-client=" + config.Client
requestURL, urlErr := addQueryToURL(requestURL, config.QueryParameters)
if urlErr != nil {
return urlErr
}
reqBody := deployRequestBody
jsonBody, marshalErr := json.Marshal(reqBody)
if marshalErr != nil {
@@ -377,6 +399,13 @@ func getRepository(config *gctsDeployOptions, httpClient piperhttp.Sender) (*get
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"?sap-client=" + config.Client
requestURL, urlErr := addQueryToURL(requestURL, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
resp, httpErr := httpClient.SendRequest("GET", requestURL, nil, nil, nil)
defer func() {
if resp != nil && resp.Body != nil {
@@ -407,6 +436,14 @@ func deleteConfigKey(deployConfig *gctsDeployOptions, httpClient piperhttp.Sende
requestURL := deployConfig.Host +
"/sap/bc/cts_abapvcs/repository/" + deployConfig.Repository +
"/config/" + configToDelete + "?sap-client=" + deployConfig.Client
requestURL, urlErr := addQueryToURL(requestURL, deployConfig.QueryParameters)
if urlErr != nil {
return urlErr
}
header := make(http.Header)
header.Set("Content-Type", "application/json")
header.Add("Accept", "application/json")
@@ -435,6 +472,13 @@ func setConfigKey(deployConfig *gctsDeployOptions, httpClient piperhttp.Sender,
"/sap/bc/cts_abapvcs/repository/" + deployConfig.Repository +
"/config?sap-client=" + deployConfig.Client
requestURL, urlErr := addQueryToURL(requestURL, deployConfig.QueryParameters)
if urlErr != nil {
return urlErr
}
reqBody := configToSet
jsonBody, marshalErr := json.Marshal(reqBody)
if marshalErr != nil {
@@ -470,10 +514,11 @@ func pullByCommit(config *gctsDeployOptions, telemetryData *telemetry.CustomData
return errors.Wrap(cookieErr, "creating a cookie jar failed")
}
clientOptions := piperhttp.ClientOptions{
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: -1,
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: -1,
TransportSkipVerification: config.SkipSSLVerification,
}
httpClient.SetOptions(clientOptions)
@@ -481,6 +526,13 @@ func pullByCommit(config *gctsDeployOptions, telemetryData *telemetry.CustomData
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/pullByCommit?sap-client=" + config.Client + "&request=" + config.Commit
requestURL, urlErr := addQueryToURL(requestURL, config.QueryParameters)
if urlErr != nil {
return urlErr
}
if config.Commit != "" {
log.Entry().Infof("preparing to deploy specified commit %v", config.Commit)
params := url.Values{}
@@ -531,10 +583,11 @@ func createRepositoryForDeploy(config *gctsCreateRepositoryOptions, telemetryDat
return errors.Wrapf(cookieErr, "creating repository on the ABAP system %v failed", config.Host)
}
clientOptions := piperhttp.ClientOptions{
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: -1,
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: -1,
TransportSkipVerification: config.SkipSSLVerification,
}
httpClient.SetOptions(clientOptions)
@@ -577,6 +630,13 @@ func createRepositoryForDeploy(config *gctsCreateRepositoryOptions, telemetryDat
url := config.Host + "/sap/bc/cts_abapvcs/repository?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return urlErr
}
resp, httpErr := httpClient.SendRequest("POST", url, bytes.NewBuffer(jsonBody), header, nil)
defer func() {
@@ -618,6 +678,13 @@ func getConfigurationMetadata(config *gctsDeployOptions, httpClient piperhttp.Se
requestURL := config.Host +
"/sap/bc/cts_abapvcs/config?sap-client=" + config.Client
requestURL, urlErr := addQueryToURL(requestURL, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
resp, httpErr := httpClient.SendRequest("GET", requestURL, nil, nil, nil)
defer func() {
if resp != nil && resp.Body != nil {
@@ -705,6 +772,39 @@ func parseErrorDumpFromResponseBody(responseBody *http.Response) (*errorLogBody,
return &errorDump, nil
}
func addQueryToURL(requestURL string, keyValue map[string]interface{}) (string, error) {
var formattedURL string
formattedURL = requestURL
if keyValue != nil {
if strings.Contains(requestURL, "?") {
for key, value := range keyValue {
configValue := fmt.Sprint(value)
formattedURL = formattedURL + "&" + key + "=" + configValue
}
} else {
i := 0
for key, value := range keyValue {
configValue := fmt.Sprint(value)
if i == 0 {
formattedURL = requestURL + "?" + key + "=" + configValue
} else {
formattedURL = formattedURL + "&" + key + "=" + configValue
}
i++
}
}
}
if strings.Count(formattedURL, "") > 2001 {
log.Entry().Error("Url endpoint is longer than 2000 characters!")
return formattedURL, errors.New("Url endpoint is longer than 2000 characters!")
}
return formattedURL, nil
}
type repositoryConfiguration struct {
Key string `json:"key"`
Value string `json:"value"`

View File

@@ -30,6 +30,8 @@ type gctsDeployOptions struct {
Scope string `json:"scope,omitempty"`
Rollback bool `json:"rollback,omitempty"`
Configuration map[string]interface{} `json:"configuration,omitempty"`
QueryParameters map[string]interface{} `json:"queryParameters,omitempty"`
SkipSSLVerification bool `json:"skipSSLVerification,omitempty"`
}
// GctsDeployCommand Deploys a Git Repository to a local Repository and then to an ABAP System
@@ -145,6 +147,8 @@ func addGctsDeployFlags(cmd *cobra.Command, stepConfig *gctsDeployOptions) {
cmd.Flags().StringVar(&stepConfig.Scope, "scope", os.Getenv("PIPER_scope"), "Scope of objects to be deployed. Possible values are CRNTCOMMIT (current commit - Default) and LASTACTION (last repository action). The default option deploys all objects that existed in the repository when the commit was created. LASTACTION only deploys the object difference of the last action in the repository.")
cmd.Flags().BoolVar(&stepConfig.Rollback, "rollback", false, "Indication whether you want to roll back to the last working state of the repository, if any of the step actions *switch branch* or *pull commit* fail.")
cmd.Flags().BoolVar(&stepConfig.SkipSSLVerification, "skipSSLVerification", false, "You can skip the SSL (Secure Socket Layer) verification for the http client")
cmd.MarkFlagRequired("username")
cmd.MarkFlagRequired("password")
cmd.MarkFlagRequired("repository")
@@ -304,6 +308,23 @@ func gctsDeployMetadata() config.StepData {
Mandatory: false,
Aliases: []config.Alias{{Name: "gctsRepositoryConfigurations"}},
},
{
Name: "queryParameters",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "map[string]interface{}",
Mandatory: false,
Aliases: []config.Alias{},
},
{
Name: "skipSSLVerification",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "bool",
Mandatory: false,
Aliases: []config.Alias{},
Default: false,
},
},
},
},

View File

@@ -31,6 +31,7 @@ func gctsExecuteABAPQualityChecks(config gctsExecuteABAPQualityChecksOptions, te
c.Stderr(log.Writer())
httpClient := &piperhttp.Client{}
// error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end
err := rungctsExecuteABAPQualityChecks(&config, httpClient)
if err != nil {
@@ -61,10 +62,11 @@ func rungctsExecuteABAPQualityChecks(config *gctsExecuteABAPQualityChecksOptions
maxRetries := -1
clientOptions := piperhttp.ClientOptions{
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: maxRetries,
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: maxRetries,
TransportSkipVerification: config.SkipSSLVerification,
}
httpClient.SetOptions(clientOptions)
@@ -377,6 +379,13 @@ func getRepositoryObjects(config *gctsExecuteABAPQualityChecksOptions, client pi
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/objects?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
resp, httpErr := client.SendRequest("GET", url, nil, nil, nil)
defer func() {
@@ -426,6 +435,13 @@ func getPackages(config *gctsExecuteABAPQualityChecksOptions, client piperhttp.S
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/objects?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
resp, httpErr := client.SendRequest("GET", url, nil, nil, nil)
defer func() {
@@ -462,6 +478,13 @@ func discoverServer(config *gctsExecuteABAPQualityChecksOptions, client piperhtt
url := config.Host +
"/sap/bc/adt/core/discovery?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
header := make(http.Header)
header.Add("Accept", "application/atomsvc+xml")
header.Add("x-csrf-token", "fetch")
@@ -553,6 +576,13 @@ func runAUnitTest(config *gctsExecuteABAPQualityChecksOptions, client piperhttp.
url := config.Host +
"/sap/bc/adt/abapunit/testruns?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
discHeader, discError := discoverServer(config, client)
if discError != nil {
@@ -731,7 +761,7 @@ func executeATCCheck(config *gctsExecuteABAPQualityChecksOptions, client piperht
case "INTF":
innerXml = innerXml + `<adtcore:objectReference adtcore:uri="/sap/bc/adt/oo/interfaces/` + object.Object + `"/>`
case "DEVC":
innerXml = innerXml + `<adtcore:objectReference adtcore:uri="/sap/bc/adt/packages/` + object.Object + `"/>`
innerXml = innerXml + `<adtcore:objectReference adtcore:uri="/sap/bc/adt/repository/informationsystem/virtualfolders?selection=package%3a` + url.QueryEscape(object.Object) + `"/>`
case "FUGR":
innerXml = innerXml + `<adtcore:objectReference adtcore:uri="/sap/bc/adt/functions/groups/` + object.Object + `/source/main"/>`
case "TABL":
@@ -817,6 +847,13 @@ func startATCRun(config *gctsExecuteABAPQualityChecksOptions, client piperhttp.S
url := config.Host +
"/sap/bc/adt/atc/runs?worklistId=" + worklistID + "&sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return urlErr
}
resp, httpErr := client.SendRequest("POST", url, bytes.NewBuffer(xml), header, nil)
defer func() {
@@ -846,6 +883,13 @@ func getATCRun(config *gctsExecuteABAPQualityChecksOptions, client piperhttp.Sen
url := config.Host +
"/sap/bc/adt/atc/worklists/" + worklistID + "?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
header.Add("Accept", "application/atc.worklist.v1+xml")
resp, httpErr := client.SendRequest("GET", url, nil, header, nil)
@@ -866,6 +910,13 @@ func getWorklist(config *gctsExecuteABAPQualityChecksOptions, client piperhttp.S
"/sap/bc/adt/atc/worklists?checkVariant=" + config.AtcVariant + "&sap-client=" + config.Client
discHeader, discError := discoverServer(config, client)
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return worklistID, urlErr
}
if discError != nil {
return worklistID, errors.Wrap(discError, "get worklist failed")
}
@@ -1417,6 +1468,14 @@ func getRepo(config *gctsExecuteABAPQualityChecksOptions, client piperhttp.Sende
url := config.Host +
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return repositoryResp, urlErr
}
resp, httpErr := client.SendRequest("GET", url, nil, nil, nil)
defer func() {
if resp != nil && resp.Body != nil {
@@ -1446,6 +1505,13 @@ func getRepositoryLayout(config *gctsExecuteABAPQualityChecksOptions, client pip
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/layout?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return repoLayoutResponse, urlErr
}
resp, httpErr := client.SendRequest("GET", url, nil, nil, nil)
defer func() {
@@ -1475,6 +1541,12 @@ func getCommitList(config *gctsExecuteABAPQualityChecksOptions, client piperhttp
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/getCommit?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return commitResp, urlErr
}
resp, httpErr := client.SendRequest("GET", url, nil, nil, nil)
defer func() {
@@ -1504,6 +1576,13 @@ func getObjectDifference(config *gctsExecuteABAPQualityChecksOptions, fromCommit
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/compareCommits?fromCommit=" + fromCommit + "&toCommit=" + toCommit + "&sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return objectResponse, urlErr
}
resp, httpErr := client.SendRequest("GET", url, nil, nil, nil)
defer func() {
@@ -1533,6 +1612,13 @@ func getObjectInfo(config *gctsExecuteABAPQualityChecksOptions, client piperhttp
"/sap/bc/cts_abapvcs/objects/" + objectType + "/" + objectName +
"?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return objectMetInfoResponse, urlErr
}
resp, httpErr := client.SendRequest("GET", url, nil, nil, nil)
defer func() {
@@ -1561,6 +1647,13 @@ func getHistory(config *gctsExecuteABAPQualityChecksOptions, client piperhttp.Se
url := config.Host +
"/sap/bc/cts_abapvcs/repository/" + config.Repository + "/getHistory?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return historyResp, urlErr
}
resp, httpErr := client.SendRequest("GET", url, nil, nil, nil)
defer func() {

View File

@@ -16,19 +16,21 @@ import (
)
type gctsExecuteABAPQualityChecksOptions struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Host string `json:"host,omitempty"`
Repository string `json:"repository,omitempty"`
Client string `json:"client,omitempty"`
AUnitTest bool `json:"aUnitTest,omitempty"`
AtcCheck bool `json:"atcCheck,omitempty"`
AtcVariant string `json:"atcVariant,omitempty"`
Scope string `json:"scope,omitempty"`
Commit string `json:"commit,omitempty"`
Workspace string `json:"workspace,omitempty"`
AtcResultsFileName string `json:"atcResultsFileName,omitempty"`
AUnitResultsFileName string `json:"aUnitResultsFileName,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Host string `json:"host,omitempty"`
Repository string `json:"repository,omitempty"`
Client string `json:"client,omitempty"`
AUnitTest bool `json:"aUnitTest,omitempty"`
AtcCheck bool `json:"atcCheck,omitempty"`
AtcVariant string `json:"atcVariant,omitempty"`
Scope string `json:"scope,omitempty"`
Commit string `json:"commit,omitempty"`
Workspace string `json:"workspace,omitempty"`
AtcResultsFileName string `json:"atcResultsFileName,omitempty"`
AUnitResultsFileName string `json:"aUnitResultsFileName,omitempty"`
QueryParameters map[string]interface{} `json:"queryParameters,omitempty"`
SkipSSLVerification bool `json:"skipSSLVerification,omitempty"`
}
// GctsExecuteABAPQualityChecksCommand Runs ABAP unit tests and ATC (ABAP Test Cockpit) checks for a specified object scope.
@@ -147,6 +149,8 @@ func addGctsExecuteABAPQualityChecksFlags(cmd *cobra.Command, stepConfig *gctsEx
cmd.Flags().StringVar(&stepConfig.AtcResultsFileName, "atcResultsFileName", `ATCResults.xml`, "Specifies an output file name for the results of the ATC checks.")
cmd.Flags().StringVar(&stepConfig.AUnitResultsFileName, "aUnitResultsFileName", `AUnitResults.xml`, "Specifies an output file name for the results of the ABAP Unit tests.")
cmd.Flags().BoolVar(&stepConfig.SkipSSLVerification, "skipSSLVerification", false, "You can skip the SSL (Secure Socket Layer) verification for the http client")
cmd.MarkFlagRequired("username")
cmd.MarkFlagRequired("password")
cmd.MarkFlagRequired("host")
@@ -298,6 +302,23 @@ func gctsExecuteABAPQualityChecksMetadata() config.StepData {
Aliases: []config.Alias{},
Default: `AUnitResults.xml`,
},
{
Name: "queryParameters",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "map[string]interface{}",
Mandatory: false,
Aliases: []config.Alias{},
},
{
Name: "skipSSLVerification",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "bool",
Mandatory: false,
Aliases: []config.Alias{},
Default: false,
},
},
},
},

View File

@@ -16,19 +16,21 @@ import (
)
type gctsExecuteABAPUnitTestsOptions struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Host string `json:"host,omitempty"`
Repository string `json:"repository,omitempty"`
Client string `json:"client,omitempty"`
AUnitTest bool `json:"aUnitTest,omitempty"`
AtcCheck bool `json:"atcCheck,omitempty"`
AtcVariant string `json:"atcVariant,omitempty"`
Scope string `json:"scope,omitempty"`
Commit string `json:"commit,omitempty"`
Workspace string `json:"workspace,omitempty"`
AtcResultsFileName string `json:"atcResultsFileName,omitempty"`
AUnitResultsFileName string `json:"aUnitResultsFileName,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Host string `json:"host,omitempty"`
Repository string `json:"repository,omitempty"`
Client string `json:"client,omitempty"`
AUnitTest bool `json:"aUnitTest,omitempty"`
AtcCheck bool `json:"atcCheck,omitempty"`
AtcVariant string `json:"atcVariant,omitempty"`
Scope string `json:"scope,omitempty"`
Commit string `json:"commit,omitempty"`
Workspace string `json:"workspace,omitempty"`
AtcResultsFileName string `json:"atcResultsFileName,omitempty"`
AUnitResultsFileName string `json:"aUnitResultsFileName,omitempty"`
QueryParameters map[string]interface{} `json:"queryParameters,omitempty"`
SkipSSLVerification bool `json:"skipSSLVerification,omitempty"`
}
// GctsExecuteABAPUnitTestsCommand Runs ABAP unit tests and ATC (ABAP Test Cockpit) checks for a specified object scope.
@@ -140,6 +142,8 @@ func addGctsExecuteABAPUnitTestsFlags(cmd *cobra.Command, stepConfig *gctsExecut
cmd.Flags().StringVar(&stepConfig.AtcResultsFileName, "atcResultsFileName", `ATCResults.xml`, "Specifies an output file name for the results of the ATC checks.")
cmd.Flags().StringVar(&stepConfig.AUnitResultsFileName, "aUnitResultsFileName", `AUnitResults.xml`, "Specifies an output file name for the results of the ABAP Unit tests.")
cmd.Flags().BoolVar(&stepConfig.SkipSSLVerification, "skipSSLVerification", false, "You can skip the SSL (Secure Socket Layer) verification for the http client")
cmd.MarkFlagRequired("username")
cmd.MarkFlagRequired("password")
cmd.MarkFlagRequired("host")
@@ -291,6 +295,23 @@ func gctsExecuteABAPUnitTestsMetadata() config.StepData {
Aliases: []config.Alias{},
Default: `AUnitResults.xml`,
},
{
Name: "queryParameters",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "map[string]interface{}",
Mandatory: false,
Aliases: []config.Alias{},
},
{
Name: "skipSSLVerification",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "bool",
Mandatory: false,
Aliases: []config.Alias{},
Default: false,
},
},
},
},

View File

@@ -34,14 +34,19 @@ func gctsRollback(config gctsRollbackOptions, telemetryData *telemetry.CustomDat
func rollback(config *gctsRollbackOptions, telemetryData *telemetry.CustomData, command command.ExecRunner, httpClient piperhttp.Sender) error {
maxRetries := -1
cookieJar, cookieErr := cookiejar.New(nil)
if cookieErr != nil {
return cookieErr
}
clientOptions := piperhttp.ClientOptions{
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
CookieJar: cookieJar,
Username: config.Username,
Password: config.Password,
MaxRetries: maxRetries,
TransportSkipVerification: config.SkipSSLVerification,
}
httpClient.SetOptions(clientOptions)
@@ -64,12 +69,13 @@ func rollback(config *gctsRollbackOptions, telemetryData *telemetry.CustomData,
log.Entry().Infof("rolling back to specified commit %v", config.Commit)
deployOptions = gctsDeployOptions{
Username: config.Username,
Password: config.Password,
Host: config.Host,
Repository: config.Repository,
Client: config.Client,
Commit: config.Commit,
Username: config.Username,
Password: config.Password,
Host: config.Host,
Repository: config.Repository,
Client: config.Client,
Commit: config.Commit,
SkipSSLVerification: config.SkipSSLVerification,
}
} else {
@@ -81,12 +87,13 @@ func rollback(config *gctsRollbackOptions, telemetryData *telemetry.CustomData,
log.Entry().WithField("repository", config.Repository).Infof("rolling back to last active commit %v", repoHistory.Result[0].FromCommit)
deployOptions = gctsDeployOptions{
Username: config.Username,
Password: config.Password,
Host: config.Host,
Repository: config.Repository,
Client: config.Client,
Commit: repoHistory.Result[0].FromCommit,
Username: config.Username,
Password: config.Password,
Host: config.Host,
Repository: config.Repository,
Client: config.Client,
Commit: repoHistory.Result[0].FromCommit,
SkipSSLVerification: config.SkipSSLVerification,
}
} else {
@@ -128,6 +135,13 @@ func getLastSuccessfullCommit(config *gctsRollbackOptions, telemetryData *teleme
url := githubURL.Scheme + "://api." + githubURL.Host + "/repos" + githubURL.Path + "/commits/" + commit + "/status"
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return "", urlErr
}
resp, httpErr := httpClient.SendRequest("GET", url, nil, nil, nil)
defer func() {
@@ -171,6 +185,13 @@ func getCommits(config *gctsRollbackOptions, telemetryData *telemetry.CustomData
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/getCommit?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
type commitsResponseBody struct {
Commits []struct {
ID string `json:"id"`
@@ -218,6 +239,13 @@ func getRepoInfo(config *gctsRollbackOptions, telemetryData *telemetry.CustomDat
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
resp, httpErr := httpClient.SendRequest("GET", url, nil, nil, nil)
defer func() {
@@ -269,6 +297,13 @@ func getRepoHistory(config *gctsRollbackOptions, telemetryData *telemetry.Custom
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
"/getHistory?sap-client=" + config.Client
url, urlErr := addQueryToURL(url, config.QueryParameters)
if urlErr != nil {
return nil, urlErr
}
resp, httpErr := httpClient.SendRequest("GET", url, nil, nil, nil)
defer func() {

View File

@@ -16,13 +16,15 @@ import (
)
type gctsRollbackOptions struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Repository string `json:"repository,omitempty"`
Host string `json:"host,omitempty"`
Client string `json:"client,omitempty"`
Commit string `json:"commit,omitempty"`
GithubPersonalAccessToken string `json:"githubPersonalAccessToken,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
Repository string `json:"repository,omitempty"`
Host string `json:"host,omitempty"`
Client string `json:"client,omitempty"`
Commit string `json:"commit,omitempty"`
GithubPersonalAccessToken string `json:"githubPersonalAccessToken,omitempty"`
QueryParameters map[string]interface{} `json:"queryParameters,omitempty"`
SkipSSLVerification bool `json:"skipSSLVerification,omitempty"`
}
// GctsRollbackCommand Perfoms a rollback of one (default) or several commits
@@ -131,6 +133,8 @@ func addGctsRollbackFlags(cmd *cobra.Command, stepConfig *gctsRollbackOptions) {
cmd.Flags().StringVar(&stepConfig.Commit, "commit", os.Getenv("PIPER_commit"), "Specifies the target commit for the rollback")
cmd.Flags().StringVar(&stepConfig.GithubPersonalAccessToken, "githubPersonalAccessToken", os.Getenv("PIPER_githubPersonalAccessToken"), "GitHub personal access token with at least read permissions for the remote repository")
cmd.Flags().BoolVar(&stepConfig.SkipSSLVerification, "skipSSLVerification", false, "You can skip the SSL (Secure Socket Layer) verification for the http client")
cmd.MarkFlagRequired("username")
cmd.MarkFlagRequired("password")
cmd.MarkFlagRequired("repository")
@@ -233,6 +237,23 @@ func gctsRollbackMetadata() config.StepData {
Aliases: []config.Alias{},
Default: os.Getenv("PIPER_githubPersonalAccessToken"),
},
{
Name: "queryParameters",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "map[string]interface{}",
Mandatory: false,
Aliases: []config.Alias{},
},
{
Name: "skipSSLVerification",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Type: "bool",
Mandatory: false,
Aliases: []config.Alias{},
Default: false,
},
},
},
},

View File

@@ -61,3 +61,20 @@ spec:
- STAGES
- STEPS
mandatory: true
- name: queryParameters
type: "map[string]interface{}"
description: Specifies pairs of key and value query parameters for the api requests
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
- name: skipSSLVerification
type: bool
description: You can skip the SSL (Secure Socket Layer) verification for the http client
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
default: false

View File

@@ -96,3 +96,20 @@ spec:
default: GIT
possibleValues:
- GIT
- name: queryParameters
type: "map[string]interface{}"
description: Specifies pairs of key and value query parameters for the api requests
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
- name: skipSSLVerification
type: bool
description: You can skip the SSL (Secure Socket Layer) verification for the http client
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
default: false

View File

@@ -142,3 +142,20 @@ spec:
mandatory: false
aliases:
- name: gctsRepositoryConfigurations
- name: queryParameters
type: "map[string]interface{}"
description: Specifies pairs of key and value query parameters for the api requests
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
- name: skipSSLVerification
type: bool
description: You can skip the SSL (Secure Socket Layer) verification for the http client
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
default: false

View File

@@ -166,3 +166,20 @@ spec:
- STEPS
mandatory: false
default: "AUnitResults.xml"
- name: queryParameters
type: "map[string]interface{}"
description: Specifies pairs of key and value query parameters for the api requests
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
- name: skipSSLVerification
type: bool
description: You can skip the SSL (Secure Socket Layer) verification for the http client
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
default: false

View File

@@ -159,3 +159,20 @@ spec:
- STEPS
mandatory: false
default: "AUnitResults.xml"
- name: queryParameters
type: "map[string]interface{}"
description: Specifies pairs of key and value query parameters for the api requests
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
- name: skipSSLVerification
type: bool
description: You can skip the SSL (Secure Socket Layer) verification for the http client
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
default: false

View File

@@ -84,3 +84,20 @@ spec:
resourceRef:
- name: githubPersonalAccessTokenId
type: secret
- name: queryParameters
type: "map[string]interface{}"
description: Specifies pairs of key and value query parameters for the api requests
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
- name: skipSSLVerification
type: bool
description: You can skip the SSL (Secure Socket Layer) verification for the http client
scope:
- PARAMETERS
- STAGES
- STEPS
mandatory: false
default: false