You've already forked sap-jenkins-library
mirror of
https://github.com/SAP/jenkins-library.git
synced 2025-09-16 09:26:22 +02:00
AAKaaS: 6 release package (#2043)
* 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 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:
125
cmd/abapAddonAssemblyKitReleasePackages.go
Normal file
125
cmd/abapAddonAssemblyKitReleasePackages.go
Normal file
@@ -0,0 +1,125 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"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 abapAddonAssemblyKitReleasePackages(config abapAddonAssemblyKitReleasePackagesOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitReleasePackagesCommonPipelineEnvironment) {
|
||||
// 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 := runAbapAddonAssemblyKitReleasePackages(&config, telemetryData, &client, cpe, maxRuntimeInMinutes, pollIntervalsInSeconds)
|
||||
if err != nil {
|
||||
log.Entry().WithError(err).Fatal("step execution failed")
|
||||
}
|
||||
}
|
||||
|
||||
func runAbapAddonAssemblyKitReleasePackages(config *abapAddonAssemblyKitReleasePackagesOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender,
|
||||
cpe *abapAddonAssemblyKitReleasePackagesCommonPipelineEnvironment, 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)
|
||||
|
||||
err := checkInput(addonDescriptor.Repositories)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
packagesWithReposLocked, packagesWithReposNotLocked := sortByStatus(addonDescriptor.Repositories, *conn)
|
||||
packagesWithReposLocked, err = releaseAndPoll(packagesWithReposLocked, maxRuntimeInMinutes, pollIntervalsInSeconds)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
addonDescriptor.Repositories = sortingBack(packagesWithReposLocked, packagesWithReposNotLocked)
|
||||
log.Entry().Info("Writing package status to CommonPipelineEnvironment")
|
||||
backToCPE, _ := json.Marshal(addonDescriptor)
|
||||
cpe.abap.addonDescriptor = string(backToCPE)
|
||||
return nil
|
||||
}
|
||||
|
||||
func sortingBack(packagesWithReposLocked []aakaas.PackageWithRepository, packagesWithReposNotLocked []aakaas.PackageWithRepository) []abaputils.Repository {
|
||||
var combinedRepos []abaputils.Repository
|
||||
for i := range packagesWithReposLocked {
|
||||
packagesWithReposLocked[i].Package.ChangeStatus(&packagesWithReposLocked[i].Repo)
|
||||
combinedRepos = append(combinedRepos, packagesWithReposLocked[i].Repo)
|
||||
}
|
||||
for i := range packagesWithReposNotLocked {
|
||||
combinedRepos = append(combinedRepos, packagesWithReposNotLocked[i].Repo)
|
||||
}
|
||||
return combinedRepos
|
||||
}
|
||||
|
||||
func checkInput(repos []abaputils.Repository) error {
|
||||
for i := range repos {
|
||||
if repos[i].PackageName == "" {
|
||||
return errors.New("Parameter missing. Please provide the name of the package which should be released")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func sortByStatus(repos []abaputils.Repository, conn abapbuild.Connector) ([]aakaas.PackageWithRepository, []aakaas.PackageWithRepository) {
|
||||
var packagesWithReposLocked []aakaas.PackageWithRepository
|
||||
var packagesWithReposNotLocked []aakaas.PackageWithRepository
|
||||
for i := range repos {
|
||||
var pack aakaas.Package
|
||||
pack.InitPackage(repos[i], conn)
|
||||
pWR := aakaas.PackageWithRepository{
|
||||
Package: pack,
|
||||
Repo: repos[i],
|
||||
}
|
||||
if pack.Status == "L" {
|
||||
packagesWithReposLocked = append(packagesWithReposLocked, pWR)
|
||||
} else {
|
||||
log.Entry().Infof("Package %s has status %s, cannot release this package", pack.PackageName, pack.Status)
|
||||
packagesWithReposNotLocked = append(packagesWithReposNotLocked, pWR)
|
||||
}
|
||||
}
|
||||
return packagesWithReposLocked, packagesWithReposNotLocked
|
||||
}
|
||||
|
||||
func releaseAndPoll(pckgWR []aakaas.PackageWithRepository, maxRuntimeInMinutes time.Duration, pollIntervalsInSeconds time.Duration) ([]aakaas.PackageWithRepository, error) {
|
||||
timeout := time.After(maxRuntimeInMinutes)
|
||||
ticker := time.Tick(pollIntervalsInSeconds)
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-timeout:
|
||||
return pckgWR, errors.New("Timed out")
|
||||
case <-ticker:
|
||||
var allFinished bool = true
|
||||
for i := range pckgWR {
|
||||
if pckgWR[i].Package.Status != aakaas.PackageStatusReleased {
|
||||
err := pckgWR[i].Package.Release()
|
||||
// if there is an error, release is not yet finished
|
||||
if err != nil {
|
||||
log.Entry().Infof("Release of %s is not yet finished, check again in %s", pckgWR[i].Package.PackageName, pollIntervalsInSeconds)
|
||||
allFinished = false
|
||||
}
|
||||
}
|
||||
}
|
||||
if allFinished {
|
||||
log.Entry().Infof("Release of package(s) was succesful")
|
||||
return pckgWR, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
175
cmd/abapAddonAssemblyKitReleasePackages_generated.go
Normal file
175
cmd/abapAddonAssemblyKitReleasePackages_generated.go
Normal file
@@ -0,0 +1,175 @@
|
||||
// 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 abapAddonAssemblyKitReleasePackagesOptions struct {
|
||||
AbapAddonAssemblyKitEndpoint string `json:"abapAddonAssemblyKitEndpoint,omitempty"`
|
||||
Username string `json:"username,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
AddonDescriptor string `json:"addonDescriptor,omitempty"`
|
||||
}
|
||||
|
||||
type abapAddonAssemblyKitReleasePackagesCommonPipelineEnvironment struct {
|
||||
abap struct {
|
||||
addonDescriptor string
|
||||
}
|
||||
}
|
||||
|
||||
func (p *abapAddonAssemblyKitReleasePackagesCommonPipelineEnvironment) 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")
|
||||
}
|
||||
}
|
||||
|
||||
// AbapAddonAssemblyKitReleasePackagesCommand This step releases the physical Delivery Packages
|
||||
func AbapAddonAssemblyKitReleasePackagesCommand() *cobra.Command {
|
||||
const STEP_NAME = "abapAddonAssemblyKitReleasePackages"
|
||||
|
||||
metadata := abapAddonAssemblyKitReleasePackagesMetadata()
|
||||
var stepConfig abapAddonAssemblyKitReleasePackagesOptions
|
||||
var startTime time.Time
|
||||
var commonPipelineEnvironment abapAddonAssemblyKitReleasePackagesCommonPipelineEnvironment
|
||||
|
||||
var createAbapAddonAssemblyKitReleasePackagesCmd = &cobra.Command{
|
||||
Use: STEP_NAME,
|
||||
Short: "This step releases the physical Delivery Packages",
|
||||
Long: `This step takes the list of Software Component Versions from the addonDescriptor in the commonPipelineEnvironment.
|
||||
The physical Delivery Packages in status “L” are released and uploaded to the "ABAP CP" section in the SAP artifactory object
|
||||
store. The new status "R"eleased 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
|
||||
}
|
||||
|
||||
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)
|
||||
abapAddonAssemblyKitReleasePackages(stepConfig, &telemetryData, &commonPipelineEnvironment)
|
||||
telemetryData.ErrorCode = "0"
|
||||
log.Entry().Info("SUCCESS")
|
||||
},
|
||||
}
|
||||
|
||||
addAbapAddonAssemblyKitReleasePackagesFlags(createAbapAddonAssemblyKitReleasePackagesCmd, &stepConfig)
|
||||
return createAbapAddonAssemblyKitReleasePackagesCmd
|
||||
}
|
||||
|
||||
func addAbapAddonAssemblyKitReleasePackagesFlags(cmd *cobra.Command, stepConfig *abapAddonAssemblyKitReleasePackagesOptions) {
|
||||
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 abapAddonAssemblyKitReleasePackagesMetadata() config.StepData {
|
||||
var theMetaData = config.StepData{
|
||||
Metadata: config.StepMetadata{
|
||||
Name: "abapAddonAssemblyKitReleasePackages",
|
||||
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
|
||||
}
|
16
cmd/abapAddonAssemblyKitReleasePackages_generated_test.go
Normal file
16
cmd/abapAddonAssemblyKitReleasePackages_generated_test.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestAbapAddonAssemblyKitReleasePackagesCommand(t *testing.T) {
|
||||
|
||||
testCmd := AbapAddonAssemblyKitReleasePackagesCommand()
|
||||
|
||||
// only high level testing performed - details are tested in step generation procedure
|
||||
assert.Equal(t, "abapAddonAssemblyKitReleasePackages", testCmd.Use, "command name incorrect")
|
||||
|
||||
}
|
100
cmd/abapAddonAssemblyKitReleasePackages_test.go
Normal file
100
cmd/abapAddonAssemblyKitReleasePackages_test.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/SAP/jenkins-library/pkg/abaputils"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestReleasePackagesStep(t *testing.T) {
|
||||
var config abapAddonAssemblyKitReleasePackagesOptions
|
||||
var cpe abapAddonAssemblyKitReleasePackagesCommonPipelineEnvironment
|
||||
client := &abaputils.ClientMock{
|
||||
Body: responseRelease,
|
||||
Token: "myToken",
|
||||
StatusCode: 200,
|
||||
}
|
||||
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{
|
||||
{
|
||||
PackageName: "SAPK-002AAINDRNMSPC",
|
||||
Status: "L",
|
||||
},
|
||||
{
|
||||
PackageName: "SAPK-001AAINDRNMSPC",
|
||||
Status: "R",
|
||||
},
|
||||
},
|
||||
}
|
||||
adoDesc, _ := json.Marshal(addonDescriptor)
|
||||
config.AddonDescriptor = string(adoDesc)
|
||||
|
||||
err := runAbapAddonAssemblyKitReleasePackages(&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, "R", addonDescriptorFinal.Repositories[0].Status)
|
||||
})
|
||||
|
||||
t.Run("step error - invalid input", func(t *testing.T) {
|
||||
addonDescriptor := abaputils.AddonDescriptor{
|
||||
Repositories: []abaputils.Repository{
|
||||
{
|
||||
Status: "L",
|
||||
},
|
||||
},
|
||||
}
|
||||
adoDesc, _ := json.Marshal(addonDescriptor)
|
||||
config.AddonDescriptor = string(adoDesc)
|
||||
|
||||
err := runAbapAddonAssemblyKitReleasePackages(&config, nil, client, &cpe, timeout, pollInterval)
|
||||
assert.Error(t, err, "Did expect error")
|
||||
assert.Equal(t, err.Error(), "Parameter missing. Please provide the name of the package which should be released")
|
||||
})
|
||||
|
||||
t.Run("step error - timeout", func(t *testing.T) {
|
||||
client.Error = errors.New("Release not finished")
|
||||
addonDescriptor := abaputils.AddonDescriptor{
|
||||
Repositories: []abaputils.Repository{
|
||||
{
|
||||
PackageName: "SAPK-001AAINDRNMSPC",
|
||||
Status: "L",
|
||||
},
|
||||
},
|
||||
}
|
||||
adoDesc, _ := json.Marshal(addonDescriptor)
|
||||
config.AddonDescriptor = string(adoDesc)
|
||||
|
||||
timeout := time.Duration(2 * time.Second)
|
||||
err := runAbapAddonAssemblyKitReleasePackages(&config, nil, client, &cpe, timeout, pollInterval)
|
||||
assert.Error(t, err, "Did expect error")
|
||||
assert.Equal(t, err.Error(), "Timed out")
|
||||
})
|
||||
}
|
||||
|
||||
var responseRelease = `{
|
||||
"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"
|
||||
}
|
||||
}`
|
@@ -110,7 +110,7 @@ func Execute() {
|
||||
rootCmd.AddCommand(AbapAddonAssemblyKitCreateTargetVectorCommand())
|
||||
rootCmd.AddCommand(AbapAddonAssemblyKitPublishTargetVectorCommand())
|
||||
rootCmd.AddCommand(AbapAddonAssemblyKitRegisterPackagesCommand())
|
||||
// rootCmd.AddCommand(AbapAddonAssemblyKitReleasePackagesCommand())
|
||||
rootCmd.AddCommand(AbapAddonAssemblyKitReleasePackagesCommand())
|
||||
// rootCmd.AddCommand(AbapAddonAssemblyKitReserveNextPackagesCommand())
|
||||
|
||||
addRootFlags(rootCmd)
|
||||
|
@@ -0,0 +1,82 @@
|
||||
# ${docGenStepName}
|
||||
|
||||
## ${docGenDescription}
|
||||
|
||||
## Prerequisites
|
||||
|
||||
* The credentials to access the AAKaaS (e.g. S-User) must be stored in the Jenkins Credential Store
|
||||
* This step needs the names of the packages which should be released. The packages needs to be in status "L"ocked. If they are already in status "R"eleased it is fine, then the release will just not be executed. However this step will end with an error if a package has status "P"lanned.
|
||||
* The package names are taken from the addonDescriptor in the commonPipelineEnvironment together with the status of the packages.
|
||||
* The step [abapAddonAssemblyKitRegisterPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitRegisterPackages) will set the status of the packages to "L"ocked and writes the needed data to the commonPipelineEnvironment.
|
||||
|
||||
## ${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
|
||||
abapAddonAssemblyKitReleasePackages script: this
|
||||
```
|
||||
|
||||
The config.yml should look like this:
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
abapAddonAssemblyKitReleasePackages:
|
||||
abapAddonAssemblyKitCredentialsId: 'abapAddonAssemblyKitCredentialsId',
|
||||
abapAddonAssemblyKitEndpoint: 'https://myabapAddonAssemblyKitEndpoint.com',
|
||||
```
|
||||
|
||||
### Input via the CommonPipelineEnvironment
|
||||
|
||||
Mandatory fields:
|
||||
|
||||
```json
|
||||
{"addonProduct":"",
|
||||
"addonVersion":"",
|
||||
"addonVersionAAK":"",
|
||||
"addonUniqueID":"",
|
||||
"customerID":"",
|
||||
"AddonSpsLevel":"",
|
||||
"AddonPatchLevel":"",
|
||||
"TargetVectorID":"",
|
||||
"repositories":[
|
||||
{
|
||||
"name":"",
|
||||
"tag":"",
|
||||
"branch":"",
|
||||
"version":"",
|
||||
"versionAAK":"",
|
||||
"PackageName":"SAPK001001REPOA",
|
||||
"PackageType":"",
|
||||
"SpLevel":"",
|
||||
"PatchLevel":"",
|
||||
"PredecessorCommitID":"",
|
||||
"Status":"L",
|
||||
"Namespace":"",
|
||||
"SarXMLFilePath":""
|
||||
},
|
||||
{
|
||||
"name":"",
|
||||
"tag":"",
|
||||
"branch":"",
|
||||
"version":"",
|
||||
"versionAAK":"",
|
||||
"PackageName":"SAPK002001REPOB",
|
||||
"PackageType":"",
|
||||
"SpLevel":"",
|
||||
"PatchLevel":"",
|
||||
"PredecessorCommitID":"",
|
||||
"Status":"R",
|
||||
"Namespace":"",
|
||||
"SarXMLFilePath":""
|
||||
}
|
||||
]}
|
||||
```
|
@@ -54,7 +54,7 @@ nav:
|
||||
- abapAddonAssemblyKitCreateTargetVector: steps/abapAddonAssemblyKitCreateTargetVector.md
|
||||
- abapAddonAssemblyKitPublishTargetVector: steps/abapAddonAssemblyKitPublishTargetVector.md
|
||||
- abapAddonAssemblyKitRegisterPackages: steps/abapAddonAssemblyKitRegisterPackages.md
|
||||
# - abapAddonAssemblyKitReleasePackages: steps/abapAddonAssemblyKitReleasePackages.md
|
||||
- abapAddonAssemblyKitReleasePackages: steps/abapAddonAssemblyKitReleasePackages.md
|
||||
# - abapAddonAssemblyKitReserveNextPackages: steps/abapAddonAssemblyKitReserveNextPackages.md
|
||||
- abapEnvironmentAssemblePackages: steps/abapEnvironmentAssemblePackages.md
|
||||
- abapEnvironmentCheckoutBranch: steps/abapEnvironmentCheckoutBranch.md
|
||||
|
@@ -45,9 +45,10 @@ type Package struct {
|
||||
Namespace string `json:"Namespace"`
|
||||
}
|
||||
|
||||
type packageWithRepository struct {
|
||||
p Package
|
||||
repo abaputils.Repository
|
||||
// PackageWithRepository : pack'n repo
|
||||
type PackageWithRepository struct {
|
||||
Package Package
|
||||
Repo abaputils.Repository
|
||||
}
|
||||
|
||||
// InitPackage : initialize package attributes from the repository
|
||||
@@ -130,3 +131,20 @@ func (p *Package) Register() error {
|
||||
log.Entry().Infof("Package status %s", p.Status)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Release : release package in AAKaaS
|
||||
func (p *Package) Release() error {
|
||||
var body []byte
|
||||
var err error
|
||||
log.Entry().Infof("Release package %s", p.PackageName)
|
||||
p.Connector.GetToken("/odata/aas_ocs_package")
|
||||
appendum := "/odata/aas_ocs_package/ReleasePackage?Name='" + p.PackageName + "'"
|
||||
body, err = p.Connector.Post(appendum, "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var jPck jsonPackage
|
||||
json.Unmarshal(body, &jPck)
|
||||
p.Status = jPck.Package.Status
|
||||
return nil
|
||||
}
|
||||
|
54
resources/metadata/abapAddonAssemblyKitReleasePackages.yaml
Normal file
54
resources/metadata/abapAddonAssemblyKitReleasePackages.yaml
Normal file
@@ -0,0 +1,54 @@
|
||||
metadata:
|
||||
name: abapAddonAssemblyKitReleasePackages
|
||||
description: This step releases the physical Delivery Packages
|
||||
longDescription: |
|
||||
This step takes the list of Software Component Versions from the addonDescriptor in the commonPipelineEnvironment.
|
||||
The physical Delivery Packages in status “L” are released and uploaded to the "ABAP CP" section in the SAP artifactory object
|
||||
store. The new status "R"eleased 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
|
||||
- name: password
|
||||
type: string
|
||||
description: Password for the Addon Assembly Kit as a Service (AAKaaS) system
|
||||
scope:
|
||||
- PARAMETERS
|
||||
mandatory: 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
|
@@ -111,7 +111,7 @@ public class CommonStepsTest extends BasePiperTest{
|
||||
'abapAddonAssemblyKitCreateTargetVector', //implementing new golang pattern without fields
|
||||
'abapAddonAssemblyKitPublishTargetVector', //implementing new golang pattern without fields
|
||||
'abapAddonAssemblyKitRegisterPackages', //implementing new golang pattern without fields
|
||||
//'abapAddonAssemblyKitReleasePackages', //implementing new golang pattern without fields
|
||||
'abapAddonAssemblyKitReleasePackages', //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
|
||||
|
11
vars/abapAddonAssemblyKitReleasePackages.groovy
Normal file
11
vars/abapAddonAssemblyKitReleasePackages.groovy
Normal file
@@ -0,0 +1,11 @@
|
||||
import groovy.transform.Field
|
||||
|
||||
@Field String STEP_NAME = getClass().getName()
|
||||
@Field String METADATA_FILE = 'metadata/abapAddonAssemblyKitReleasePackages.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)
|
||||
}
|
Reference in New Issue
Block a user