mirror of
https://github.com/SAP/jenkins-library.git
synced 2025-01-20 05:19:40 +02:00
AAKaaS: 2 Check Product Version (#2037)
* adding my steps * messy step * Update abapEnvironmentAssembly.go * clean up * change yaml * corrections * Update cloudFoundryDeploy.go * update * delete simulation step * remove simulate * Update PiperGoUtils.groovy * Update PiperGoUtils.groovy * Update CommonStepsTest.groovy * add docu * Update abapEnvironmentAssembly.md * changes due to PR * Update .gitignore * b * CV list * Update abapEnvironmentAssembly.go * testing with simulation * Update abapEnvironmentAssembly.go * remove simulation * renaming * Update mkdocs.yml * moving service key to yaml and fixing code climate * Update abapEnvironmentAssemblePackages.go * Update abapEnvironmentAssemblePackages.go * Update abapEnvironmentAssemblePackages.go * Update abapEnvironmentAssemblePackages.go * change input * Update abapEnvironmentAssemblePackages.go * change json tag * fixed error handling * documentation * Update abapEnvironmentAssemblePackages.md * Update abapEnvironmentAssemblePackages.md * fixing code climate issues * fixing code climate issues * Update abapEnvironmentAssemblePackages.yaml * fixing code climate issues * Update abapEnvironmentAssemblePackages.yaml * adding unittests * adding unittests and improved logging * yaml -> json * change scope of cfServiceKeyName * correct indentation * Update CommonStepsTest.groovy * maintain correct step order * AAKaaS CheckPV step * AAKaaS CheckPV step #2 * AAKaaS CheckPV step #3 * AAKaaS CheckPV step #4 * AAKaaS CheckPV step #5 * Update resources/metadata/abapAddonAssemblyKitCheckCVs.yaml Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com> * Update resources/metadata/abapAddonAssemblyKitCheckPV.yaml Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com> * Update resources/metadata/abapAddonAssemblyKitCheckPV.yaml Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com> * Update resources/metadata/abapAddonAssemblyKitCheckCVs.yaml Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com> * AAKaaS CheckPV step #6 Co-authored-by: rosemarieB <45030247+rosemarieB@users.noreply.github.com> Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com> Co-authored-by: Christopher Fenner <26137398+CCFenner@users.noreply.github.com>
This commit is contained in:
parent
2a776ba7eb
commit
427f78b3ed
@ -40,7 +40,7 @@ func runAbapAddonAssemblyKitCheckCVs(config *abapAddonAssemblyKitCheckCVsOptions
|
|||||||
conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client)
|
conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client)
|
||||||
|
|
||||||
for i := range addonDescriptor.Repositories {
|
for i := range addonDescriptor.Repositories {
|
||||||
var c cv
|
var c componentVersion
|
||||||
c.initCV(addonDescriptor.Repositories[i], *conn)
|
c.initCV(addonDescriptor.Repositories[i], *conn)
|
||||||
err := c.validate()
|
err := c.validate()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -60,40 +60,40 @@ func combineYAMLRepositoriesWithCPEProduct(addonDescriptor abaputils.AddonDescri
|
|||||||
return addonDescriptorFromCPE
|
return addonDescriptorFromCPE
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cv) initCV(repo abaputils.Repository, conn abapbuild.Connector) {
|
func (c *componentVersion) initCV(repo abaputils.Repository, conn abapbuild.Connector) {
|
||||||
c.Connector = conn
|
c.Connector = conn
|
||||||
c.Name = repo.Name
|
c.Name = repo.Name
|
||||||
c.VersionYAML = repo.VersionYAML
|
c.VersionYAML = repo.VersionYAML
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cv) copyFieldsToRepo(initialRepo *abaputils.Repository) {
|
func (c *componentVersion) copyFieldsToRepo(initialRepo *abaputils.Repository) {
|
||||||
initialRepo.Version = c.Version
|
initialRepo.Version = c.Version
|
||||||
initialRepo.SpLevel = c.SpLevel
|
initialRepo.SpLevel = c.SpLevel
|
||||||
initialRepo.PatchLevel = c.PatchLevel
|
initialRepo.PatchLevel = c.PatchLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cv) validate() error {
|
func (c *componentVersion) validate() error {
|
||||||
log.Entry().Infof("Validate component %s version %s and resolve version", c.Name, c.VersionYAML)
|
log.Entry().Infof("Validate component %s version %s and resolve version", c.Name, c.VersionYAML)
|
||||||
appendum := "/odata/aas_ocs_package/ValidateComponentVersion?Name='" + c.Name + "'&Version='" + c.VersionYAML + "'"
|
appendum := "/odata/aas_ocs_package/ValidateComponentVersion?Name='" + c.Name + "'&Version='" + c.VersionYAML + "'"
|
||||||
body, err := c.Connector.Get(appendum)
|
body, err := c.Connector.Get(appendum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var jCV jsonCV
|
var jCV jsonComponentVersion
|
||||||
json.Unmarshal(body, &jCV)
|
json.Unmarshal(body, &jCV)
|
||||||
c.Name = jCV.CV.Name
|
c.Name = jCV.ComponentVersion.Name
|
||||||
c.Version = jCV.CV.Version
|
c.Version = jCV.ComponentVersion.Version
|
||||||
c.SpLevel = jCV.CV.SpLevel
|
c.SpLevel = jCV.ComponentVersion.SpLevel
|
||||||
c.PatchLevel = jCV.CV.PatchLevel
|
c.PatchLevel = jCV.ComponentVersion.PatchLevel
|
||||||
log.Entry().Infof("Resolved version %s, splevel %s, patchlevel %s", c.Version, c.SpLevel, c.PatchLevel)
|
log.Entry().Infof("Resolved version %s, splevel %s, patchlevel %s", c.Version, c.SpLevel, c.PatchLevel)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type jsonCV struct {
|
type jsonComponentVersion struct {
|
||||||
CV *cv `json:"d"`
|
ComponentVersion *componentVersion `json:"d"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type cv struct {
|
type componentVersion struct {
|
||||||
abapbuild.Connector
|
abapbuild.Connector
|
||||||
Name string `json:"Name"`
|
Name string `json:"Name"`
|
||||||
VersionYAML string
|
VersionYAML string
|
||||||
|
@ -112,8 +112,8 @@ It resolves the dotted version string into version, support package level and pa
|
|||||||
|
|
||||||
func addAbapAddonAssemblyKitCheckCVsFlags(cmd *cobra.Command, stepConfig *abapAddonAssemblyKitCheckCVsOptions) {
|
func addAbapAddonAssemblyKitCheckCVsFlags(cmd *cobra.Command, stepConfig *abapAddonAssemblyKitCheckCVsOptions) {
|
||||||
cmd.Flags().StringVar(&stepConfig.AbapAddonAssemblyKitEndpoint, "abapAddonAssemblyKitEndpoint", os.Getenv("PIPER_abapAddonAssemblyKitEndpoint"), "Base URL to the Addon Assembly Kit as a Service (AAKaaS) system")
|
cmd.Flags().StringVar(&stepConfig.AbapAddonAssemblyKitEndpoint, "abapAddonAssemblyKitEndpoint", os.Getenv("PIPER_abapAddonAssemblyKitEndpoint"), "Base URL to the Addon Assembly Kit as a Service (AAKaaS) system")
|
||||||
cmd.Flags().StringVar(&stepConfig.Username, "username", os.Getenv("PIPER_username"), "User for the Addon Assembly Kit as a Service System (AAKaaS)")
|
cmd.Flags().StringVar(&stepConfig.Username, "username", os.Getenv("PIPER_username"), "User for the Addon Assembly Kit as a Service (AAKaaS) system")
|
||||||
cmd.Flags().StringVar(&stepConfig.Password, "password", os.Getenv("PIPER_password"), "Password the Addon Assembly Kit as a Service System (AAKaaS)")
|
cmd.Flags().StringVar(&stepConfig.Password, "password", os.Getenv("PIPER_password"), "Password for the Addon Assembly Kit as a Service (AAKaaS) system")
|
||||||
cmd.Flags().StringVar(&stepConfig.AddonDescriptorFileName, "addonDescriptorFileName", `addon.yml`, "File name of the YAML file which describes the Product Version and corresponding Software Component Versions")
|
cmd.Flags().StringVar(&stepConfig.AddonDescriptorFileName, "addonDescriptorFileName", `addon.yml`, "File name of the YAML file which describes the Product Version and corresponding Software Component Versions")
|
||||||
cmd.Flags().StringVar(&stepConfig.AddonDescriptor, "addonDescriptor", os.Getenv("PIPER_addonDescriptor"), "Structure in the commonPipelineEnvironment containing information about the Product Version and corresponding Software Component Versions")
|
cmd.Flags().StringVar(&stepConfig.AddonDescriptor, "addonDescriptor", os.Getenv("PIPER_addonDescriptor"), "Structure in the commonPipelineEnvironment containing information about the Product Version and corresponding Software Component Versions")
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ func TestInitCV(t *testing.T) {
|
|||||||
Name: "/DRNMSPC/COMP01",
|
Name: "/DRNMSPC/COMP01",
|
||||||
VersionYAML: "1.2.3",
|
VersionYAML: "1.2.3",
|
||||||
}
|
}
|
||||||
var c cv
|
var c componentVersion
|
||||||
c.initCV(repo, *conn)
|
c.initCV(repo, *conn)
|
||||||
assert.Equal(t, "/DRNMSPC/COMP01", c.Name)
|
assert.Equal(t, "/DRNMSPC/COMP01", c.Name)
|
||||||
assert.Equal(t, "1.2.3", c.VersionYAML)
|
assert.Equal(t, "1.2.3", c.VersionYAML)
|
||||||
@ -89,7 +89,7 @@ func TestValidateCV(t *testing.T) {
|
|||||||
conn.Client = &abaputils.ClientMock{
|
conn.Client = &abaputils.ClientMock{
|
||||||
Body: responseCheckCVs,
|
Body: responseCheckCVs,
|
||||||
}
|
}
|
||||||
c := cv{
|
c := componentVersion{
|
||||||
Connector: *conn,
|
Connector: *conn,
|
||||||
Name: "/DRNMSPC/COMP01",
|
Name: "/DRNMSPC/COMP01",
|
||||||
VersionYAML: "1.2.3",
|
VersionYAML: "1.2.3",
|
||||||
@ -108,7 +108,7 @@ func TestValidateCV(t *testing.T) {
|
|||||||
Body: "ErrorBody",
|
Body: "ErrorBody",
|
||||||
Error: errors.New("Validation failed"),
|
Error: errors.New("Validation failed"),
|
||||||
}
|
}
|
||||||
c := cv{
|
c := componentVersion{
|
||||||
Connector: *conn,
|
Connector: *conn,
|
||||||
Name: "/DRNMSPC/COMP01",
|
Name: "/DRNMSPC/COMP01",
|
||||||
VersionYAML: "1.2.3",
|
VersionYAML: "1.2.3",
|
||||||
@ -127,7 +127,7 @@ func TestCopyFieldsCV(t *testing.T) {
|
|||||||
Name: "/DRNMSPC/COMP01",
|
Name: "/DRNMSPC/COMP01",
|
||||||
VersionYAML: "1.2.3",
|
VersionYAML: "1.2.3",
|
||||||
}
|
}
|
||||||
var c cv
|
var c componentVersion
|
||||||
c.Version = "0001"
|
c.Version = "0001"
|
||||||
c.SpLevel = "0002"
|
c.SpLevel = "0002"
|
||||||
c.PatchLevel = "0003"
|
c.PatchLevel = "0003"
|
||||||
|
96
cmd/abapAddonAssemblyKitCheckPV.go
Normal file
96
cmd/abapAddonAssemblyKitCheckPV.go
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
abapbuild "github.com/SAP/jenkins-library/pkg/abap/build"
|
||||||
|
"github.com/SAP/jenkins-library/pkg/abaputils"
|
||||||
|
"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"
|
||||||
|
)
|
||||||
|
|
||||||
|
func abapAddonAssemblyKitCheckPV(config abapAddonAssemblyKitCheckPVOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitCheckPVCommonPipelineEnvironment) {
|
||||||
|
// for command execution use Command
|
||||||
|
c := command.Command{}
|
||||||
|
// reroute command output to logging framework
|
||||||
|
c.Stdout(log.Writer())
|
||||||
|
c.Stderr(log.Writer())
|
||||||
|
|
||||||
|
client := piperhttp.Client{}
|
||||||
|
|
||||||
|
// error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end
|
||||||
|
err := runAbapAddonAssemblyKitCheckPV(&config, telemetryData, &client, cpe, abaputils.ReadAddonDescriptor)
|
||||||
|
if err != nil {
|
||||||
|
log.Entry().WithError(err).Fatal("step execution failed")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runAbapAddonAssemblyKitCheckPV(config *abapAddonAssemblyKitCheckPVOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender,
|
||||||
|
cpe *abapAddonAssemblyKitCheckPVCommonPipelineEnvironment, readAdoDescriptor abaputils.ReadAddonDescriptorType) error {
|
||||||
|
var addonDescriptorFromCPE abaputils.AddonDescriptor
|
||||||
|
json.Unmarshal([]byte(config.AddonDescriptor), &addonDescriptorFromCPE)
|
||||||
|
addonDescriptor, err := readAdoDescriptor(config.AddonDescriptorFileName)
|
||||||
|
addonDescriptor = combineYAMLRepositoriesWithCPEProduct(addonDescriptor, addonDescriptorFromCPE)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
conn := new(abapbuild.Connector)
|
||||||
|
conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client)
|
||||||
|
|
||||||
|
var p productVersion
|
||||||
|
p.init(addonDescriptor, *conn)
|
||||||
|
err = p.validate()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
p.copyFieldsToRepo(&addonDescriptor)
|
||||||
|
log.Entry().Info("Write the resolved version to the CommonPipelineEnvironment")
|
||||||
|
toCPE, _ := json.Marshal(addonDescriptor)
|
||||||
|
cpe.abap.addonDescriptor = string(toCPE)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *productVersion) init(desc abaputils.AddonDescriptor, conn abapbuild.Connector) {
|
||||||
|
p.Connector = conn
|
||||||
|
p.Name = desc.AddonProduct
|
||||||
|
p.VersionYAML = desc.AddonVersionYAML
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *productVersion) copyFieldsToRepo(initialAddonDescriptor *abaputils.AddonDescriptor) {
|
||||||
|
initialAddonDescriptor.AddonVersion = p.Version
|
||||||
|
initialAddonDescriptor.AddonSpsLevel = p.SpsLevel
|
||||||
|
initialAddonDescriptor.AddonPatchLevel = p.PatchLevel
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *productVersion) validate() error {
|
||||||
|
log.Entry().Infof("Validate product %s version %s and resolve version", p.Name, p.VersionYAML)
|
||||||
|
appendum := "/odata/aas_ocs_package/ValidateProductVersion?Name='" + p.Name + "'&Version='" + p.VersionYAML + "'"
|
||||||
|
body, err := p.Connector.Get(appendum)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var jPV jsonProductVersion
|
||||||
|
json.Unmarshal(body, &jPV)
|
||||||
|
p.Name = jPV.ProductVersion.Name
|
||||||
|
p.Version = jPV.ProductVersion.Version
|
||||||
|
p.SpsLevel = jPV.ProductVersion.SpsLevel
|
||||||
|
p.PatchLevel = jPV.ProductVersion.PatchLevel
|
||||||
|
log.Entry().Infof("Resolved version %s, spslevel %s, patchlevel %s", p.Version, p.SpsLevel, p.PatchLevel)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsonProductVersion struct {
|
||||||
|
ProductVersion *productVersion `json:"d"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type productVersion struct {
|
||||||
|
abapbuild.Connector
|
||||||
|
Name string `json:"Name"`
|
||||||
|
VersionYAML string
|
||||||
|
Version string `json:"Version"`
|
||||||
|
SpsLevel string `json:"SpsLevel"`
|
||||||
|
PatchLevel string `json:"PatchLevel"`
|
||||||
|
TargetVectorID string
|
||||||
|
}
|
186
cmd/abapAddonAssemblyKitCheckPV_generated.go
Normal file
186
cmd/abapAddonAssemblyKitCheckPV_generated.go
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
// Code generated by piper's step-generator. DO NOT EDIT.
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/SAP/jenkins-library/pkg/config"
|
||||||
|
"github.com/SAP/jenkins-library/pkg/log"
|
||||||
|
"github.com/SAP/jenkins-library/pkg/piperenv"
|
||||||
|
"github.com/SAP/jenkins-library/pkg/telemetry"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
type abapAddonAssemblyKitCheckPVOptions struct {
|
||||||
|
AbapAddonAssemblyKitEndpoint string `json:"abapAddonAssemblyKitEndpoint,omitempty"`
|
||||||
|
Username string `json:"username,omitempty"`
|
||||||
|
Password string `json:"password,omitempty"`
|
||||||
|
AddonDescriptorFileName string `json:"addonDescriptorFileName,omitempty"`
|
||||||
|
AddonDescriptor string `json:"addonDescriptor,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type abapAddonAssemblyKitCheckPVCommonPipelineEnvironment struct {
|
||||||
|
abap struct {
|
||||||
|
addonDescriptor string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *abapAddonAssemblyKitCheckPVCommonPipelineEnvironment) persist(path, resourceName string) {
|
||||||
|
content := []struct {
|
||||||
|
category string
|
||||||
|
name string
|
||||||
|
value string
|
||||||
|
}{
|
||||||
|
{category: "abap", name: "addonDescriptor", value: p.abap.addonDescriptor},
|
||||||
|
}
|
||||||
|
|
||||||
|
errCount := 0
|
||||||
|
for _, param := range content {
|
||||||
|
err := piperenv.SetResourceParameter(path, resourceName, filepath.Join(param.category, param.name), param.value)
|
||||||
|
if err != nil {
|
||||||
|
log.Entry().WithError(err).Error("Error persisting piper environment.")
|
||||||
|
errCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if errCount > 0 {
|
||||||
|
log.Entry().Fatal("failed to persist Piper environment")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AbapAddonAssemblyKitCheckPVCommand This step checks the validity of a Addon Product Version.
|
||||||
|
func AbapAddonAssemblyKitCheckPVCommand() *cobra.Command {
|
||||||
|
const STEP_NAME = "abapAddonAssemblyKitCheckPV"
|
||||||
|
|
||||||
|
metadata := abapAddonAssemblyKitCheckPVMetadata()
|
||||||
|
var stepConfig abapAddonAssemblyKitCheckPVOptions
|
||||||
|
var startTime time.Time
|
||||||
|
var commonPipelineEnvironment abapAddonAssemblyKitCheckPVCommonPipelineEnvironment
|
||||||
|
|
||||||
|
var createAbapAddonAssemblyKitCheckPVCmd = &cobra.Command{
|
||||||
|
Use: STEP_NAME,
|
||||||
|
Short: "This step checks the validity of a Addon Product Version.",
|
||||||
|
Long: `This step checks whether the Addon Product Version in the addonDescriptorFileName does exist or is a valid successor of an existing Product Version.
|
||||||
|
It resolves the dotted version string into version, support package stack level and patch level and writes it to the commonPipelineEnvironment.`,
|
||||||
|
PreRunE: func(cmd *cobra.Command, _ []string) error {
|
||||||
|
startTime = time.Now()
|
||||||
|
log.SetStepName(STEP_NAME)
|
||||||
|
log.SetVerbose(GeneralConfig.Verbose)
|
||||||
|
|
||||||
|
path, _ := os.Getwd()
|
||||||
|
fatalHook := &log.FatalHook{CorrelationID: GeneralConfig.CorrelationID, Path: path}
|
||||||
|
log.RegisterHook(fatalHook)
|
||||||
|
|
||||||
|
err := PrepareConfig(cmd, &metadata, STEP_NAME, &stepConfig, config.OpenPiperFile)
|
||||||
|
if err != nil {
|
||||||
|
log.SetErrorCategory(log.ErrorConfiguration)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.RegisterSecret(stepConfig.Username)
|
||||||
|
log.RegisterSecret(stepConfig.Password)
|
||||||
|
|
||||||
|
if len(GeneralConfig.HookConfig.SentryConfig.Dsn) > 0 {
|
||||||
|
sentryHook := log.NewSentryHook(GeneralConfig.HookConfig.SentryConfig.Dsn, GeneralConfig.CorrelationID)
|
||||||
|
log.RegisterHook(&sentryHook)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
Run: func(_ *cobra.Command, _ []string) {
|
||||||
|
telemetryData := telemetry.CustomData{}
|
||||||
|
telemetryData.ErrorCode = "1"
|
||||||
|
handler := func() {
|
||||||
|
commonPipelineEnvironment.persist(GeneralConfig.EnvRootPath, "commonPipelineEnvironment")
|
||||||
|
telemetryData.Duration = fmt.Sprintf("%v", time.Since(startTime).Milliseconds())
|
||||||
|
telemetry.Send(&telemetryData)
|
||||||
|
}
|
||||||
|
log.DeferExitHandler(handler)
|
||||||
|
defer handler()
|
||||||
|
telemetry.Initialize(GeneralConfig.NoTelemetry, STEP_NAME)
|
||||||
|
abapAddonAssemblyKitCheckPV(stepConfig, &telemetryData, &commonPipelineEnvironment)
|
||||||
|
telemetryData.ErrorCode = "0"
|
||||||
|
log.Entry().Info("SUCCESS")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
addAbapAddonAssemblyKitCheckPVFlags(createAbapAddonAssemblyKitCheckPVCmd, &stepConfig)
|
||||||
|
return createAbapAddonAssemblyKitCheckPVCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func addAbapAddonAssemblyKitCheckPVFlags(cmd *cobra.Command, stepConfig *abapAddonAssemblyKitCheckPVOptions) {
|
||||||
|
cmd.Flags().StringVar(&stepConfig.AbapAddonAssemblyKitEndpoint, "abapAddonAssemblyKitEndpoint", os.Getenv("PIPER_abapAddonAssemblyKitEndpoint"), "Base URL to the Addon Assembly Kit as a Service (AAKaaS) system")
|
||||||
|
cmd.Flags().StringVar(&stepConfig.Username, "username", os.Getenv("PIPER_username"), "User for the Addon Assembly Kit as a Service (AAKaaS) system")
|
||||||
|
cmd.Flags().StringVar(&stepConfig.Password, "password", os.Getenv("PIPER_password"), "Password for the Addon Assembly Kit as a Service (AAKaaS) system")
|
||||||
|
cmd.Flags().StringVar(&stepConfig.AddonDescriptorFileName, "addonDescriptorFileName", `addon.yml`, "File name of the YAML file which describes the Product Version and corresponding Software Component Versions")
|
||||||
|
cmd.Flags().StringVar(&stepConfig.AddonDescriptor, "addonDescriptor", os.Getenv("PIPER_addonDescriptor"), "Structure in the commonPipelineEnvironment containing information about the Product Version and corresponding Software Component Versions")
|
||||||
|
|
||||||
|
cmd.MarkFlagRequired("abapAddonAssemblyKitEndpoint")
|
||||||
|
cmd.MarkFlagRequired("username")
|
||||||
|
cmd.MarkFlagRequired("password")
|
||||||
|
cmd.MarkFlagRequired("addonDescriptorFileName")
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieve step metadata
|
||||||
|
func abapAddonAssemblyKitCheckPVMetadata() config.StepData {
|
||||||
|
var theMetaData = config.StepData{
|
||||||
|
Metadata: config.StepMetadata{
|
||||||
|
Name: "abapAddonAssemblyKitCheckPV",
|
||||||
|
Aliases: []config.Alias{},
|
||||||
|
},
|
||||||
|
Spec: config.StepSpec{
|
||||||
|
Inputs: config.StepInputs{
|
||||||
|
Parameters: []config.StepParameters{
|
||||||
|
{
|
||||||
|
Name: "abapAddonAssemblyKitEndpoint",
|
||||||
|
ResourceRef: []config.ResourceReference{},
|
||||||
|
Scope: []string{"PARAMETERS", "STAGES", "STEPS", "GENERAL"},
|
||||||
|
Type: "string",
|
||||||
|
Mandatory: true,
|
||||||
|
Aliases: []config.Alias{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "username",
|
||||||
|
ResourceRef: []config.ResourceReference{},
|
||||||
|
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
|
||||||
|
Type: "string",
|
||||||
|
Mandatory: true,
|
||||||
|
Aliases: []config.Alias{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "password",
|
||||||
|
ResourceRef: []config.ResourceReference{},
|
||||||
|
Scope: []string{"PARAMETERS"},
|
||||||
|
Type: "string",
|
||||||
|
Mandatory: true,
|
||||||
|
Aliases: []config.Alias{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "addonDescriptorFileName",
|
||||||
|
ResourceRef: []config.ResourceReference{},
|
||||||
|
Scope: []string{},
|
||||||
|
Type: "string",
|
||||||
|
Mandatory: true,
|
||||||
|
Aliases: []config.Alias{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "addonDescriptor",
|
||||||
|
ResourceRef: []config.ResourceReference{
|
||||||
|
{
|
||||||
|
Name: "commonPipelineEnvironment",
|
||||||
|
Param: "abap/addonDescriptor",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
|
||||||
|
Type: "string",
|
||||||
|
Mandatory: false,
|
||||||
|
Aliases: []config.Alias{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return theMetaData
|
||||||
|
}
|
16
cmd/abapAddonAssemblyKitCheckPV_generated_test.go
Normal file
16
cmd/abapAddonAssemblyKitCheckPV_generated_test.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAbapAddonAssemblyKitCheckPVCommand(t *testing.T) {
|
||||||
|
|
||||||
|
testCmd := AbapAddonAssemblyKitCheckPVCommand()
|
||||||
|
|
||||||
|
// only high level testing performed - details are tested in step generation procedure
|
||||||
|
assert.Equal(t, "abapAddonAssemblyKitCheckPV", testCmd.Use, "command name incorrect")
|
||||||
|
|
||||||
|
}
|
128
cmd/abapAddonAssemblyKitCheckPV_test.go
Normal file
128
cmd/abapAddonAssemblyKitCheckPV_test.go
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
abapbuild "github.com/SAP/jenkins-library/pkg/abap/build"
|
||||||
|
"github.com/SAP/jenkins-library/pkg/abaputils"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCheckPVStep(t *testing.T) {
|
||||||
|
var config abapAddonAssemblyKitCheckPVOptions
|
||||||
|
var cpe abapAddonAssemblyKitCheckPVCommonPipelineEnvironment
|
||||||
|
client := &abaputils.ClientMock{
|
||||||
|
Body: responseCheckPV,
|
||||||
|
}
|
||||||
|
t.Run("step success", func(t *testing.T) {
|
||||||
|
config.AddonDescriptorFileName = "success"
|
||||||
|
err := runAbapAddonAssemblyKitCheckPV(&config, nil, client, &cpe, mockReadAddonDescriptor)
|
||||||
|
assert.NoError(t, err, "Did not expect error")
|
||||||
|
var addonDescriptorFinal abaputils.AddonDescriptor
|
||||||
|
json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal)
|
||||||
|
assert.Equal(t, "0003", addonDescriptorFinal.AddonVersion)
|
||||||
|
assert.Equal(t, "0002", addonDescriptorFinal.AddonSpsLevel)
|
||||||
|
assert.Equal(t, "0001", addonDescriptorFinal.AddonPatchLevel)
|
||||||
|
})
|
||||||
|
t.Run("step error - in ReadAddonDescriptor", func(t *testing.T) {
|
||||||
|
config.AddonDescriptorFileName = "failing"
|
||||||
|
err := runAbapAddonAssemblyKitCheckPV(&config, nil, client, &cpe, mockReadAddonDescriptor)
|
||||||
|
assert.Error(t, err, "Did expect error")
|
||||||
|
assert.Equal(t, err.Error(), "error in ReadAddonDescriptor")
|
||||||
|
})
|
||||||
|
t.Run("step error - in validate", func(t *testing.T) {
|
||||||
|
config.AddonDescriptorFileName = "success"
|
||||||
|
client := &abaputils.ClientMock{
|
||||||
|
Body: "ErrorBody",
|
||||||
|
Error: errors.New("error during validation"),
|
||||||
|
}
|
||||||
|
err := runAbapAddonAssemblyKitCheckPV(&config, nil, client, &cpe, mockReadAddonDescriptor)
|
||||||
|
assert.Error(t, err, "Did expect error")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInitPV(t *testing.T) {
|
||||||
|
t.Run("test init", func(t *testing.T) {
|
||||||
|
conn := new(abapbuild.Connector)
|
||||||
|
conn.Client = &abaputils.ClientMock{}
|
||||||
|
prodvers := abaputils.AddonDescriptor{
|
||||||
|
AddonProduct: "/DRNMSPC/PRD01",
|
||||||
|
AddonVersionYAML: "3.2.1",
|
||||||
|
}
|
||||||
|
|
||||||
|
var pv productVersion
|
||||||
|
pv.init(prodvers, *conn)
|
||||||
|
assert.Equal(t, "/DRNMSPC/PRD01", pv.Name)
|
||||||
|
assert.Equal(t, "3.2.1", pv.VersionYAML)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestValidatePV(t *testing.T) {
|
||||||
|
conn := new(abapbuild.Connector)
|
||||||
|
t.Run("test validate - success", func(t *testing.T) {
|
||||||
|
conn.Client = &abaputils.ClientMock{
|
||||||
|
Body: responseCheckPV,
|
||||||
|
}
|
||||||
|
pv := productVersion{
|
||||||
|
Connector: *conn,
|
||||||
|
Name: "/DRNMSPC/PRD01",
|
||||||
|
VersionYAML: "3.2.1",
|
||||||
|
}
|
||||||
|
err := pv.validate()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "0003", pv.Version)
|
||||||
|
assert.Equal(t, "0002", pv.SpsLevel)
|
||||||
|
assert.Equal(t, "0001", pv.PatchLevel)
|
||||||
|
})
|
||||||
|
t.Run("test validate - with error", func(t *testing.T) {
|
||||||
|
conn.Client = &abaputils.ClientMock{
|
||||||
|
Body: "ErrorBody",
|
||||||
|
Error: errors.New("Validation failed"),
|
||||||
|
}
|
||||||
|
pv := productVersion{
|
||||||
|
Connector: *conn,
|
||||||
|
Name: "/DRNMSPC/PRD01",
|
||||||
|
VersionYAML: "3.2.1",
|
||||||
|
}
|
||||||
|
err := pv.validate()
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Equal(t, "", pv.Version)
|
||||||
|
assert.Equal(t, "", pv.SpsLevel)
|
||||||
|
assert.Equal(t, "", pv.PatchLevel)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCopyFieldsPV(t *testing.T) {
|
||||||
|
t.Run("test copyFieldsToRepo", func(t *testing.T) {
|
||||||
|
prodVers := abaputils.AddonDescriptor{
|
||||||
|
AddonProduct: "/DRNMSPC/PRD01",
|
||||||
|
AddonVersionYAML: "1.2.3",
|
||||||
|
}
|
||||||
|
var pv productVersion
|
||||||
|
pv.Version = "0003"
|
||||||
|
pv.SpsLevel = "0002"
|
||||||
|
pv.PatchLevel = "0001"
|
||||||
|
pv.copyFieldsToRepo(&prodVers)
|
||||||
|
assert.Equal(t, "0003", prodVers.AddonVersion)
|
||||||
|
assert.Equal(t, "0002", prodVers.AddonSpsLevel)
|
||||||
|
assert.Equal(t, "0001", prodVers.AddonPatchLevel)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var responseCheckPV = `{
|
||||||
|
"d": {
|
||||||
|
"__metadata": {
|
||||||
|
"id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/ProductVersionSet(Name='%2FDRNMSPC%2FPRD01',Version='0001')",
|
||||||
|
"uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/ProductVersionSet(Name='%2FDRNMSPC%2FPRD01',Version='0001')",
|
||||||
|
"type": "SSDA.AAS_ODATA_PACKAGE_SRV.ProductVersion"
|
||||||
|
},
|
||||||
|
"Name": "/DRNMSPC/PRD01",
|
||||||
|
"Version": "0003",
|
||||||
|
"SpsLevel": "0002",
|
||||||
|
"PatchLevel": "0001",
|
||||||
|
"Vendor": "",
|
||||||
|
"VendorType": ""
|
||||||
|
}
|
||||||
|
}`
|
@ -106,6 +106,7 @@ func Execute() {
|
|||||||
rootCmd.AddCommand(KanikoExecuteCommand())
|
rootCmd.AddCommand(KanikoExecuteCommand())
|
||||||
rootCmd.AddCommand(AbapEnvironmentAssemblePackagesCommand())
|
rootCmd.AddCommand(AbapEnvironmentAssemblePackagesCommand())
|
||||||
rootCmd.AddCommand(AbapAddonAssemblyKitCheckCVsCommand())
|
rootCmd.AddCommand(AbapAddonAssemblyKitCheckCVsCommand())
|
||||||
|
rootCmd.AddCommand(AbapAddonAssemblyKitCheckPVCommand())
|
||||||
|
|
||||||
addRootFlags(rootCmd)
|
addRootFlags(rootCmd)
|
||||||
if err := rootCmd.Execute(); err != nil {
|
if err := rootCmd.Execute(); err != nil {
|
||||||
|
48
documentation/docs/steps/abapAddonAssemblyKitCheckPV.md
Normal file
48
documentation/docs/steps/abapAddonAssemblyKitCheckPV.md
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# ${docGenStepName}
|
||||||
|
|
||||||
|
## ${docGenDescription}
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
* The credentials to access the AAKaaS (e.g. S-User) must be stored in the Jenkins Credential Store
|
||||||
|
* The step needs an addon.yml containing information about the Product Version and corresponding Software Component Versions/Repositories. The addon.yml should look like this:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
addonProduct: /DMO/myAddonProduct
|
||||||
|
addonVersion: 3.1.4
|
||||||
|
addonUniqueID: myAddonId
|
||||||
|
customerID: $ID
|
||||||
|
repositories:
|
||||||
|
- name: /DMO/REPO_A
|
||||||
|
tag: v-1.0.1-build-0001
|
||||||
|
version: 1.0.1
|
||||||
|
- name: /DMO/REPO_B
|
||||||
|
tag: rel-2.1.1-build-0001
|
||||||
|
version: 2.1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
## ${docGenParameters}
|
||||||
|
|
||||||
|
## ${docGenConfiguration}
|
||||||
|
|
||||||
|
## ${docJenkinsPluginDependencies}
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Configuration in the config.yml
|
||||||
|
|
||||||
|
The recommended way to configure your pipeline is via the config.yml file. In this case, calling the step in the Jenkinsfile is reduced to one line:
|
||||||
|
|
||||||
|
```groovy
|
||||||
|
abapAddonAssemblyKitCheckPV script: this
|
||||||
|
```
|
||||||
|
|
||||||
|
The config.yml should look like this:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
abapAddonAssemblyKitCheckPV:
|
||||||
|
abapAddonAssemblyKitCredentialsId: 'abapAddonAssemblyKitCredentialsId',
|
||||||
|
abapAddonAssemblyKitEndpoint: 'https://myabapAddonAssemblyKitEndpoint.com',
|
||||||
|
addonDescriptorFileName: 'addon.yml'
|
||||||
|
```
|
@ -50,6 +50,7 @@ nav:
|
|||||||
- Extensibility: extensibility.md
|
- Extensibility: extensibility.md
|
||||||
- 'Library steps':
|
- 'Library steps':
|
||||||
- abapAddonAssemblyKitCheckCVs: steps/abapAddonAssemblyKitCheckCVs.md
|
- abapAddonAssemblyKitCheckCVs: steps/abapAddonAssemblyKitCheckCVs.md
|
||||||
|
- abapAddonAssemblyKitCheckCVs: steps/abapAddonAssemblyKitCheckPV.md
|
||||||
- abapEnvironmentAssemblePackages: steps/abapEnvironmentAssemblePackages.md
|
- abapEnvironmentAssemblePackages: steps/abapEnvironmentAssemblePackages.md
|
||||||
- abapEnvironmentCheckoutBranch: steps/abapEnvironmentCheckoutBranch.md
|
- abapEnvironmentCheckoutBranch: steps/abapEnvironmentCheckoutBranch.md
|
||||||
- abapEnvironmentCloneGitRepo: steps/abapEnvironmentCloneGitRepo.md
|
- abapEnvironmentCloneGitRepo: steps/abapEnvironmentCloneGitRepo.md
|
||||||
|
@ -9,7 +9,7 @@ spec:
|
|||||||
inputs:
|
inputs:
|
||||||
secrets:
|
secrets:
|
||||||
- name: abapAddonAssemblyKitCredentialsId
|
- name: abapAddonAssemblyKitCredentialsId
|
||||||
description: Credential stored in Jenkins for Addon Assembly Kit as a Service System (AAKaaS)
|
description: Credential stored in Jenkins for the Addon Assembly Kit as a Service (AAKaaS) system
|
||||||
type: jenkins
|
type: jenkins
|
||||||
params:
|
params:
|
||||||
- name: abapAddonAssemblyKitEndpoint
|
- name: abapAddonAssemblyKitEndpoint
|
||||||
@ -23,7 +23,7 @@ spec:
|
|||||||
mandatory: true
|
mandatory: true
|
||||||
- name: username
|
- name: username
|
||||||
type: string
|
type: string
|
||||||
description: User for the Addon Assembly Kit as a Service System (AAKaaS)
|
description: User for the Addon Assembly Kit as a Service (AAKaaS) system
|
||||||
scope:
|
scope:
|
||||||
- PARAMETERS
|
- PARAMETERS
|
||||||
- STAGES
|
- STAGES
|
||||||
@ -32,7 +32,7 @@ spec:
|
|||||||
secret: true
|
secret: true
|
||||||
- name: password
|
- name: password
|
||||||
type: string
|
type: string
|
||||||
description: Password the Addon Assembly Kit as a Service System (AAKaaS)
|
description: Password for the Addon Assembly Kit as a Service (AAKaaS) system
|
||||||
scope:
|
scope:
|
||||||
- PARAMETERS
|
- PARAMETERS
|
||||||
mandatory: true
|
mandatory: true
|
||||||
|
60
resources/metadata/abapAddonAssemblyKitCheckPV.yaml
Normal file
60
resources/metadata/abapAddonAssemblyKitCheckPV.yaml
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
metadata:
|
||||||
|
name: abapAddonAssemblyKitCheckPV
|
||||||
|
description: This step checks the validity of a Addon Product Version.
|
||||||
|
longDescription: |
|
||||||
|
This step checks whether the Addon Product Version in the addonDescriptorFileName does exist or is a valid successor of an existing Product Version.
|
||||||
|
It resolves the dotted version string into version, support package stack level and patch level and writes it to the commonPipelineEnvironment.
|
||||||
|
spec:
|
||||||
|
inputs:
|
||||||
|
secrets:
|
||||||
|
- name: abapAddonAssemblyKitCredentialsId
|
||||||
|
description: Credential stored in Jenkins for the Addon Assembly Kit as a Service (AAKaaS) system
|
||||||
|
type: jenkins
|
||||||
|
params:
|
||||||
|
- name: abapAddonAssemblyKitEndpoint
|
||||||
|
type: string
|
||||||
|
description: Base URL to the Addon Assembly Kit as a Service (AAKaaS) system
|
||||||
|
scope:
|
||||||
|
- PARAMETERS
|
||||||
|
- STAGES
|
||||||
|
- STEPS
|
||||||
|
- GENERAL
|
||||||
|
mandatory: true
|
||||||
|
- name: username
|
||||||
|
type: string
|
||||||
|
description: User for the Addon Assembly Kit as a Service (AAKaaS) system
|
||||||
|
scope:
|
||||||
|
- PARAMETERS
|
||||||
|
- STAGES
|
||||||
|
- STEPS
|
||||||
|
mandatory: true
|
||||||
|
secret: true
|
||||||
|
- name: password
|
||||||
|
type: string
|
||||||
|
description: Password for the Addon Assembly Kit as a Service (AAKaaS) system
|
||||||
|
scope:
|
||||||
|
- PARAMETERS
|
||||||
|
mandatory: true
|
||||||
|
secret: true
|
||||||
|
- name: addonDescriptorFileName
|
||||||
|
type: string
|
||||||
|
description: File name of the YAML file which describes the Product Version and corresponding Software Component Versions
|
||||||
|
mandatory: true
|
||||||
|
default: addon.yml
|
||||||
|
- name: addonDescriptor
|
||||||
|
type: string
|
||||||
|
description: Structure in the commonPipelineEnvironment containing information about the Product Version and corresponding Software Component Versions
|
||||||
|
mandatory: false
|
||||||
|
scope:
|
||||||
|
- PARAMETERS
|
||||||
|
- STAGES
|
||||||
|
- STEPS
|
||||||
|
resourceRef:
|
||||||
|
- name: commonPipelineEnvironment
|
||||||
|
param: abap/addonDescriptor
|
||||||
|
outputs:
|
||||||
|
resources:
|
||||||
|
- name: commonPipelineEnvironment
|
||||||
|
type: piperEnvironment
|
||||||
|
params:
|
||||||
|
- name: abap/addonDescriptor
|
@ -107,6 +107,7 @@ public class CommonStepsTest extends BasePiperTest{
|
|||||||
|
|
||||||
private static fieldRelatedWhitelist = [
|
private static fieldRelatedWhitelist = [
|
||||||
'abapAddonAssemblyKitCheckCVs', //implementing new golang pattern without fields
|
'abapAddonAssemblyKitCheckCVs', //implementing new golang pattern without fields
|
||||||
|
'abapAddonAssemblyKitCheckPV', //implementing new golang pattern without fields
|
||||||
'abapEnvironmentAssemblePackages', //implementing new golang pattern without fields
|
'abapEnvironmentAssemblePackages', //implementing new golang pattern without fields
|
||||||
'abapEnvironmentCheckoutBranch', //implementing new golang pattern without fields
|
'abapEnvironmentCheckoutBranch', //implementing new golang pattern without fields
|
||||||
'abapEnvironmentCloneGitRepo', //implementing new golang pattern without fields
|
'abapEnvironmentCloneGitRepo', //implementing new golang pattern without fields
|
||||||
|
11
vars/abapAddonAssemblyKitCheckPV.groovy
Normal file
11
vars/abapAddonAssemblyKitCheckPV.groovy
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import groovy.transform.Field
|
||||||
|
|
||||||
|
@Field String STEP_NAME = getClass().getName()
|
||||||
|
@Field String METADATA_FILE = 'metadata/abapAddonAssemblyKitCheckPV.yaml'
|
||||||
|
|
||||||
|
void call(Map parameters = [:]) {
|
||||||
|
List credentials = [
|
||||||
|
[type: 'usernamePassword', id: 'abapAddonAssemblyKitCredentialsId', env: ['PIPER_username', 'PIPER_password']]
|
||||||
|
]
|
||||||
|
piperExecuteBin(parameters, STEP_NAME, METADATA_FILE, credentials, false, false, true)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user