mirror of
https://github.com/SAP/jenkins-library.git
synced 2025-01-04 04:07:16 +02:00
AAKaaS: 7 reserve next package (#2046)
* 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 register package * AAKaaS register package #2 * Update documentation/docs/steps/abapAddonAssemblyKitPublishTargetVector.md Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com> * AAKaaS register package #3 * AAKaaS release package * Update abapAddonAssemblyKitReleasePackages.go * AAKaas release package #2 * AAKaaS reserve * AAKaaS reserve #2 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
3c87648c00
commit
fa17611a59
123
cmd/abapAddonAssemblyKitReserveNextPackages.go
Normal file
123
cmd/abapAddonAssemblyKitReserveNextPackages.go
Normal file
@ -0,0 +1,123 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/SAP/jenkins-library/pkg/abap/aakaas"
|
||||
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"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func abapAddonAssemblyKitReserveNextPackages(config abapAddonAssemblyKitReserveNextPackagesOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment) {
|
||||
// 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{}
|
||||
maxRuntimeInMinutes := time.Duration(5 * time.Minute)
|
||||
pollIntervalsInSeconds := time.Duration(30 * time.Second)
|
||||
// error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end
|
||||
err := runAbapAddonAssemblyKitReserveNextPackages(&config, telemetryData, &client, cpe, maxRuntimeInMinutes, pollIntervalsInSeconds)
|
||||
if err != nil {
|
||||
log.Entry().WithError(err).Fatal("step execution failed")
|
||||
}
|
||||
}
|
||||
|
||||
func runAbapAddonAssemblyKitReserveNextPackages(config *abapAddonAssemblyKitReserveNextPackagesOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender,
|
||||
cpe *abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment, maxRuntimeInMinutes time.Duration, pollIntervalsInSeconds time.Duration) error {
|
||||
conn := new(abapbuild.Connector)
|
||||
conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client)
|
||||
|
||||
var addonDescriptor abaputils.AddonDescriptor
|
||||
json.Unmarshal([]byte(config.AddonDescriptor), &addonDescriptor)
|
||||
|
||||
packagesWithRepos, err := reservePackages(addonDescriptor.Repositories, *conn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = pollReserveNextPackages(packagesWithRepos, maxRuntimeInMinutes, pollIntervalsInSeconds)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
addonDescriptor.Repositories = copyFieldsToRepositories(packagesWithRepos)
|
||||
log.Entry().Info("Writing package names, types, status, namespace and predecessorCommitID to CommonPipelineEnvironment")
|
||||
backToCPE, _ := json.Marshal(addonDescriptor)
|
||||
cpe.abap.addonDescriptor = string(backToCPE)
|
||||
return nil
|
||||
}
|
||||
|
||||
func copyFieldsToRepositories(pckgWR []aakaas.PackageWithRepository) []abaputils.Repository {
|
||||
var repos []abaputils.Repository
|
||||
for i := range pckgWR {
|
||||
pckgWR[i].Package.CopyFieldsToRepo(&pckgWR[i].Repo)
|
||||
repos = append(repos, pckgWR[i].Repo)
|
||||
}
|
||||
return repos
|
||||
}
|
||||
|
||||
func pollReserveNextPackages(pckgWR []aakaas.PackageWithRepository, maxRuntimeInMinutes time.Duration, pollIntervalsInSeconds time.Duration) error {
|
||||
timeout := time.After(maxRuntimeInMinutes)
|
||||
ticker := time.Tick(pollIntervalsInSeconds)
|
||||
for {
|
||||
select {
|
||||
case <-timeout:
|
||||
return errors.New("Timed out")
|
||||
case <-ticker:
|
||||
var allFinished bool = true
|
||||
for i := range pckgWR {
|
||||
err := pckgWR[i].Package.GetPackageAndNamespace()
|
||||
// if there is an error, reservation is not yet finished
|
||||
if err != nil {
|
||||
log.Entry().Infof("Reservation of %s is not yet finished, check again in %s", pckgWR[i].Package.PackageName, pollIntervalsInSeconds)
|
||||
allFinished = false
|
||||
} else {
|
||||
switch pckgWR[i].Package.Status {
|
||||
case aakaas.PackageStatusLocked:
|
||||
return fmt.Errorf("Package %s has invalid status 'locked'", pckgWR[i].Package.PackageName)
|
||||
case aakaas.PackageStatusCreationTriggered:
|
||||
log.Entry().Infof("Reservation of %s is still running with status 'creation triggered', check again in %s", pckgWR[i].Package.PackageName, pollIntervalsInSeconds)
|
||||
allFinished = false
|
||||
case aakaas.PackageStatusPlanned:
|
||||
log.Entry().Infof("Reservation of %s was succesful with status 'planned'", pckgWR[i].Package.PackageName)
|
||||
case aakaas.PackageStatusReleased:
|
||||
log.Entry().Infof("Reservation of %s not needed, package is already in status 'released'", pckgWR[i].Package.PackageName)
|
||||
default:
|
||||
return fmt.Errorf("Package %s has unknown status '%s'", pckgWR[i].Package.PackageName, pckgWR[i].Package.Status)
|
||||
}
|
||||
}
|
||||
}
|
||||
if allFinished {
|
||||
log.Entry().Infof("Reservation of package(s) was succesful")
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func reservePackages(repositories []abaputils.Repository, conn abapbuild.Connector) ([]aakaas.PackageWithRepository, error) {
|
||||
var packagesWithRepos []aakaas.PackageWithRepository
|
||||
for i := range repositories {
|
||||
var p aakaas.Package
|
||||
p.InitPackage(repositories[i], conn)
|
||||
err := p.ReserveNext()
|
||||
if err != nil {
|
||||
return packagesWithRepos, err
|
||||
}
|
||||
pWR := aakaas.PackageWithRepository{
|
||||
Package: p,
|
||||
Repo: repositories[i],
|
||||
}
|
||||
packagesWithRepos = append(packagesWithRepos, pWR)
|
||||
}
|
||||
return packagesWithRepos, nil
|
||||
}
|
180
cmd/abapAddonAssemblyKitReserveNextPackages_generated.go
Normal file
180
cmd/abapAddonAssemblyKitReserveNextPackages_generated.go
Normal file
@ -0,0 +1,180 @@
|
||||
// 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 abapAddonAssemblyKitReserveNextPackagesOptions struct {
|
||||
AbapAddonAssemblyKitEndpoint string `json:"abapAddonAssemblyKitEndpoint,omitempty"`
|
||||
Username string `json:"username,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
AddonDescriptor string `json:"addonDescriptor,omitempty"`
|
||||
}
|
||||
|
||||
type abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment struct {
|
||||
abap struct {
|
||||
addonDescriptor string
|
||||
}
|
||||
}
|
||||
|
||||
func (p *abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment) 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")
|
||||
}
|
||||
}
|
||||
|
||||
// AbapAddonAssemblyKitReserveNextPackagesCommand This step determines the ABAP delivery packages (name and type), which are needed to deliver Software Component Versions.
|
||||
func AbapAddonAssemblyKitReserveNextPackagesCommand() *cobra.Command {
|
||||
const STEP_NAME = "abapAddonAssemblyKitReserveNextPackages"
|
||||
|
||||
metadata := abapAddonAssemblyKitReserveNextPackagesMetadata()
|
||||
var stepConfig abapAddonAssemblyKitReserveNextPackagesOptions
|
||||
var startTime time.Time
|
||||
var commonPipelineEnvironment abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment
|
||||
|
||||
var createAbapAddonAssemblyKitReserveNextPackagesCmd = &cobra.Command{
|
||||
Use: STEP_NAME,
|
||||
Short: "This step determines the ABAP delivery packages (name and type), which are needed to deliver Software Component Versions.",
|
||||
Long: `This step takes the list of Software Component Versions from the addonDescriptor in the commonPipelineEnvironment and determines the ABAP delivery packages.
|
||||
If a package does not exist yet in the package registry, it is created there. The response contains detail information for this package and a package status, which determines the next actions:
|
||||
"P": Package was created in the registry; production can be started / continued
|
||||
"R": Package exists and is already released; production is not needed and must be skipped
|
||||
The steps waits until the status "P" or "R" is achieved.
|
||||
The name, type and namespace of each package is written back to the addonDescriptor in 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)
|
||||
abapAddonAssemblyKitReserveNextPackages(stepConfig, &telemetryData, &commonPipelineEnvironment)
|
||||
telemetryData.ErrorCode = "0"
|
||||
log.Entry().Info("SUCCESS")
|
||||
},
|
||||
}
|
||||
|
||||
addAbapAddonAssemblyKitReserveNextPackagesFlags(createAbapAddonAssemblyKitReserveNextPackagesCmd, &stepConfig)
|
||||
return createAbapAddonAssemblyKitReserveNextPackagesCmd
|
||||
}
|
||||
|
||||
func addAbapAddonAssemblyKitReserveNextPackagesFlags(cmd *cobra.Command, stepConfig *abapAddonAssemblyKitReserveNextPackagesOptions) {
|
||||
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.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("addonDescriptor")
|
||||
}
|
||||
|
||||
// retrieve step metadata
|
||||
func abapAddonAssemblyKitReserveNextPackagesMetadata() config.StepData {
|
||||
var theMetaData = config.StepData{
|
||||
Metadata: config.StepMetadata{
|
||||
Name: "abapAddonAssemblyKitReserveNextPackages",
|
||||
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: "addonDescriptor",
|
||||
ResourceRef: []config.ResourceReference{
|
||||
{
|
||||
Name: "commonPipelineEnvironment",
|
||||
Param: "abap/addonDescriptor",
|
||||
},
|
||||
},
|
||||
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
|
||||
Type: "string",
|
||||
Mandatory: true,
|
||||
Aliases: []config.Alias{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
return theMetaData
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestAbapAddonAssemblyKitReserveNextPackagesCommand(t *testing.T) {
|
||||
|
||||
testCmd := AbapAddonAssemblyKitReserveNextPackagesCommand()
|
||||
|
||||
// only high level testing performed - details are tested in step generation procedure
|
||||
assert.Equal(t, "abapAddonAssemblyKitReserveNextPackages", testCmd.Use, "command name incorrect")
|
||||
|
||||
}
|
421
cmd/abapAddonAssemblyKitReserveNextPackages_test.go
Normal file
421
cmd/abapAddonAssemblyKitReserveNextPackages_test.go
Normal file
@ -0,0 +1,421 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/SAP/jenkins-library/pkg/abap/aakaas"
|
||||
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 TestReserveNextPackagesStep(t *testing.T) {
|
||||
var config abapAddonAssemblyKitReserveNextPackagesOptions
|
||||
var cpe abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment
|
||||
timeout := time.Duration(5 * time.Second)
|
||||
pollInterval := time.Duration(1 * time.Second)
|
||||
t.Run("step success", func(t *testing.T) {
|
||||
addonDescriptor := abaputils.AddonDescriptor{
|
||||
Repositories: []abaputils.Repository{
|
||||
{
|
||||
Name: "/DRNMSPC/COMP01",
|
||||
VersionYAML: "1.0.0.",
|
||||
},
|
||||
{
|
||||
Name: "/DRNMSPC/COMP02",
|
||||
VersionYAML: "1.0.0.",
|
||||
},
|
||||
},
|
||||
}
|
||||
adoDesc, _ := json.Marshal(addonDescriptor)
|
||||
config.AddonDescriptor = string(adoDesc)
|
||||
|
||||
client := &abaputils.ClientMock{
|
||||
BodyList: []string{responseReserveNextPackageReleased, responseReserveNextPackagePlanned, responseReserveNextPackagePostReleased, "myToken", responseReserveNextPackagePostPlanned, "myToken"},
|
||||
}
|
||||
err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, client, &cpe, timeout, pollInterval)
|
||||
|
||||
assert.NoError(t, err, "Did not expect error")
|
||||
var addonDescriptorFinal abaputils.AddonDescriptor
|
||||
json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal)
|
||||
assert.Equal(t, "P", addonDescriptorFinal.Repositories[0].Status)
|
||||
assert.Equal(t, "R", addonDescriptorFinal.Repositories[1].Status)
|
||||
})
|
||||
t.Run("step error - invalid input", func(t *testing.T) {
|
||||
addonDescriptor := abaputils.AddonDescriptor{
|
||||
Repositories: []abaputils.Repository{
|
||||
{
|
||||
Name: "/DRNMSPC/COMP01",
|
||||
},
|
||||
},
|
||||
}
|
||||
adoDesc, _ := json.Marshal(addonDescriptor)
|
||||
config.AddonDescriptor = string(adoDesc)
|
||||
|
||||
client := &abaputils.ClientMock{}
|
||||
err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, client, &cpe, timeout, pollInterval)
|
||||
assert.Error(t, err, "Did expect error")
|
||||
})
|
||||
t.Run("step error - timeout", func(t *testing.T) {
|
||||
addonDescriptor := abaputils.AddonDescriptor{
|
||||
Repositories: []abaputils.Repository{
|
||||
{
|
||||
Name: "/DRNMSPC/COMP01",
|
||||
VersionYAML: "1.0.0.",
|
||||
},
|
||||
},
|
||||
}
|
||||
adoDesc, _ := json.Marshal(addonDescriptor)
|
||||
config.AddonDescriptor = string(adoDesc)
|
||||
|
||||
client := &abaputils.ClientMock{
|
||||
BodyList: []string{responseReserveNextPackageCreationTriggered, responseReserveNextPackagePostPlanned, "myToken"},
|
||||
}
|
||||
timeout := time.Duration(1 * time.Second)
|
||||
err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, client, &cpe, timeout, pollInterval)
|
||||
assert.Error(t, err, "Did expect error")
|
||||
})
|
||||
}
|
||||
|
||||
// ********************* Test init *******************
|
||||
func TestInitPackage(t *testing.T) {
|
||||
t.Run("test init", func(t *testing.T) {
|
||||
conn := new(abapbuild.Connector)
|
||||
conn.Client = &abaputils.ClientMock{}
|
||||
repo := abaputils.Repository{
|
||||
Name: "/DRNMSPC/COMP01",
|
||||
VersionYAML: "1.0.0",
|
||||
}
|
||||
var p aakaas.Package
|
||||
p.InitPackage(repo, *conn)
|
||||
assert.Equal(t, "/DRNMSPC/COMP01", p.ComponentName)
|
||||
assert.Equal(t, "1.0.0", p.VersionYAML)
|
||||
})
|
||||
}
|
||||
|
||||
// ********************* Test copyFieldsToRepositories *******************
|
||||
func TestCopyFieldsToRepositoriesPackage(t *testing.T) {
|
||||
t.Run("test copyFieldsToRepositories", func(t *testing.T) {
|
||||
pckgWR := []aakaas.PackageWithRepository{
|
||||
{
|
||||
Package: aakaas.Package{
|
||||
ComponentName: "/DRNMSPC/COMP01",
|
||||
VersionYAML: "1.0.0",
|
||||
PackageName: "SAPK-001AAINDRNMSPC",
|
||||
Type: "AOI",
|
||||
Status: aakaas.PackageStatusPlanned,
|
||||
Namespace: "/DRNMSPC/",
|
||||
},
|
||||
Repo: abaputils.Repository{
|
||||
Name: "/DRNMSPC/COMP01",
|
||||
VersionYAML: "1.0.0",
|
||||
},
|
||||
},
|
||||
}
|
||||
repos := copyFieldsToRepositories(pckgWR)
|
||||
assert.Equal(t, "SAPK-001AAINDRNMSPC", repos[0].PackageName)
|
||||
assert.Equal(t, "AOI", repos[0].PackageType)
|
||||
assert.Equal(t, string(aakaas.PackageStatusPlanned), repos[0].Status)
|
||||
assert.Equal(t, "/DRNMSPC/", repos[0].Namespace)
|
||||
})
|
||||
}
|
||||
|
||||
// ********************* Test reserveNext *******************
|
||||
func TestReserveNextPackage(t *testing.T) {
|
||||
t.Run("test reserveNext - success", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
Body: responseReserveNextPackagePostPlanned,
|
||||
}
|
||||
p := testPackageSetup("/DRNMSPC/COMP01", "1.0.0", client)
|
||||
|
||||
err := p.ReserveNext()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "SAPK-001AAINDRNMSPC", p.PackageName)
|
||||
assert.Equal(t, "AOI", p.Type)
|
||||
assert.Equal(t, aakaas.PackageStatusPlanned, p.Status)
|
||||
})
|
||||
t.Run("test reserveNext - missing versionYAML", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{}
|
||||
p := testPackageSetup("/DRNMSPC/COMP01", "", client)
|
||||
err := p.ReserveNext()
|
||||
assert.Error(t, err)
|
||||
assert.Equal(t, "", p.PackageName)
|
||||
assert.Equal(t, "", p.Type)
|
||||
assert.Equal(t, aakaas.PackageStatus(""), p.Status)
|
||||
})
|
||||
t.Run("test reserveNext - error from call", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
Body: "ErrorBody",
|
||||
Error: errors.New("Failure during reserve next"),
|
||||
}
|
||||
p := testPackageSetup("/DRNMSPC/COMP01", "1.0.0", client)
|
||||
err := p.ReserveNext()
|
||||
assert.Error(t, err)
|
||||
assert.Equal(t, "", p.PackageName)
|
||||
assert.Equal(t, "", p.Type)
|
||||
assert.Equal(t, aakaas.PackageStatus(""), p.Status)
|
||||
})
|
||||
}
|
||||
|
||||
// ********************* Test reservePackages *******************
|
||||
|
||||
func TestReservePackages(t *testing.T) {
|
||||
t.Run("test reservePackages - success", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
Body: responseReserveNextPackagePostPlanned,
|
||||
}
|
||||
repositories, conn := testRepositoriesSetup("/DRNMSPC/COMP01", "1.0.0", client)
|
||||
repos, err := reservePackages(repositories, conn)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "/DRNMSPC/COMP01", repos[0].Package.ComponentName)
|
||||
assert.Equal(t, "1.0.0", repos[0].Package.VersionYAML)
|
||||
assert.Equal(t, aakaas.PackageStatusPlanned, repos[0].Package.Status)
|
||||
})
|
||||
t.Run("test reservePackages - error from call", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
Body: "ErrorBody",
|
||||
Error: errors.New("Failure during reserve next"),
|
||||
}
|
||||
repositories, conn := testRepositoriesSetup("/DRNMSPC/COMP01", "1.0.0", client)
|
||||
_, err := reservePackages(repositories, conn)
|
||||
assert.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
// ********************* Test pollReserveNextPackages *******************
|
||||
|
||||
func TestPollReserveNextPackages(t *testing.T) {
|
||||
timeout := time.Duration(5 * time.Second)
|
||||
pollInterval := time.Duration(1 * time.Second)
|
||||
t.Run("test pollReserveNextPackages - testing loop", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
BodyList: []string{responseReserveNextPackagePlanned, responseReserveNextPackageCreationTriggered},
|
||||
}
|
||||
pckgWR := testPollPackagesSetup(client)
|
||||
err := pollReserveNextPackages(pckgWR, timeout, pollInterval)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, aakaas.PackageStatusPlanned, pckgWR[0].Package.Status)
|
||||
assert.Equal(t, "/DRNMSPC/", pckgWR[0].Package.Namespace)
|
||||
})
|
||||
t.Run("test pollReserveNextPackages - status locked", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
Body: responseReserveNextPackageLocked,
|
||||
}
|
||||
pckgWR := testPollPackagesSetup(client)
|
||||
err := pollReserveNextPackages(pckgWR, timeout, pollInterval)
|
||||
assert.Error(t, err)
|
||||
assert.Equal(t, aakaas.PackageStatusLocked, pckgWR[0].Package.Status)
|
||||
})
|
||||
t.Run("test pollReserveNextPackages - status released", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
Body: responseReserveNextPackageReleased,
|
||||
}
|
||||
pckgWR := testPollPackagesSetup(client)
|
||||
err := pollReserveNextPackages(pckgWR, timeout, pollInterval)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, aakaas.PackageStatusReleased, pckgWR[0].Package.Status)
|
||||
})
|
||||
t.Run("test pollReserveNextPackages - unknow status", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
Body: responseReserveNextPackageUnknownState,
|
||||
}
|
||||
pckgWR := testPollPackagesSetup(client)
|
||||
err := pollReserveNextPackages(pckgWR, timeout, pollInterval)
|
||||
assert.Error(t, err)
|
||||
assert.Equal(t, aakaas.PackageStatus("X"), pckgWR[0].Package.Status)
|
||||
})
|
||||
t.Run("test pollReserveNextPackages - timeout", func(t *testing.T) {
|
||||
client := abaputils.ClientMock{
|
||||
Body: "ErrorBody",
|
||||
Error: errors.New("Failure during reserve next"),
|
||||
}
|
||||
pckgWR := testPollPackagesSetup(client)
|
||||
timeout := time.Duration(2 * time.Second)
|
||||
err := pollReserveNextPackages(pckgWR, timeout, pollInterval)
|
||||
assert.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
// ********************* Setup functions *******************
|
||||
|
||||
func testPollPackagesSetup(client abaputils.ClientMock) []aakaas.PackageWithRepository {
|
||||
conn := new(abapbuild.Connector)
|
||||
conn.Client = &client
|
||||
conn.Header = make(map[string][]string)
|
||||
pckgWR := []aakaas.PackageWithRepository{
|
||||
{
|
||||
Package: aakaas.Package{
|
||||
Connector: *conn,
|
||||
ComponentName: "/DRNMSPC/COMP01",
|
||||
VersionYAML: "1.0.0",
|
||||
PackageName: "SAPK-001AAINDRNMSPC",
|
||||
Type: "AOI",
|
||||
},
|
||||
Repo: abaputils.Repository{},
|
||||
},
|
||||
}
|
||||
return pckgWR
|
||||
}
|
||||
|
||||
func testRepositoriesSetup(componentName string, versionYAML string, client abaputils.ClientMock) ([]abaputils.Repository, abapbuild.Connector) {
|
||||
conn := new(abapbuild.Connector)
|
||||
conn.Client = &client
|
||||
conn.Header = make(map[string][]string)
|
||||
repositories := []abaputils.Repository{
|
||||
{
|
||||
Name: componentName,
|
||||
VersionYAML: versionYAML,
|
||||
},
|
||||
}
|
||||
return repositories, *conn
|
||||
}
|
||||
|
||||
func testPackageSetup(componentName string, versionYAML string, client abaputils.ClientMock) aakaas.Package {
|
||||
conn := new(abapbuild.Connector)
|
||||
conn.Client = &client
|
||||
conn.Header = make(map[string][]string)
|
||||
p := aakaas.Package{
|
||||
Connector: *conn,
|
||||
ComponentName: componentName,
|
||||
VersionYAML: versionYAML,
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
// ********************* Testdata *******************
|
||||
|
||||
var responseReserveNextPackagePostPlanned = `{
|
||||
"d": {
|
||||
"DeterminePackageForScv": {
|
||||
"__metadata": {
|
||||
"type": "SSDA.AAS_ODATA_PACKAGE_SRV.PackageExtended"
|
||||
},
|
||||
"Name": "SAPK-001AAINDRNMSPC",
|
||||
"Type": "AOI",
|
||||
"ScName": "/DRNMSPC/COMP01",
|
||||
"ScVersion": "0001",
|
||||
"SpLevel": "0000",
|
||||
"PatchLevel": "0000",
|
||||
"Predecessor": "",
|
||||
"PredecessorCommitId": "",
|
||||
"Status": "P"
|
||||
}
|
||||
}
|
||||
}`
|
||||
|
||||
var responseReserveNextPackagePostReleased = `{
|
||||
"d": {
|
||||
"DeterminePackageForScv": {
|
||||
"__metadata": {
|
||||
"type": "SSDA.AAS_ODATA_PACKAGE_SRV.PackageExtended"
|
||||
},
|
||||
"Name": "SAPK-001AAINDRNMSPC",
|
||||
"Type": "AOI",
|
||||
"ScName": "/DRNMSPC/COMP02",
|
||||
"ScVersion": "0001",
|
||||
"SpLevel": "0000",
|
||||
"PatchLevel": "0000",
|
||||
"Predecessor": "",
|
||||
"PredecessorCommitId": "",
|
||||
"Status": "R"
|
||||
}
|
||||
}
|
||||
}`
|
||||
|
||||
var responseReserveNextPackageCreationTriggered = `{
|
||||
"d": {
|
||||
"__metadata": {
|
||||
"id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
|
||||
},
|
||||
"Name": "SAPK-001AAINDRNMSPC",
|
||||
"Type": "AOI",
|
||||
"Component": "/DRNMSPC/COMP01",
|
||||
"Release": "0001",
|
||||
"Level": "0000",
|
||||
"Status": "C",
|
||||
"Operation": "",
|
||||
"Namespace": "/DRNMSPC/",
|
||||
"Vendorid": "0000203069"
|
||||
}
|
||||
}`
|
||||
|
||||
var responseReserveNextPackageLocked = `{
|
||||
"d": {
|
||||
"__metadata": {
|
||||
"id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
|
||||
},
|
||||
"Name": "SAPK-001AAINDRNMSPC",
|
||||
"Type": "AOI",
|
||||
"Component": "/DRNMSPC/COMP01",
|
||||
"Release": "0001",
|
||||
"Level": "0000",
|
||||
"Status": "L",
|
||||
"Operation": "",
|
||||
"Namespace": "/DRNMSPC/",
|
||||
"Vendorid": "0000203069"
|
||||
}
|
||||
}`
|
||||
|
||||
var responseReserveNextPackagePlanned = `{
|
||||
"d": {
|
||||
"__metadata": {
|
||||
"id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
|
||||
},
|
||||
"Name": "SAPK-001AAINDRNMSPC",
|
||||
"Type": "AOI",
|
||||
"Component": "/DRNMSPC/COMP01",
|
||||
"Release": "0001",
|
||||
"Level": "0000",
|
||||
"Status": "P",
|
||||
"Operation": "",
|
||||
"Namespace": "/DRNMSPC/",
|
||||
"Vendorid": "0000203069"
|
||||
}
|
||||
}`
|
||||
|
||||
var responseReserveNextPackageReleased = `{
|
||||
"d": {
|
||||
"__metadata": {
|
||||
"id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
|
||||
},
|
||||
"Name": "SAPK-001AAINDRNMSPC",
|
||||
"Type": "AOI",
|
||||
"Component": "/DRNMSPC/COMP01",
|
||||
"Release": "0001",
|
||||
"Level": "0000",
|
||||
"Status": "R",
|
||||
"Operation": "",
|
||||
"Namespace": "/DRNMSPC/",
|
||||
"Vendorid": "0000203069"
|
||||
}
|
||||
}`
|
||||
|
||||
var responseReserveNextPackageUnknownState = `{
|
||||
"d": {
|
||||
"__metadata": {
|
||||
"id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
|
||||
"type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
|
||||
},
|
||||
"Name": "SAPK-001AAINDRNMSPC",
|
||||
"Type": "AOI",
|
||||
"Component": "/DRNMSPC/COMP01",
|
||||
"Release": "0001",
|
||||
"Level": "0000",
|
||||
"Status": "X",
|
||||
"Operation": "",
|
||||
"Namespace": "/DRNMSPC/",
|
||||
"Vendorid": "0000203069"
|
||||
}
|
||||
}`
|
@ -111,7 +111,7 @@ func Execute() {
|
||||
rootCmd.AddCommand(AbapAddonAssemblyKitPublishTargetVectorCommand())
|
||||
rootCmd.AddCommand(AbapAddonAssemblyKitRegisterPackagesCommand())
|
||||
rootCmd.AddCommand(AbapAddonAssemblyKitReleasePackagesCommand())
|
||||
// rootCmd.AddCommand(AbapAddonAssemblyKitReserveNextPackagesCommand())
|
||||
rootCmd.AddCommand(AbapAddonAssemblyKitReserveNextPackagesCommand())
|
||||
|
||||
addRootFlags(rootCmd)
|
||||
if err := rootCmd.Execute(); err != nil {
|
||||
|
@ -0,0 +1,83 @@
|
||||
# ${docGenStepName}
|
||||
|
||||
## ${docGenDescription}
|
||||
|
||||
## Prerequisites
|
||||
|
||||
* The credentials to access the AAKaaS (e.g. S-User) must be stored in the Jenkins Credential Store
|
||||
* The step needs information about the Software Component Versions for which packages should be reserved.
|
||||
* This information is provided via the addonDescriptor in the commonPipelineEnvironment where the fields 'name' and 'version' in the repositories list need to be filled.
|
||||
* The Software Component Versions must be valid.
|
||||
* The validation is performed and the required information is written to the CommonPipelineEnvironment if you run prior to this step the step [abapAddonAssemblyKitCheckCVs](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitCheckCVs)
|
||||
|
||||
## ${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
|
||||
abapAddonAssemblyKitReserveNextPackages script: this
|
||||
```
|
||||
|
||||
The config.yml should look like this:
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
abapAddonAssemblyKitReserveNextPackages:
|
||||
abapAddonAssemblyKitCredentialsId: 'abapAddonAssemblyKitCredentialsId',
|
||||
abapAddonAssemblyKitEndpoint: 'https://myabapAddonAssemblyKitEndpoint.com',
|
||||
```
|
||||
|
||||
### Input via the CommonPipelineEnvironment
|
||||
|
||||
Mandatory fields:
|
||||
|
||||
```json
|
||||
{"addonProduct":"",
|
||||
"addonVersion":"",
|
||||
"addonVersionAAK":"",
|
||||
"addonUniqueID":"",
|
||||
"customerID":"",
|
||||
"AddonSpsLevel":"",
|
||||
"AddonPatchLevel":"",
|
||||
"TargetVectorID":"",
|
||||
"repositories":[
|
||||
{
|
||||
"name":"/DMO/REPO_A",
|
||||
"tag":"",
|
||||
"branch":"",
|
||||
"version":"1.0.1",
|
||||
"versionAAK":"",
|
||||
"PackageName":"",
|
||||
"PackageType":"",
|
||||
"SpLevel":"",
|
||||
"PatchLevel":"",
|
||||
"PredecessorCommitID":"",
|
||||
"Status":"",
|
||||
"Namespace":"",
|
||||
"SarXMLFilePath":""
|
||||
},
|
||||
{
|
||||
"name":"/DMO/REPO_B",
|
||||
"tag":"",
|
||||
"branch":"",
|
||||
"version":"2.1.1",
|
||||
"versionAAK":"",
|
||||
"PackageName":"",
|
||||
"PackageType":"",
|
||||
"SpLevel":"",
|
||||
"PatchLevel":"",
|
||||
"PredecessorCommitID":"",
|
||||
"Status":"",
|
||||
"Namespace":"",
|
||||
"SarXMLFilePath":""
|
||||
}
|
||||
]}
|
||||
```
|
@ -55,7 +55,7 @@ nav:
|
||||
- abapAddonAssemblyKitPublishTargetVector: steps/abapAddonAssemblyKitPublishTargetVector.md
|
||||
- abapAddonAssemblyKitRegisterPackages: steps/abapAddonAssemblyKitRegisterPackages.md
|
||||
- abapAddonAssemblyKitReleasePackages: steps/abapAddonAssemblyKitReleasePackages.md
|
||||
# - abapAddonAssemblyKitReserveNextPackages: steps/abapAddonAssemblyKitReserveNextPackages.md
|
||||
- abapAddonAssemblyKitReserveNextPackages: steps/abapAddonAssemblyKitReserveNextPackages.md
|
||||
- abapEnvironmentAssemblePackages: steps/abapEnvironmentAssemblePackages.md
|
||||
- abapEnvironmentCheckoutBranch: steps/abapEnvironmentCheckoutBranch.md
|
||||
- abapEnvironmentCloneGitRepo: steps/abapEnvironmentCloneGitRepo.md
|
||||
|
@ -0,0 +1,59 @@
|
||||
metadata:
|
||||
name: abapAddonAssemblyKitReserveNextPackages
|
||||
description: This step determines the ABAP delivery packages (name and type), which are needed to deliver Software Component Versions.
|
||||
longDescription: |
|
||||
This step takes the list of Software Component Versions from the addonDescriptor in the commonPipelineEnvironment and determines the ABAP delivery packages.
|
||||
If a package does not exist yet in the package registry, it is created there. The response contains detail information for this package and a package status, which determines the next actions:
|
||||
"P": Package was created in the registry; production can be started / continued
|
||||
"R": Package exists and is already released; production is not needed and must be skipped
|
||||
The steps waits until the status "P" or "R" is achieved.
|
||||
The name, type and namespace of each package is written back to the addonDescriptor in 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: addonDescriptor
|
||||
type: string
|
||||
description: Structure in the commonPipelineEnvironment containing information about the Product Version and corresponding Software Component Versions
|
||||
mandatory: true
|
||||
scope:
|
||||
- PARAMETERS
|
||||
- STAGES
|
||||
- STEPS
|
||||
resourceRef:
|
||||
- name: commonPipelineEnvironment
|
||||
param: abap/addonDescriptor
|
||||
outputs:
|
||||
resources:
|
||||
- name: commonPipelineEnvironment
|
||||
type: piperEnvironment
|
||||
params:
|
||||
- name: abap/addonDescriptor
|
@ -112,7 +112,7 @@ public class CommonStepsTest extends BasePiperTest{
|
||||
'abapAddonAssemblyKitPublishTargetVector', //implementing new golang pattern without fields
|
||||
'abapAddonAssemblyKitRegisterPackages', //implementing new golang pattern without fields
|
||||
'abapAddonAssemblyKitReleasePackages', //implementing new golang pattern without fields
|
||||
//'abapAddonAssemblyKitReserveNextPackages', //implementing new golang pattern without fields
|
||||
'abapAddonAssemblyKitReserveNextPackages', //implementing new golang pattern without fields
|
||||
'abapEnvironmentAssemblePackages', //implementing new golang pattern without fields
|
||||
'abapEnvironmentCheckoutBranch', //implementing new golang pattern without fields
|
||||
'abapEnvironmentCloneGitRepo', //implementing new golang pattern without fields
|
||||
|
11
vars/abapAddonAssemblyKitReserveNextPackages.groovy
Normal file
11
vars/abapAddonAssemblyKitReserveNextPackages.groovy
Normal file
@ -0,0 +1,11 @@
|
||||
import groovy.transform.Field
|
||||
|
||||
@Field String STEP_NAME = getClass().getName()
|
||||
@Field String METADATA_FILE = 'metadata/abapAddonAssemblyKitReserveNextPackages.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…
Reference in New Issue
Block a user