1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-09-16 09:26:22 +02:00

Enable classic cts (#3728)

* add useClassicCTS

* debug output and unit test

* unsaved fix

* error logging

* Update abapEnvironmentAssemblePackages.go

* Update abapEnvironmentAssemblePackages.go

* add general scope and remove logging

* Update bfw.go

* Update abapEnvironmentAssemblePackages.go

* Update abapEnvironmentAssemblePackages.go

* Update package.go

* Update abapEnvironmentAssemblePackages.go

* change scope and add certificates

Co-authored-by: tiloKo <70266685+tiloKo@users.noreply.github.com>
This commit is contained in:
rosemarieB
2022-04-12 14:39:42 +02:00
committed by GitHub
parent f2305a6b08
commit 1ffe22903e
12 changed files with 124 additions and 61 deletions

View File

@@ -69,6 +69,7 @@ func (c *componentVersion) initCV(repo abaputils.Repository, conn abapbuild.Conn
c.Name = repo.Name
c.VersionYAML = repo.VersionYAML
c.CommitID = repo.CommitID
c.UseClassicCTS = repo.UseClassicCTS
}
func (c *componentVersion) copyFieldsToRepo(initialRepo *abaputils.Repository) {
@@ -93,8 +94,9 @@ func (c *componentVersion) validate() error {
c.SpLevel = jCV.ComponentVersion.SpLevel
c.PatchLevel = jCV.ComponentVersion.PatchLevel
log.Entry().Infof("Resolved version %s, splevel %s, patchlevel %s", c.Version, c.SpLevel, c.PatchLevel)
log.Entry().Infof("Using cCTS %t", c.UseClassicCTS)
if c.CommitID == "" {
if !c.UseClassicCTS && c.CommitID == "" {
return fmt.Errorf("CommitID missing in repo '%s' of the addon.yml", c.Name)
}
@@ -107,10 +109,11 @@ type jsonComponentVersion struct {
type componentVersion struct {
abapbuild.Connector
Name string `json:"Name"`
VersionYAML string
Version string `json:"Version"`
SpLevel string `json:"SpLevel"`
PatchLevel string `json:"PatchLevel"`
CommitID string
Name string `json:"Name"`
VersionYAML string
Version string `json:"Version"`
SpLevel string `json:"SpLevel"`
PatchLevel string `json:"PatchLevel"`
UseClassicCTS bool
CommitID string
}

View File

@@ -62,28 +62,30 @@ func checkAndCopyFieldsToRepositories(pckgWR []aakaas.PackageWithRepository) ([]
log.Entry().Infof("%-30v | %-20v | %-6v | %-40v | %-40v", pckgWR[i].Repo.Name, pckgWR[i].Package.PackageName, pckgWR[i].Package.Status, pckgWR[i].Repo.CommitID, pckgWR[i].Package.PredecessorCommitID)
if pckgWR[i].Package.Status == aakaas.PackageStatusReleased {
//Ensure for Packages with Status R that CommitID of package = the one from addon.yml, beware of short commitID in addon.yml
addonYAMLcommitIDLength := len(pckgWR[i].Repo.CommitID)
if len(pckgWR[i].Package.CommitID) < addonYAMLcommitIDLength {
return repos, errors.New("Provided CommitIDs have wrong length: " + pckgWR[i].Repo.CommitID + "(addon.yml) longer than the one from AAKaaS " + pckgWR[i].Package.CommitID)
}
packageCommitIDsubsting := pckgWR[i].Package.CommitID[0:addonYAMLcommitIDLength]
if pckgWR[i].Repo.CommitID != packageCommitIDsubsting {
log.Entry().Error("package " + pckgWR[i].Package.PackageName + " was already build but with commit " + pckgWR[i].Package.CommitID + ", not with " + pckgWR[i].Repo.CommitID)
log.Entry().Error("If you want to build a new package make sure to increase the dotted-version-string in addon.yml")
log.Entry().Error("If you do NOT want to build a new package enter the commitID " + pckgWR[i].Package.CommitID + " for software component " + pckgWR[i].Repo.Name + " in addon.yml")
return repos, errors.New("commit of released package does not match with addon.yml")
}
} else if pckgWR[i].Package.PredecessorCommitID != "" {
//Check for newly reserved packages which are to be build that CommitID from addon.yml != PreviousCommitID [this will result in an error as no delta can be calculated]
addonYAMLcommitIDLength := len(pckgWR[i].Repo.CommitID)
if len(pckgWR[i].Package.PredecessorCommitID) < addonYAMLcommitIDLength {
return repos, errors.New("Provided CommitIDs have wrong length: " + pckgWR[i].Repo.CommitID + "(addon.yml) longer than the one from AAKaaS " + pckgWR[i].Package.CommitID)
}
packagePredecessorCommitIDsubsting := pckgWR[i].Package.PredecessorCommitID[0:addonYAMLcommitIDLength]
if pckgWR[i].Repo.CommitID == packagePredecessorCommitIDsubsting {
return repos, errors.New("CommitID of package " + pckgWR[i].Package.PackageName + " is the same as the one of the predecessor package. Make sure to change both the dotted-version-string AND the commitID in addon.yml")
if !pckgWR[i].Repo.UseClassicCTS {
if pckgWR[i].Package.Status == aakaas.PackageStatusReleased {
//Ensure for Packages with Status R that CommitID of package = the one from addon.yml, beware of short commitID in addon.yml
addonYAMLcommitIDLength := len(pckgWR[i].Repo.CommitID)
if len(pckgWR[i].Package.CommitID) < addonYAMLcommitIDLength {
return repos, errors.New("Provided CommitIDs have wrong length: " + pckgWR[i].Repo.CommitID + "(addon.yml) longer than the one from AAKaaS " + pckgWR[i].Package.CommitID)
}
packageCommitIDsubsting := pckgWR[i].Package.CommitID[0:addonYAMLcommitIDLength]
if pckgWR[i].Repo.CommitID != packageCommitIDsubsting {
log.Entry().Error("package " + pckgWR[i].Package.PackageName + " was already build but with commit " + pckgWR[i].Package.CommitID + ", not with " + pckgWR[i].Repo.CommitID)
log.Entry().Error("If you want to build a new package make sure to increase the dotted-version-string in addon.yml")
log.Entry().Error("If you do NOT want to build a new package enter the commitID " + pckgWR[i].Package.CommitID + " for software component " + pckgWR[i].Repo.Name + " in addon.yml")
return repos, errors.New("commit of released package does not match with addon.yml")
}
} else if pckgWR[i].Package.PredecessorCommitID != "" {
//Check for newly reserved packages which are to be build that CommitID from addon.yml != PreviousCommitID [this will result in an error as no delta can be calculated]
addonYAMLcommitIDLength := len(pckgWR[i].Repo.CommitID)
if len(pckgWR[i].Package.PredecessorCommitID) < addonYAMLcommitIDLength {
return repos, errors.New("Provided CommitIDs have wrong length: " + pckgWR[i].Repo.CommitID + "(addon.yml) longer than the one from AAKaaS " + pckgWR[i].Package.CommitID)
}
packagePredecessorCommitIDsubsting := pckgWR[i].Package.PredecessorCommitID[0:addonYAMLcommitIDLength]
if pckgWR[i].Repo.CommitID == packagePredecessorCommitIDsubsting {
return repos, errors.New("CommitID of package " + pckgWR[i].Package.PackageName + " is the same as the one of the predecessor package. Make sure to change both the dotted-version-string AND the commitID in addon.yml")
}
}
}

View File

@@ -44,6 +44,7 @@ func runAbapEnvironmentAssembleConfirm(config *abapEnvironmentAssembleConfirmOpt
connConfig.Password = config.Password
connConfig.AddonDescriptor = config.AddonDescriptor
connConfig.MaxRuntimeInMinutes = config.MaxRuntimeInMinutes
connConfig.CertificateNames = config.CertificateNames
err := conn.InitBuildFramework(connConfig, com, client)
if err != nil {

View File

@@ -18,16 +18,17 @@ import (
)
type abapEnvironmentAssembleConfirmOptions struct {
CfAPIEndpoint string `json:"cfApiEndpoint,omitempty"`
CfOrg string `json:"cfOrg,omitempty"`
CfSpace string `json:"cfSpace,omitempty"`
CfServiceInstance string `json:"cfServiceInstance,omitempty"`
CfServiceKeyName string `json:"cfServiceKeyName,omitempty"`
Host string `json:"host,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
AddonDescriptor string `json:"addonDescriptor,omitempty"`
MaxRuntimeInMinutes int `json:"maxRuntimeInMinutes,omitempty"`
CfAPIEndpoint string `json:"cfApiEndpoint,omitempty"`
CfOrg string `json:"cfOrg,omitempty"`
CfSpace string `json:"cfSpace,omitempty"`
CfServiceInstance string `json:"cfServiceInstance,omitempty"`
CfServiceKeyName string `json:"cfServiceKeyName,omitempty"`
Host string `json:"host,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
AddonDescriptor string `json:"addonDescriptor,omitempty"`
MaxRuntimeInMinutes int `json:"maxRuntimeInMinutes,omitempty"`
CertificateNames []string `json:"certificateNames,omitempty"`
}
type abapEnvironmentAssembleConfirmCommonPipelineEnvironment struct {
@@ -161,6 +162,7 @@ func addAbapEnvironmentAssembleConfirmFlags(cmd *cobra.Command, stepConfig *abap
cmd.Flags().StringVar(&stepConfig.Password, "password", os.Getenv("PIPER_password"), "Password for either the Cloud Foundry API or the Communication Arrangement for SAP_COM_0582")
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().IntVar(&stepConfig.MaxRuntimeInMinutes, "maxRuntimeInMinutes", 360, "maximal runtime of the step")
cmd.Flags().StringSliceVar(&stepConfig.CertificateNames, "certificateNames", []string{}, "certificates for the backend system, this certificates needs to be stored in .pipeline/trustStore")
cmd.MarkFlagRequired("username")
cmd.MarkFlagRequired("password")
@@ -230,7 +232,7 @@ func abapEnvironmentAssembleConfirmMetadata() config.StepData {
{
Name: "host",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Scope: []string{"PARAMETERS", "STAGES", "STEPS", "GENERAL"},
Type: "string",
Mandatory: false,
Aliases: []config.Alias{},
@@ -277,6 +279,15 @@ func abapEnvironmentAssembleConfirmMetadata() config.StepData {
Aliases: []config.Alias{},
Default: 360,
},
{
Name: "certificateNames",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS", "GENERAL"},
Type: "[]string",
Mandatory: false,
Aliases: []config.Alias{},
Default: []string{},
},
},
},
Containers: []config.Container{

View File

@@ -138,8 +138,8 @@ func (br *buildWithRepository) waitToBeFinished(maxRuntimeInMinutes time.Duratio
}
func (br *buildWithRepository) start() error {
if br.repo.Name == "" || br.repo.Version == "" || br.repo.SpLevel == "" || br.repo.Namespace == "" || br.repo.PackageType == "" || br.repo.PackageName == "" {
return errors.New("Parameters missing. Please provide software component name, version, sp-level, namespace, packagetype and packagename")
if br.repo.Name == "" || br.repo.Version == "" || br.repo.SpLevel == "" || br.repo.PackageType == "" || br.repo.PackageName == "" {
return errors.New("Parameters missing. Please provide software component name, version, sp-level, packagetype and packagename")
}
valuesInput := abapbuild.Values{
Values: []abapbuild.Value{
@@ -151,10 +151,6 @@ func (br *buildWithRepository) start() error {
ValueID: "CVERS",
Value: br.repo.Name + "." + br.repo.Version + "." + br.repo.SpLevel,
},
{
ValueID: "NAMESPACE",
Value: br.repo.Namespace,
},
{
ValueID: "PACKAGE_TYPE",
Value: br.repo.PackageType,
@@ -165,6 +161,16 @@ func (br *buildWithRepository) start() error {
},
},
}
if br.repo.Namespace != "" {
valuesInput.Values = append(valuesInput.Values,
abapbuild.Value{ValueID: "NAMESPACE",
Value: br.repo.Namespace})
}
if br.repo.UseClassicCTS {
valuesInput.Values = append(valuesInput.Values,
abapbuild.Value{ValueID: "useClassicCTS",
Value: "true"})
}
if br.repo.PredecessorCommitID != "" {
valuesInput.Values = append(valuesInput.Values,
abapbuild.Value{ValueID: "PREVIOUS_DELIVERY_COMMIT",
@@ -228,7 +234,9 @@ func checkIfFailedAndPrintLogs(builds []buildWithRepository) error {
log.Entry().Errorf("Assembly of %s failed", builds[i].repo.PackageName)
buildFailed = true
}
builds[i].build.PrintLogs()
if builds[i].build.BuildID != "" {
builds[i].build.PrintLogs()
}
}
if buildFailed {
return errors.New("At least the assembly of one package failed")
@@ -248,6 +256,7 @@ func initAssemblePackagesConnection(conn *abapbuild.Connector, config *abapEnvir
connConfig.Password = config.Password
connConfig.AddonDescriptor = config.AddonDescriptor
connConfig.MaxRuntimeInMinutes = config.MaxRuntimeInMinutes
connConfig.CertificateNames = config.CertificateNames
err := conn.InitBuildFramework(connConfig, com, client)
if err != nil {

View File

@@ -18,17 +18,18 @@ import (
)
type abapEnvironmentAssemblePackagesOptions struct {
CfAPIEndpoint string `json:"cfApiEndpoint,omitempty"`
CfOrg string `json:"cfOrg,omitempty"`
CfSpace string `json:"cfSpace,omitempty"`
CfServiceInstance string `json:"cfServiceInstance,omitempty"`
CfServiceKeyName string `json:"cfServiceKeyName,omitempty"`
Host string `json:"host,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
AddonDescriptor string `json:"addonDescriptor,omitempty"`
MaxRuntimeInMinutes int `json:"maxRuntimeInMinutes,omitempty"`
PollIntervalsInMilliseconds int `json:"pollIntervalsInMilliseconds,omitempty"`
CfAPIEndpoint string `json:"cfApiEndpoint,omitempty"`
CfOrg string `json:"cfOrg,omitempty"`
CfSpace string `json:"cfSpace,omitempty"`
CfServiceInstance string `json:"cfServiceInstance,omitempty"`
CfServiceKeyName string `json:"cfServiceKeyName,omitempty"`
Host string `json:"host,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
AddonDescriptor string `json:"addonDescriptor,omitempty"`
MaxRuntimeInMinutes int `json:"maxRuntimeInMinutes,omitempty"`
PollIntervalsInMilliseconds int `json:"pollIntervalsInMilliseconds,omitempty"`
CertificateNames []string `json:"certificateNames,omitempty"`
}
type abapEnvironmentAssemblePackagesCommonPipelineEnvironment struct {
@@ -164,6 +165,7 @@ func addAbapEnvironmentAssemblePackagesFlags(cmd *cobra.Command, stepConfig *aba
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().IntVar(&stepConfig.MaxRuntimeInMinutes, "maxRuntimeInMinutes", 360, "maximal runtime of the step in minutes")
cmd.Flags().IntVar(&stepConfig.PollIntervalsInMilliseconds, "pollIntervalsInMilliseconds", 60000, "wait time in milliseconds till next status request in the backend system")
cmd.Flags().StringSliceVar(&stepConfig.CertificateNames, "certificateNames", []string{}, "certificates for the backend system, this certificates needs to be stored in .pipeline/trustStore")
cmd.MarkFlagRequired("username")
cmd.MarkFlagRequired("password")
@@ -234,7 +236,7 @@ func abapEnvironmentAssemblePackagesMetadata() config.StepData {
{
Name: "host",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
Scope: []string{"PARAMETERS", "STAGES", "STEPS", "GENERAL"},
Type: "string",
Mandatory: false,
Aliases: []config.Alias{},
@@ -290,6 +292,15 @@ func abapEnvironmentAssemblePackagesMetadata() config.StepData {
Aliases: []config.Alias{},
Default: 60000,
},
{
Name: "certificateNames",
ResourceRef: []config.ResourceReference{},
Scope: []string{"PARAMETERS", "STAGES", "STEPS", "GENERAL"},
Type: "[]string",
Mandatory: false,
Aliases: []config.Alias{},
Default: []string{},
},
},
},
Containers: []config.Container{

View File

@@ -111,6 +111,9 @@ func (p *Package) GetPackageAndNamespace() error {
}
p.Status = jPck.Package.Status
p.Namespace = jPck.Package.Namespace
if p.Namespace == "//" {
p.Namespace = ""
}
return nil
}

View File

@@ -177,7 +177,7 @@ func (b *Build) Start(phase string, inputValues Values) error {
body, err := b.Connector.Post("/builds", importBody)
if err != nil {
return err
return errors.Wrap(err, "Start of build failed: "+string(body))
}
var jBuild jsonBuild

View File

@@ -37,6 +37,7 @@ type AddonDescriptor struct {
// Repository contains fields for the repository/component version
type Repository struct {
Name string `json:"name"`
UseClassicCTS bool `json:"useClassicCTS"`
Tag string `json:"tag"`
Branch string `json:"branch"`
CommitID string `json:"commitID"`

View File

@@ -26,6 +26,7 @@ func TestAddonDescriptorNew(t *testing.T) {
assert.Equal(t, "JEK8S273S", addonDescriptor.Repositories[1].CommitID)
assert.Equal(t, "FR", addonDescriptor.Repositories[1].Languages[2])
assert.Equal(t, `ISO-DEENFR`, addonDescriptor.Repositories[1].GetAakAasLanguageVector())
assert.Equal(t, true, addonDescriptor.Repositories[1].UseClassicCTS)
})
t.Run("getRepositoriesInBuildScope", func(t *testing.T) {
@@ -59,7 +60,8 @@ repositories:
languages:
- DE
- EN
- FR`
- FR
useClassicCTS: true`
func TestReadAddonDescriptor(t *testing.T) {
t.Run("Test: success case", func(t *testing.T) {

View File

@@ -78,6 +78,7 @@ spec:
- PARAMETERS
- STAGES
- STEPS
- GENERAL
- name: username
type: string
description: User for either the Cloud Foundry API or the Communication Arrangement for SAP_COM_0582
@@ -116,6 +117,15 @@ spec:
- PARAMETERS
- STAGES
- STEPS
- name: certificateNames
type: "[]string"
description: certificates for the backend system, this certificates needs to be stored in .pipeline/trustStore
mandatory: false
scope:
- PARAMETERS
- STAGES
- STEPS
- GENERAL
outputs:
resources:
- name: commonPipelineEnvironment

View File

@@ -79,6 +79,7 @@ spec:
- PARAMETERS
- STAGES
- STEPS
- GENERAL
- name: username
type: string
description: User for either the Cloud Foundry API or the Communication Arrangement for SAP_COM_0582
@@ -126,6 +127,15 @@ spec:
- PARAMETERS
- STAGES
- STEPS
- name: certificateNames
type: "[]string"
description: certificates for the backend system, this certificates needs to be stored in .pipeline/trustStore
mandatory: false
scope:
- PARAMETERS
- STAGES
- STEPS
- GENERAL
outputs:
resources:
- name: commonPipelineEnvironment