1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-02-09 13:47:31 +02:00

SAP BTP ABAP Environment: addon build with supported Languages (#2689)

* first try

* fix unit test

* remove obsolete attributes
This commit is contained in:
tiloKo 2021-03-15 20:24:43 +01:00 committed by GitHub
parent 0186989593
commit b04e3140de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 202 additions and 131 deletions

View File

@ -189,6 +189,12 @@ func (br *buildWithRepository) start() error {
abapbuild.Value{ValueID: "ACTUAL_DELIVERY_COMMIT",
Value: br.repo.CommitID})
}
if len(br.repo.Languages) > 0 {
valuesInput.Values = append(valuesInput.Values,
abapbuild.Value{ValueID: "SSDC_EXPORT_LANGUAGE_VECTOR",
Value: br.repo.GetAakAasLanguageVector()})
}
phase := "BUILD_" + br.repo.PackageType
log.Entry().Infof("Starting assembly of package %s", br.repo.PackageName)
return br.build.Start(phase, valuesInput)

View File

@ -5,7 +5,6 @@ import (
"fmt"
"io/ioutil"
"net/http"
"os"
"testing"
"github.com/SAP/jenkins-library/pkg/log"
@ -248,115 +247,6 @@ func TestTimeConverter(t *testing.T) {
})
}
func TestReadAddonDescriptor(t *testing.T) {
t.Run("Test: success case", func(t *testing.T) {
dir, err := ioutil.TempDir("", "test read addon descriptor")
if err != nil {
t.Fatal("Failed to create temporary directory")
}
oldCWD, _ := os.Getwd()
_ = os.Chdir(dir)
// clean up tmp dir
defer func() {
_ = os.Chdir(oldCWD)
_ = os.RemoveAll(dir)
}()
body := `---
addonProduct: /DMO/myAddonProduct
addonVersion: 3.1.4
addonUniqueId: myAddonId
customerID: 1234
repositories:
- name: /DMO/REPO_A
tag: v-1.0.1-build-0001
branch: branchA
version: 1.0.1
- name: /DMO/REPO_B
tag: rel-2.1.1-build-0001
branch: branchB
version: 2.1.1
`
file, _ := os.Create("filename.yaml")
file.Write([]byte(body))
addonDescriptor, err := ReadAddonDescriptor("filename.yaml")
assert.NoError(t, err)
assert.Equal(t, `/DMO/myAddonProduct`, addonDescriptor.AddonProduct)
assert.Equal(t, `3.1.4`, addonDescriptor.AddonVersionYAML)
assert.Equal(t, `myAddonId`, addonDescriptor.AddonUniqueID)
assert.Equal(t, float64(1234), addonDescriptor.CustomerID)
assert.Equal(t, ``, addonDescriptor.AddonSpsLevel)
assert.Equal(t, `/DMO/REPO_A`, addonDescriptor.Repositories[0].Name)
assert.Equal(t, `/DMO/REPO_B`, addonDescriptor.Repositories[1].Name)
assert.Equal(t, `v-1.0.1-build-0001`, addonDescriptor.Repositories[0].Tag)
assert.Equal(t, `rel-2.1.1-build-0001`, addonDescriptor.Repositories[1].Tag)
assert.Equal(t, `branchA`, addonDescriptor.Repositories[0].Branch)
assert.Equal(t, `branchB`, addonDescriptor.Repositories[1].Branch)
assert.Equal(t, `1.0.1`, addonDescriptor.Repositories[0].VersionYAML)
assert.Equal(t, `2.1.1`, addonDescriptor.Repositories[1].VersionYAML)
assert.Equal(t, ``, addonDescriptor.Repositories[0].SpLevel)
assert.Equal(t, ``, addonDescriptor.Repositories[1].SpLevel)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.NoError(t, err)
})
t.Run("Test: file does not exist", func(t *testing.T) {
expectedErrorMessage := "AddonDescriptor doesn't contain any repositories"
addonDescriptor, err := ReadAddonDescriptor("filename.yaml")
assert.EqualError(t, err, fmt.Sprintf("Could not find %v", "filename.yaml"))
assert.Equal(t, AddonDescriptor{}, addonDescriptor)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.EqualError(t, err, expectedErrorMessage)
})
t.Run("Test: empty config - failure case", func(t *testing.T) {
expectedErrorMessage := "AddonDescriptor doesn't contain any repositories"
addonDescriptor, err := ReadAddonDescriptor("")
assert.EqualError(t, err, fmt.Sprintf("Could not find %v", ""))
assert.Equal(t, AddonDescriptor{}, addonDescriptor)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.EqualError(t, err, expectedErrorMessage)
})
t.Run("Read empty addon descriptor from wrong config - failure case", func(t *testing.T) {
expectedErrorMessage := "AddonDescriptor doesn't contain any repositories"
expectedRepositoryList := AddonDescriptor{Repositories: []Repository{{}, {}}}
dir, err := ioutil.TempDir("", "test abap utils")
if err != nil {
t.Fatal("Failed to create temporary directory")
}
oldCWD, _ := os.Getwd()
_ = os.Chdir(dir)
// clean up tmp dir
defer func() {
_ = os.Chdir(oldCWD)
_ = os.RemoveAll(dir)
}()
manifestFileString := `
repositories:
- repo: 'testRepo'
- repo: 'testRepo2'`
err = ioutil.WriteFile("repositories.yml", []byte(manifestFileString), 0644)
addonDescriptor, err := ReadAddonDescriptor("repositories.yml")
assert.Equal(t, expectedRepositoryList, addonDescriptor)
assert.NoError(t, err)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.EqualError(t, err, expectedErrorMessage)
})
}
func TestHandleHTTPError(t *testing.T) {
t.Run("Test", func(t *testing.T) {

View File

@ -11,13 +11,23 @@ import (
"github.com/pkg/errors"
)
/*
* The AddonDescriptor
* ===================
* contains information about the Add-on Product and the comprised Add-on Software Component Git Repositories
*
* Lifecycle
* =========
* addon.yml file is read by abapAddonAssemblyKitCheckPV|CheckCV
* addonDesriptor is stored in CPE [commonPipelineEnvironment]
* subsequent steps enrich and update the data in CPE
*/
// AddonDescriptor contains fields about the addonProduct
type AddonDescriptor struct {
AddonProduct string `json:"addonProduct"`
AddonVersionYAML string `json:"addonVersion"`
AddonVersion string `json:"addonVersionAAK"`
AddonUniqueID string `json:"addonUniqueID"`
CustomerID interface{} `json:"customerID"`
AddonProduct string `json:"addonProduct"`
AddonVersionYAML string `json:"addonVersion"`
AddonVersion string `json:"addonVersionAAK"`
AddonSpsLevel string
AddonPatchLevel string
TargetVectorID string
@ -40,15 +50,17 @@ type Repository struct {
Status string
Namespace string
SarXMLFilePath string
Languages []string `json:"languages"`
}
// ReadAddonDescriptorType is the type for ReadAddonDescriptor for mocking
type ReadAddonDescriptorType func(FileName string) (AddonDescriptor, error)
type readFileFunc func(FileName string) ([]byte, error)
// ReadAddonDescriptor parses AddonDescriptor YAML file
func ReadAddonDescriptor(FileName string) (AddonDescriptor, error) {
var addonDescriptor AddonDescriptor
err := addonDescriptor.initFromYmlFile(FileName)
err := addonDescriptor.initFromYmlFile(FileName, readFile)
return addonDescriptor, err
}
@ -59,26 +71,35 @@ func ConstructAddonDescriptorFromJSON(JSON []byte) (AddonDescriptor, error) {
return addonDescriptor, err
}
func readFile(FileName string) ([]byte, error) {
fileLocations, err := filepath.Glob(FileName)
if err != nil || len(fileLocations) != 1 {
return nil, errors.New(fmt.Sprintf("Could not find %v", FileName))
}
absoluteFilename, err := filepath.Abs(fileLocations[0])
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not get path of %v", FileName))
}
var fileContent []byte
fileContent, err = ioutil.ReadFile(absoluteFilename)
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not read %v", FileName))
}
return fileContent, nil
}
// initFromYmlFile : Reads from file
func (me *AddonDescriptor) initFromYmlFile(FileName string) error {
filelocation, err := filepath.Glob(FileName)
if err != nil || len(filelocation) != 1 {
return errors.New(fmt.Sprintf("Could not find %v", FileName))
}
filename, err := filepath.Abs(filelocation[0])
func (me *AddonDescriptor) initFromYmlFile(FileName string, readFile readFileFunc) error {
fileContent, err := readFile(FileName)
if err != nil {
return errors.New(fmt.Sprintf("Could not get path of %v", FileName))
}
var yamlBytes []byte
yamlBytes, err = ioutil.ReadFile(filename)
if err != nil {
return errors.New(fmt.Sprintf("Could not read %v", FileName))
return err
}
var jsonBytes []byte
jsonBytes, err = yaml.YAMLToJSON(yamlBytes)
jsonBytes, err = yaml.YAMLToJSON(fileContent)
if err != nil {
return errors.New(fmt.Sprintf("Could not parse %v", FileName))
}
@ -126,3 +147,15 @@ func (me *AddonDescriptor) AsJSON() []byte {
func (me *AddonDescriptor) SetRepositories(Repositories []Repository) {
me.Repositories = Repositories
}
// GetAakAasLanguageVector : dito
func (me *Repository) GetAakAasLanguageVector() string {
if len(me.Languages) <= 0 {
return `ISO-DEEN`
}
languageVector := `ISO-`
for _, language := range me.Languages {
languageVector = languageVector + language
}
return languageVector
}

View File

@ -0,0 +1,142 @@
package abaputils
import (
"fmt"
"io/ioutil"
"os"
"testing"
"github.com/stretchr/testify/assert"
)
func readFileMock(FileName string) ([]byte, error) {
return []byte(FileName), nil
}
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)
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())
})
}
var TestAddonDescriptorYAML = `---
addonProduct: /DMO/myAddonProduct
addonVersion: 3.1.4
repositories:
- name: /DMO/REPO_A
tag: v-1.0.1
commitID: 89fLKS273S
branch: release-v.1.0.1
version: 1.0.1
languages:
- DE
- EN
- name: /DMO/REPO_B
tag: rel-2.1.1
commitID: JEK8S273S
branch: release-v.2.1.1
version: 2.1.1
languages:
- DE
- EN
- FR`
func TestReadAddonDescriptor(t *testing.T) {
t.Run("Test: success case", func(t *testing.T) {
dir, err := ioutil.TempDir("", "test read addon descriptor")
if err != nil {
t.Fatal("Failed to create temporary directory")
}
oldCWD, _ := os.Getwd()
_ = os.Chdir(dir)
// clean up tmp dir
defer func() {
_ = os.Chdir(oldCWD)
_ = os.RemoveAll(dir)
}()
file, _ := os.Create("filename.yaml")
file.Write([]byte(TestAddonDescriptorYAML))
addonDescriptor, err := ReadAddonDescriptor("filename.yaml")
assert.NoError(t, err)
assert.Equal(t, `/DMO/myAddonProduct`, addonDescriptor.AddonProduct)
assert.Equal(t, `3.1.4`, addonDescriptor.AddonVersionYAML)
assert.Equal(t, ``, addonDescriptor.AddonSpsLevel)
assert.Equal(t, `/DMO/REPO_A`, addonDescriptor.Repositories[0].Name)
assert.Equal(t, `/DMO/REPO_B`, addonDescriptor.Repositories[1].Name)
assert.Equal(t, `v-1.0.1`, addonDescriptor.Repositories[0].Tag)
assert.Equal(t, `rel-2.1.1`, addonDescriptor.Repositories[1].Tag)
assert.Equal(t, `release-v.1.0.1`, addonDescriptor.Repositories[0].Branch)
assert.Equal(t, `release-v.2.1.1`, addonDescriptor.Repositories[1].Branch)
assert.Equal(t, `1.0.1`, addonDescriptor.Repositories[0].VersionYAML)
assert.Equal(t, `2.1.1`, addonDescriptor.Repositories[1].VersionYAML)
assert.Equal(t, ``, addonDescriptor.Repositories[0].SpLevel)
assert.Equal(t, ``, addonDescriptor.Repositories[1].SpLevel)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.NoError(t, err)
})
t.Run("Test: file does not exist", func(t *testing.T) {
expectedErrorMessage := "AddonDescriptor doesn't contain any repositories"
addonDescriptor, err := ReadAddonDescriptor("filename.yaml")
assert.EqualError(t, err, fmt.Sprintf("Could not find %v", "filename.yaml"))
assert.Equal(t, AddonDescriptor{}, addonDescriptor)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.EqualError(t, err, expectedErrorMessage)
})
t.Run("Test: empty config - failure case", func(t *testing.T) {
expectedErrorMessage := "AddonDescriptor doesn't contain any repositories"
addonDescriptor, err := ReadAddonDescriptor("")
assert.EqualError(t, err, fmt.Sprintf("Could not find %v", ""))
assert.Equal(t, AddonDescriptor{}, addonDescriptor)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.EqualError(t, err, expectedErrorMessage)
})
t.Run("Read empty addon descriptor from wrong config - failure case", func(t *testing.T) {
expectedErrorMessage := "AddonDescriptor doesn't contain any repositories"
expectedRepositoryList := AddonDescriptor{Repositories: []Repository{{}, {}}}
dir, err := ioutil.TempDir("", "test abap utils")
if err != nil {
t.Fatal("Failed to create temporary directory")
}
oldCWD, _ := os.Getwd()
_ = os.Chdir(dir)
// clean up tmp dir
defer func() {
_ = os.Chdir(oldCWD)
_ = os.RemoveAll(dir)
}()
manifestFileString := `
repositories:
- repo: 'testRepo'
- repo: 'testRepo2'`
err = ioutil.WriteFile("repositories.yml", []byte(manifestFileString), 0644)
addonDescriptor, err := ReadAddonDescriptor("repositories.yml")
assert.Equal(t, expectedRepositoryList, addonDescriptor)
assert.NoError(t, err)
err = CheckAddonDescriptorForRepositories(addonDescriptor)
assert.EqualError(t, err, expectedErrorMessage)
})
}