Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Introduce new npmExecuteTests step #5124

Merged
merged 64 commits into from
Jan 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
da9d73b
feat: Introduce new npmExecuteTests step
Oct 1, 2024
20e00eb
fix: comma
Oct 1, 2024
f24b876
fix: parens
Oct 1, 2024
7cadbf8
fix: error handling
Oct 1, 2024
221840f
fix: paren
Oct 1, 2024
17f0810
fix: config keys
Oct 1, 2024
0dc2cee
fix: rename key
Oct 1, 2024
49d42fb
Merge branch 'master' into phgermanov/npm-execute-tests-go
phgermanov Oct 2, 2024
47ca127
test: failng tests
Oct 2, 2024
187d850
fix: handle empty openFile call
Oct 4, 2024
aeef66b
refactor: clean install rather than install
Oct 4, 2024
56dfffe
refactor: full run command in config
Oct 4, 2024
65f7cba
build: use lts-bookworm
Oct 4, 2024
20f05d8
Merge branch 'master' into phgermanov/npm-execute-tests-go
phgermanov Oct 4, 2024
045b530
feat: get credentials from vault
Oct 8, 2024
6bf1d06
feat: remove wdi5 install script
Oct 8, 2024
64f063f
fix: groovy tests
Oct 8, 2024
f67b7a8
fix: report type
phgermanov Oct 8, 2024
8e4ba08
docs: remove defaults from desc
Oct 8, 2024
1a3e5ea
feat: remove branch params
Oct 8, 2024
c22d874
refactor: rename appSecrets to vaultMetadata
Oct 8, 2024
8c2456d
feat: param for custom env var prefix
Oct 8, 2024
7c14e86
refactor: change app urls map to a list
Oct 8, 2024
d8db284
refactor: rename appURLs for clarity
Oct 8, 2024
44f8cd9
refactor: user can specify url option param
Oct 8, 2024
ec8369a
docs: go generate
Oct 8, 2024
5768f0f
feat: add support for user defined env vars and paths
Oct 10, 2024
84cf942
refactor: rename runScript to runCommand
Oct 10, 2024
d4cf486
refactor: expose username and password env vars
Oct 10, 2024
cf6af6f
refactor: rename envVars to envs
Oct 10, 2024
5dc002b
docs: add documentation for npmExecuteTests step
Oct 10, 2024
17175ff
feat: better handle vault secrets
Oct 10, 2024
3d9c038
refactor: flatten vault secrets
Oct 11, 2024
0f8f9c3
docs: add npmExecuteTests docs to mkdocs
Oct 11, 2024
1a682fc
feat: add npmExecuteTests to piper cmd
Oct 11, 2024
db6c087
Merge branch 'master' into phgermanov/npm-execute-tests-go
phgermanov Oct 11, 2024
23ac975
chore: go generate
Oct 14, 2024
e1a3653
fix: modify working dir
Oct 15, 2024
970f340
fix: change npm cache dir
Oct 15, 2024
803f18d
fix: use os home dir
Oct 15, 2024
bc61bf3
fix: remove working dir
Oct 15, 2024
103f0e5
fix: remove npm set cache
Oct 17, 2024
9c482a4
feat: add param for changing dir
Oct 23, 2024
84879a5
Merge branch 'master' into phgermanov/npm-execute-tests-go
phgermanov Dec 3, 2024
14f1527
chore: log current directory
Dec 4, 2024
c778adf
chore: fix log
Dec 4, 2024
51548a4
test: debug log
Dec 5, 2024
d1ac1e7
fix: cnange workdir param
Dec 5, 2024
ce98cff
fix: default workdir
Dec 5, 2024
d7e4bc0
test: add param
Dec 5, 2024
636be4b
test: log config
Dec 5, 2024
13a287e
S C O P E
Dec 6, 2024
52ed146
chore: remove debug logs
Dec 6, 2024
4da465d
feat: add sidecar
Dec 18, 2024
d135127
fix: sidecar config
Dec 18, 2024
9b637e2
fix: remove sidecar
Dec 19, 2024
44754da
feat: add placeholder sidecar
Dec 19, 2024
2766216
refactor: remove unnecessary logs
Dec 19, 2024
2469441
feat: defer credentials reset
Dec 19, 2024
9aec770
docs: selenium grid
Dec 20, 2024
c215bac
feat: add selenium image
Jan 2, 2025
a205ec9
chore: remove debug log
Jan 2, 2025
d768424
Merge branch 'master' into phgermanov/npm-execute-tests-go
phgermanov Jan 2, 2025
6fc71b3
docs: add beta warning
Jan 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cmd/getConfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@ func GetStageConfig() (config.StepConfig, error) {

defaultConfig := []io.ReadCloser{}
for _, f := range GeneralConfig.DefaultConfig {
if configOptions.OpenFile == nil {
return stepConfig, errors.New("config: open file function not set")
}
Comment on lines +141 to +143
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks unrelated

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is, but it's been missed in some old PR and it's a hard bug to catch, might add it as a new PR

fc, err := configOptions.OpenFile(f, GeneralConfig.GitHubAccessTokens)
// only create error for non-default values
if err != nil && f != ".pipeline/defaults.yaml" {
Expand Down
1 change: 1 addition & 0 deletions cmd/metadata_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions cmd/mtaBuild_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ func TestMtaBuild(t *testing.T) {
SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

t.Run("Application name not set", func(t *testing.T) {
utilsMock := newMtaBuildTestUtilsBundle()
options := mtaBuildOptions{}
Expand Down
115 changes: 115 additions & 0 deletions cmd/npmExecuteTests.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package cmd

import (
"fmt"
"os"
"strings"

"github.com/SAP/jenkins-library/pkg/command"
"github.com/SAP/jenkins-library/pkg/log"
"github.com/SAP/jenkins-library/pkg/telemetry"
)

type vaultUrl struct {
URL string `json:"url"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
}

func npmExecuteTests(config npmExecuteTestsOptions, _ *telemetry.CustomData) {
c := command.Command{}

c.Stdout(log.Writer())
c.Stderr(log.Writer())
err := runNpmExecuteTests(&config, &c)
if err != nil {
log.Entry().WithError(err).Fatal("Step execution failed")
}
}

func runNpmExecuteTests(config *npmExecuteTestsOptions, c command.ExecRunner) error {
if len(config.Envs) > 0 {
c.SetEnv(config.Envs)
}

if len(config.Paths) > 0 {
path := fmt.Sprintf("PATH=%s:%s", os.Getenv("PATH"), strings.Join(config.Paths, ":"))
c.SetEnv([]string{path})
}

if config.WorkingDirectory != "" {
if err := os.Chdir(config.WorkingDirectory); err != nil {
return fmt.Errorf("failed to change directory: %w", err)
}
}

installCommandTokens := strings.Fields(config.InstallCommand)
if err := c.RunExecutable(installCommandTokens[0], installCommandTokens[1:]...); err != nil {
return fmt.Errorf("failed to execute install command: %w", err)
}

parsedURLs, err := parseURLs(config.VaultURLs)
if err != nil {
return err
}

for _, app := range parsedURLs {
if err := runTestForUrl(app.URL, app.Username, app.Password, config, c); err != nil {
return err
}
}

if err := runTestForUrl(config.BaseURL, config.VaultUsername, config.VaultPassword, config, c); err != nil {
return err
}
return nil
}

func runTestForUrl(url, username, password string, config *npmExecuteTestsOptions, command command.ExecRunner) error {
credentialsToEnv(username, password, config.UsernameEnvVar, config.PasswordEnvVar, command)
// we need to reset the env vars as the next test might not have any credentials
defer resetCredentials(config.UsernameEnvVar, config.PasswordEnvVar, command)

runScriptTokens := strings.Fields(config.RunCommand)
if config.UrlOptionPrefix != "" {
runScriptTokens = append(runScriptTokens, config.UrlOptionPrefix+url)
}
if err := command.RunExecutable(runScriptTokens[0], runScriptTokens[1:]...); err != nil {
return fmt.Errorf("failed to execute npm script: %w", err)
}

return nil
}

func parseURLs(urls []map[string]interface{}) ([]vaultUrl, error) {
parsedUrls := []vaultUrl{}

for _, url := range urls {
parsedUrl := vaultUrl{}
urlStr, ok := url["url"].(string)
if !ok {
return nil, fmt.Errorf("url field is not a string")
}
parsedUrl.URL = urlStr
if username, ok := url["username"].(string); ok {
parsedUrl.Username = username
}

if password, ok := url["password"].(string); ok {
parsedUrl.Password = password
}
parsedUrls = append(parsedUrls, parsedUrl)
}
return parsedUrls, nil
}

func credentialsToEnv(username, password, usernameEnv, passwordEnv string, c command.ExecRunner) {
if username == "" || password == "" {
return
}
c.SetEnv([]string{usernameEnv + "=" + username, passwordEnv + "=" + password})
}

func resetCredentials(usernameEnv, passwordEnv string, c command.ExecRunner) {
c.SetEnv([]string{usernameEnv + "=", passwordEnv + "="})
}
Loading
Loading