2020-05-18 21:39:35 +02:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http/cookiejar"
|
|
|
|
"net/url"
|
|
|
|
|
|
|
|
"github.com/Jeffail/gabs/v2"
|
|
|
|
"github.com/SAP/jenkins-library/pkg/command"
|
|
|
|
piperhttp "github.com/SAP/jenkins-library/pkg/http"
|
|
|
|
"github.com/SAP/jenkins-library/pkg/log"
|
|
|
|
"github.com/SAP/jenkins-library/pkg/telemetry"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
)
|
|
|
|
|
|
|
|
func gctsDeploy(config gctsDeployOptions, telemetryData *telemetry.CustomData) {
|
|
|
|
// for command execution use Command
|
|
|
|
c := command.Command{}
|
|
|
|
// reroute command output to logging framework
|
|
|
|
c.Stdout(log.Entry().Writer())
|
|
|
|
c.Stderr(log.Entry().Writer())
|
|
|
|
|
|
|
|
// for http calls import piperhttp "github.com/SAP/jenkins-library/pkg/http"
|
|
|
|
// and use a &piperhttp.Client{} in a custom system
|
|
|
|
// Example: step checkmarxExecuteScan.go
|
|
|
|
httpClient := &piperhttp.Client{}
|
|
|
|
|
|
|
|
// error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end
|
|
|
|
err := deployCommit(&config, telemetryData, &c, httpClient)
|
|
|
|
if err != nil {
|
|
|
|
log.Entry().WithError(err).Fatal("step execution failed")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-01 11:28:16 +02:00
|
|
|
func deployCommit(config *gctsDeployOptions, telemetryData *telemetry.CustomData, command command.ExecRunner, httpClient piperhttp.Sender) error {
|
2020-05-18 21:39:35 +02:00
|
|
|
|
|
|
|
cookieJar, cookieErr := cookiejar.New(nil)
|
|
|
|
if cookieErr != nil {
|
|
|
|
return errors.Wrap(cookieErr, "creating a cookie jar failed")
|
|
|
|
}
|
|
|
|
clientOptions := piperhttp.ClientOptions{
|
|
|
|
CookieJar: cookieJar,
|
|
|
|
Username: config.Username,
|
|
|
|
Password: config.Password,
|
|
|
|
}
|
|
|
|
httpClient.SetOptions(clientOptions)
|
|
|
|
|
|
|
|
requestURL := config.Host +
|
|
|
|
"/sap/bc/cts_abapvcs/repository/" + config.Repository +
|
|
|
|
"/pullByCommit?sap-client=" + config.Client
|
|
|
|
|
|
|
|
if config.Commit != "" {
|
|
|
|
log.Entry().Infof("preparing to deploy specified commit %v", config.Commit)
|
|
|
|
params := url.Values{}
|
|
|
|
params.Add("request", config.Commit)
|
|
|
|
requestURL = requestURL + "&" + params.Encode()
|
|
|
|
}
|
|
|
|
|
|
|
|
resp, httpErr := httpClient.SendRequest("GET", requestURL, nil, nil, nil)
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
if resp != nil && resp.Body != nil {
|
|
|
|
resp.Body.Close()
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
if httpErr != nil {
|
|
|
|
return httpErr
|
|
|
|
} else if resp == nil {
|
|
|
|
return errors.New("did not retrieve a HTTP response")
|
|
|
|
}
|
|
|
|
|
|
|
|
bodyText, readErr := ioutil.ReadAll(resp.Body)
|
|
|
|
|
|
|
|
if readErr != nil {
|
|
|
|
return errors.Wrapf(readErr, "HTTP response body could not be read")
|
|
|
|
}
|
|
|
|
|
|
|
|
response, parsingErr := gabs.ParseJSON([]byte(bodyText))
|
|
|
|
|
|
|
|
if parsingErr != nil {
|
|
|
|
return errors.Wrapf(parsingErr, "HTTP response body could not be parsed as JSON: %v", string(bodyText))
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Entry().
|
|
|
|
WithField("repository", config.Repository).
|
|
|
|
Infof("successfully deployed commit %v (previous commit was %v)", response.Path("toCommit").Data().(string), response.Path("fromCommit").Data().(string))
|
|
|
|
return nil
|
|
|
|
}
|