1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-02-21 19:48:53 +02:00

RobustConfirm (#3179)

confirm no longer done based on package status but now based on boolean indicator which is set during assembly step.
Thus confirm can now be placed after release packages.
This commit is contained in:
tiloKo 2021-10-28 11:01:16 +02:00 committed by GitHub
parent 36e5b543ed
commit a0ad624b9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 63 additions and 60 deletions

View File

@ -54,14 +54,14 @@ func runAbapEnvironmentAssembleConfirm(config *abapEnvironmentAssembleConfirmOpt
if err != nil {
return err
}
delayBetweenPostsInSeconds := time.Duration(3 * time.Second)
builds, err := startingConfirm(addonDescriptor.Repositories, *conn, delayBetweenPostsInSeconds)
delayBetweenPosts := time.Duration(3 * time.Second)
builds, err := startingConfirm(addonDescriptor.Repositories, *conn, delayBetweenPosts)
if err != nil {
return err
}
maxRuntimeInMinutes := time.Duration(config.MaxRuntimeInMinutes) * time.Minute
pollIntervalsInSeconds := time.Duration(60 * time.Second)
err = polling(builds, maxRuntimeInMinutes, pollIntervalsInSeconds)
pollInterval := time.Duration(60 * time.Second)
err = polling(builds, maxRuntimeInMinutes, pollInterval)
if err != nil {
return err
}
@ -72,9 +72,8 @@ func runAbapEnvironmentAssembleConfirm(config *abapEnvironmentAssembleConfirmOpt
return nil
}
func startingConfirm(repos []abaputils.Repository, conn abapbuild.Connector, delayBetweenPostsInSeconds time.Duration) ([]buildWithRepository, error) {
var builds []buildWithRepository
var buildsAlreadyReleased []buildWithRepository
func startingConfirm(repos []abaputils.Repository, conn abapbuild.Connector, delayBetweenPosts time.Duration) ([]buildWithRepository, error) {
var confirmedBuilds []buildWithRepository
for _, repo := range repos {
assemblyBuild := abapbuild.Build{
Connector: conn,
@ -83,26 +82,25 @@ func startingConfirm(repos []abaputils.Repository, conn abapbuild.Connector, del
build: assemblyBuild,
repo: repo,
}
if repo.Status != "R" {
if repo.InBuildScope {
err := buildRepo.startConfirm()
if err != nil {
return builds, err
return confirmedBuilds, err
}
builds = append(builds, buildRepo)
confirmedBuilds = append(confirmedBuilds, buildRepo)
} else {
log.Entry().Infof("Packages %s is in status '%s'. No need assembly done, no need to confirm", repo.PackageName, repo.Status)
buildsAlreadyReleased = append(buildsAlreadyReleased, buildRepo)
log.Entry().Infof("Packages %s was not assembled in this pipeline run, thus no need to confirm", repo.PackageName)
}
//as batch events in the ABAP Backend need a little time
time.Sleep(delayBetweenPostsInSeconds)
time.Sleep(delayBetweenPosts)
}
return builds, nil
return confirmedBuilds, nil
}
func polling(builds []buildWithRepository, maxRuntimeInMinutes time.Duration, pollIntervalsInSeconds time.Duration) error {
func polling(builds []buildWithRepository, maxRuntimeInMinutes time.Duration, pollInterval time.Duration) error {
timeout := time.After(maxRuntimeInMinutes)
ticker := time.Tick(pollIntervalsInSeconds)
ticker := time.Tick(pollInterval)
for {
select {
case <-timeout:
@ -112,7 +110,7 @@ func polling(builds []buildWithRepository, maxRuntimeInMinutes time.Duration, po
for i := range builds {
builds[i].build.Get()
if !builds[i].build.IsFinished() {
log.Entry().Infof("Assembly of %s is not yet finished, check again in %s", builds[i].repo.PackageName, pollIntervalsInSeconds)
log.Entry().Infof("Assembly of %s is not yet finished, check again in %s", builds[i].repo.PackageName, pollInterval)
allFinished = false
}
}

View File

@ -47,6 +47,7 @@ func TestStartingConfirm(t *testing.T) {
}
repos = append(repos, repo)
repo.Status = "R"
repo.InBuildScope = true
repos = append(repos, repo)
builds, err := startingConfirm(repos, *conn, time.Duration(0*time.Second))
@ -67,7 +68,7 @@ func TestStartingConfirmInvalidInput(t *testing.T) {
var repos []abaputils.Repository
repo := abaputils.Repository{
Name: "RepoA",
Status: "P",
InBuildScope: true,
}
repos = append(repos, repo)
_, err := startingConfirm(repos, *conn, time.Duration(0*time.Second))

View File

@ -65,8 +65,8 @@ func runAbapEnvironmentAssemblePackages(config *abapEnvironmentAssemblePackagesO
}
maxRuntimeInMinutes := time.Duration(config.MaxRuntimeInMinutes) * time.Minute
pollIntervalsInMilliseconds := time.Duration(config.PollIntervalsInMilliseconds) * time.Millisecond
builds, err := executeBuilds(addonDescriptor.Repositories, *conn, maxRuntimeInMinutes, pollIntervalsInMilliseconds)
pollInterval := time.Duration(config.PollIntervalsInMilliseconds) * time.Millisecond
builds, err := executeBuilds(addonDescriptor.Repositories, *conn, maxRuntimeInMinutes, pollInterval)
if err != nil {
return errors.Wrap(err, "Starting Builds for Repositories with reserved AAKaaS packages failed")
}
@ -102,7 +102,7 @@ func runAbapEnvironmentAssemblePackages(config *abapEnvironmentAssemblePackagesO
return nil
}
func executeBuilds(repos []abaputils.Repository, conn abapbuild.Connector, maxRuntimeInMinutes time.Duration, pollIntervalsInMilliseconds time.Duration) ([]buildWithRepository, error) {
func executeBuilds(repos []abaputils.Repository, conn abapbuild.Connector, maxRuntimeInMinutes time.Duration, pollInterval time.Duration) ([]buildWithRepository, error) {
var builds []buildWithRepository
for _, repo := range repos {
@ -115,13 +115,14 @@ func executeBuilds(repos []abaputils.Repository, conn abapbuild.Connector, maxRu
}
if repo.Status == "P" {
buildRepo.repo.InBuildScope = true
err := buildRepo.start()
if err != nil {
buildRepo.build.RunState = abapbuild.Failed
log.Entry().Error(err)
log.Entry().Info("Continueing with other builds (if any)")
} else {
err = buildRepo.waitToBeFinished(maxRuntimeInMinutes, pollIntervalsInMilliseconds)
err = buildRepo.waitToBeFinished(maxRuntimeInMinutes, pollInterval)
if err != nil {
buildRepo.build.RunState = abapbuild.Failed
log.Entry().Error(err)
@ -137,9 +138,9 @@ func executeBuilds(repos []abaputils.Repository, conn abapbuild.Connector, maxRu
return builds, nil
}
func (br *buildWithRepository) waitToBeFinished(maxRuntimeInMinutes time.Duration, pollIntervalsInMilliseconds time.Duration) error {
func (br *buildWithRepository) waitToBeFinished(maxRuntimeInMinutes time.Duration, pollInterval time.Duration) error {
timeout := time.After(maxRuntimeInMinutes)
ticker := time.Tick(pollIntervalsInMilliseconds)
ticker := time.Tick(pollInterval)
for {
select {
case <-timeout:
@ -147,7 +148,7 @@ func (br *buildWithRepository) waitToBeFinished(maxRuntimeInMinutes time.Duratio
case <-ticker:
br.build.Get()
if !br.build.IsFinished() {
log.Entry().Infof("Assembly of %s is not yet finished, check again in %s", br.repo.PackageName, pollIntervalsInMilliseconds)
log.Entry().Infof("Assembly of %s is not yet finished, check again in %s", br.repo.PackageName, pollInterval)
} else {
return nil
}
@ -251,25 +252,3 @@ func checkIfFailedAndPrintLogs(builds []buildWithRepository) error {
}
return nil
}
func downloadSARXML(builds []buildWithRepository) ([]abaputils.Repository, error) {
var reposBackToCPE []abaputils.Repository
resultName := "SAR_XML"
envPath := filepath.Join(GeneralConfig.EnvRootPath, "commonPipelineEnvironment", "abap")
for i, b := range builds {
resultSARXML, err := b.build.GetResult(resultName)
if err != nil {
return reposBackToCPE, err
}
sarPackage := resultSARXML.AdditionalInfo
downloadPath := filepath.Join(envPath, path.Base(sarPackage))
log.Entry().Infof("Downloading SAR file %s to %s", path.Base(sarPackage), downloadPath)
err = resultSARXML.Download(downloadPath)
if err != nil {
return reposBackToCPE, err
}
builds[i].repo.SarXMLFilePath = downloadPath
reposBackToCPE = append(reposBackToCPE, builds[i].repo)
}
return reposBackToCPE, nil
}

View File

@ -92,6 +92,7 @@ func TestStep(t *testing.T) {
err := runAbapEnvironmentAssemblePackages(config, nil, autils, &client, cpe)
assert.NoError(t, err)
assert.Contains(t, cpe.abap.addonDescriptor, `"InBuildScope":false`)
})
t.Run("abapEnvironmentAssemblePackages: build", func(t *testing.T) {
@ -104,6 +105,7 @@ func TestStep(t *testing.T) {
err := runAbapEnvironmentAssemblePackages(config, nil, autils, &client, cpe)
assert.NoError(t, err)
assert.Contains(t, cpe.abap.addonDescriptor, `SAPK-001AAINITAPC1.SAR`)
assert.Contains(t, cpe.abap.addonDescriptor, `"InBuildScope":true`)
})
}

View File

@ -12,7 +12,7 @@ You can have a look at different pipeline configurations in our [SAP-samples rep
| [Prepare System](stages/prepareSystem.md) | [abapEnvironmentCreateSystem](https://sap.github.io/jenkins-library/steps/abapEnvironmentCreateSystem/), [cloudFoundryCreateServiceKey](https://sap.github.io/jenkins-library/steps/cloudFoundryCreateServiceKey/)|
| [Clone Repositories](stages/cloneRepositories.md) | [abapEnvironmentPullGitRepo](https://sap.github.io/jenkins-library/steps/abapEnvironmentPullGitRepo/)|
| [ATC](stages/ATC.md) | [abapEnvironmentRunATCCheck](https://sap.github.io/jenkins-library/steps/abapEnvironmentRunATCCheck/)|
| [Build](stages/build.md) | [cloudFoundryCreateServiceKey](https://sap.github.io/jenkins-library/steps/cloudFoundryCreateServiceKey/), [abapAddonAssemblyKitReserveNextPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitReserveNextPackages/), [abapEnvironmentAssemblePackages](https://sap.github.io/jenkins-library/steps/abapEnvironmentAssemblePackages/), [abapAddonAssemblyKitRegisterPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitRegisterPackages/), [abapEnvironmentAssembleConfirm](https://sap.github.io/jenkins-library/steps/abapEnvironmentAssembleConfirm/), [abapAddonAssemblyKitReleasePackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitReleasePackages/), [abapAddonAssemblyKitCreateTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitCreateTargetVector/), [abapAddonAssemblyKitPublishTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitPublishTargetVector/)|
| [Build](stages/build.md) | [cloudFoundryCreateServiceKey](https://sap.github.io/jenkins-library/steps/cloudFoundryCreateServiceKey/), [abapAddonAssemblyKitReserveNextPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitReserveNextPackages/), [abapEnvironmentAssemblePackages](https://sap.github.io/jenkins-library/steps/abapEnvironmentAssemblePackages/), [abapAddonAssemblyKitRegisterPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitRegisterPackages/), [abapAddonAssemblyKitReleasePackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitReleasePackages/), [abapEnvironmentAssembleConfirm](https://sap.github.io/jenkins-library/steps/abapEnvironmentAssembleConfirm/), [abapAddonAssemblyKitCreateTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitCreateTargetVector/), [abapAddonAssemblyKitPublishTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitPublishTargetVector/)|
| [Integration Tests](stages/integrationTest.md) | [cloudFoundryCreateService](https://sap.github.io/jenkins-library/steps/cloudFoundryCreateService/)|
| [Confirm](stages/confirm.md) | - |
| [Publish](stages/publish.md) | [abapAddonAssemblyKitPublishTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitPublishTargetVector/)|

View File

@ -28,7 +28,7 @@ The following stages and steps are part of the pipeline:
| [Prepare System](stages/prepareSystem.md) | [abapEnvironmentCreateSystem](https://sap.github.io/jenkins-library/steps/abapEnvironmentCreateSystem/), [cloudFoundryCreateServiceKey](https://sap.github.io/jenkins-library/steps/cloudFoundryCreateServiceKey/)|
| [Clone Repositories](stages/cloneRepositories.md) | [abapEnvironmentPullGitRepo](https://sap.github.io/jenkins-library/steps/abapEnvironmentPullGitRepo/)|
| [ATC](stages/ATC.md) | [abapEnvironmentRunATCCheck](https://sap.github.io/jenkins-library/steps/abapEnvironmentRunATCCheck/)|
| [Build](stages/build.md) | [cloudFoundryCreateServiceKey](https://sap.github.io/jenkins-library/steps/cloudFoundryCreateServiceKey/), [abapAddonAssemblyKitReserveNextPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitReserveNextPackages/), [abapEnvironmentAssemblePackages](https://sap.github.io/jenkins-library/steps/abapEnvironmentAssemblePackages/), [abapAddonAssemblyKitRegisterPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitRegisterPackages/), [abapEnvironmentAssembleConfirm](https://sap.github.io/jenkins-library/steps/abapEnvironmentAssembleConfirm/), [abapAddonAssemblyKitReleasePackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitReleasePackages/), [abapAddonAssemblyKitCreateTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitCreateTargetVector/), [abapAddonAssemblyKitPublishTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitPublishTargetVector/)|
| [Build](stages/build.md) | [cloudFoundryCreateServiceKey](https://sap.github.io/jenkins-library/steps/cloudFoundryCreateServiceKey/), [abapAddonAssemblyKitReserveNextPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitReserveNextPackages/), [abapEnvironmentAssemblePackages](https://sap.github.io/jenkins-library/steps/abapEnvironmentAssemblePackages/), [abapAddonAssemblyKitRegisterPackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitRegisterPackages/), [abapAddonAssemblyKitReleasePackages](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitReleasePackages/), [abapEnvironmentAssembleConfirm](https://sap.github.io/jenkins-library/steps/abapEnvironmentAssembleConfirm/), [abapAddonAssemblyKitCreateTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitCreateTargetVector/), [abapAddonAssemblyKitPublishTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitPublishTargetVector/)|
| [Integration Tests](stages/integrationTest.md) | [cloudFoundryCreateService](https://sap.github.io/jenkins-library/steps/cloudFoundryCreateService/)|
| [Confirm](stages/confirm.md) | - |
| [Publish](stages/publish.md) | [abapAddonAssemblyKitPublishTargetVector](https://sap.github.io/jenkins-library/steps/abapAddonAssemblyKitPublishTargetVector/)|

View File

@ -10,8 +10,8 @@ The following steps are executed in this stage:
- [abapAddonAssemblyKitReserveNextPackages](../../../steps/abapAddonAssemblyKitReserveNextPackages.md)
- [abapEnvironmentAssemblePackages](../../../steps/abapEnvironmentAssemblePackages.md)
- [abapAddonAssemblyKitRegisterPackages](../../../steps/abapAddonAssemblyKitRegisterPackages.md)
- [abapEnvironmentAssembleConfirm](../../../steps/abapEnvironmentAssembleConfirm.md)
- [abapAddonAssemblyKitReleasePackages](../../../steps/abapAddonAssemblyKitReleasePackages.md)
- [abapEnvironmentAssembleConfirm](../../../steps/abapEnvironmentAssembleConfirm.md)
- [abapAddonAssemblyKitCreateTargetVector](../../../steps/abapAddonAssemblyKitCreateTargetVector.md)
- [abapAddonAssemblyKitPublishTargetVector](../../../steps/abapAddonAssemblyKitPublishTargetVector.md)

View File

@ -51,6 +51,7 @@ type Repository struct {
Namespace string
SarXMLFilePath string
Languages []string `json:"languages"`
InBuildScope bool
}
// ReadAddonDescriptorType is the type for ReadAddonDescriptor for mocking
@ -116,7 +117,7 @@ func (me *AddonDescriptor) initFromYmlFile(FileName string, readFile readFileFun
func CheckAddonDescriptorForRepositories(addonDescriptor AddonDescriptor) error {
//checking if parsing went wrong
if len(addonDescriptor.Repositories) == 0 {
return errors.New(fmt.Sprintf("AddonDescriptor doesn't contain any repositories"))
return errors.New("AddonDescriptor doesn't contain any repositories")
}
//
emptyRepositoryCounter := 0
@ -125,7 +126,7 @@ func CheckAddonDescriptorForRepositories(addonDescriptor AddonDescriptor) error
emptyRepositoryCounter++
}
if counter+1 == len(addonDescriptor.Repositories) && emptyRepositoryCounter == len(addonDescriptor.Repositories) {
return errors.New(fmt.Sprintf("AddonDescriptor doesn't contain any repositories"))
return errors.New("AddonDescriptor doesn't contain any repositories")
}
}
return nil
@ -159,3 +160,13 @@ func (me *Repository) GetAakAasLanguageVector() string {
}
return languageVector
}
func (me *AddonDescriptor) GetRepositoriesInBuildScope() []Repository {
var RepositoriesInBuildScope []Repository
for _, repo := range me.Repositories {
if repo.InBuildScope {
RepositoriesInBuildScope = append(RepositoriesInBuildScope, repo)
}
}
return RepositoriesInBuildScope
}

View File

@ -14,18 +14,29 @@ func readFileMock(FileName string) ([]byte, error) {
}
func TestAddonDescriptorNew(t *testing.T) {
t.Run("Import addon.yml", func(t *testing.T) {
var addonDescriptor AddonDescriptor
err := addonDescriptor.initFromYmlFile(TestAddonDescriptorYAML, readFileMock)
CheckAddonDescriptorForRepositories(addonDescriptor)
assert.NoError(t, err)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.NoError(t, err)
t.Run("Import addon.yml", func(t *testing.T) {
assert.Equal(t, "/DMO/myAddonProduct", addonDescriptor.AddonProduct)
assert.Equal(t, "/DMO/REPO_A", addonDescriptor.Repositories[0].Name)
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())
})
t.Run("getRepositoriesInBuildScope", func(t *testing.T) {
assert.Equal(t, 2, len(addonDescriptor.Repositories))
addonDescriptor.Repositories[1].InBuildScope = true
repos := addonDescriptor.GetRepositoriesInBuildScope()
assert.Equal(t, 1, len(repos))
assert.Equal(t, "/DMO/REPO_B", repos[0].Name)
})
}
var TestAddonDescriptorYAML = `---
@ -130,6 +141,7 @@ func TestReadAddonDescriptor(t *testing.T) {
- repo: 'testRepo2'`
err = ioutil.WriteFile("repositories.yml", []byte(manifestFileString), 0644)
assert.NoError(t, err)
addonDescriptor, err := ReadAddonDescriptor("repositories.yml")

View File

@ -10,8 +10,8 @@ import static com.sap.piper.Prerequisites.checkScript
'abapAddonAssemblyKitReserveNextPackages',
'abapEnvironmentAssemblePackages',
'abapAddonAssemblyKitRegisterPackages',
'abapEnvironmentAssembleConfirm',
'abapAddonAssemblyKitReleasePackages',
'abapEnvironmentAssembleConfirm',
'abapAddonAssemblyKitCreateTargetVector',
'abapAddonAssemblyKitPublishTargetVector'
]
@ -29,8 +29,8 @@ void call(Map parameters = [:]) {
abapAddonAssemblyKitReserveNextPackages script: parameters.script
abapEnvironmentAssemblePackages script: parameters.script
abapAddonAssemblyKitRegisterPackages script: parameters.script
abapEnvironmentAssembleConfirm script: parameters.script
abapAddonAssemblyKitReleasePackages script: parameters.script
abapEnvironmentAssembleConfirm script: parameters.script
abapAddonAssemblyKitCreateTargetVector script: parameters.script
abapAddonAssemblyKitPublishTargetVector(script: parameters.script, targetVectorScope: 'T')
}