Skip to content

Commit

Permalink
feat(npmExecuteScripts): added option to skip installing dev. deps. (#…
Browse files Browse the repository at this point in the history
…4660)

* feat(npmExecuteScripts): added option to skip installing dev. deps.

* added unit tests

* setting of OpenFile function for local testing

---------

Co-authored-by: Anil Keshav <[email protected]>
  • Loading branch information
Jk1484 and anilkeshav27 authored Nov 10, 2023
1 parent 54604fb commit f2b236c
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 24 deletions.
7 changes: 7 additions & 0 deletions cmd/npmExecuteScripts.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package cmd

import (
"os"

"github.com/SAP/jenkins-library/pkg/buildsettings"
"github.com/SAP/jenkins-library/pkg/log"
"github.com/SAP/jenkins-library/pkg/npm"
Expand All @@ -19,6 +21,11 @@ func npmExecuteScripts(config npmExecuteScriptsOptions, telemetryData *telemetry
}

func runNpmExecuteScripts(npmExecutor npm.Executor, config *npmExecuteScriptsOptions, commonPipelineEnvironment *npmExecuteScriptsCommonPipelineEnvironment) error {
// setting env. variable to omit installation of dev. dependencies
if config.Production {
os.Setenv("NODE_ENV", "production")
}

if config.Install {
if len(config.BuildDescriptorList) > 0 {
if err := npmExecutor.InstallAllDependencies(config.BuildDescriptorList); err != nil {
Expand Down
11 changes: 11 additions & 0 deletions cmd/npmExecuteScripts_generated.go

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

103 changes: 79 additions & 24 deletions cmd/npmExecuteScripts_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
package cmd

import (
"os"
"testing"

"github.com/SAP/jenkins-library/pkg/config"
"github.com/SAP/jenkins-library/pkg/mock"
"github.com/SAP/jenkins-library/pkg/npm"
"github.com/stretchr/testify/assert"
Expand All @@ -32,89 +34,117 @@ func TestNpmExecuteScripts(t *testing.T) {
cpe := npmExecuteScriptsCommonPipelineEnvironment{}

t.Run("Call with packagesList", func(t *testing.T) {
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, BuildDescriptorList: []string{"package.json", "src/package.json"}}
cfg := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, BuildDescriptorList: []string{"package.json", "src/package.json"}}
utils := npm.NewNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: config.Install, RunScripts: config.RunScripts, PackagesList: config.BuildDescriptorList}}
err := runNpmExecuteScripts(&npmExecutor, &config, &cpe)
SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: cfg.Install, RunScripts: cfg.RunScripts, PackagesList: cfg.BuildDescriptorList}}
err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)

assert.NoError(t, err)
})

t.Run("Call with excludeList", func(t *testing.T) {
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, BuildDescriptorExcludeList: []string{"**/path/**"}}
cfg := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, BuildDescriptorExcludeList: []string{"**/path/**"}}
utils := npm.NewNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: config.Install, RunScripts: config.RunScripts, ExcludeList: config.BuildDescriptorExcludeList}}
err := runNpmExecuteScripts(&npmExecutor, &config, &cpe)
SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: cfg.Install, RunScripts: cfg.RunScripts, ExcludeList: cfg.BuildDescriptorExcludeList}}
err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)

assert.NoError(t, err)
})

t.Run("Call with scriptOptions", func(t *testing.T) {
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, ScriptOptions: []string{"--run"}}
cfg := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, ScriptOptions: []string{"--run"}}
utils := npm.NewNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: config.Install, RunScripts: config.RunScripts, ScriptOptions: config.ScriptOptions}}
err := runNpmExecuteScripts(&npmExecutor, &config, &cpe)
SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: cfg.Install, RunScripts: cfg.RunScripts, ScriptOptions: cfg.ScriptOptions}}
err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)

assert.NoError(t, err)
})

t.Run("Call with install", func(t *testing.T) {
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}}
cfg := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}}
utils := npm.NewNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: config.Install, RunScripts: config.RunScripts}}
err := runNpmExecuteScripts(&npmExecutor, &config, &cpe)
SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: cfg.Install, RunScripts: cfg.RunScripts}}
err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)

assert.NoError(t, err)
})

t.Run("Call without install", func(t *testing.T) {
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}}
cfg := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}}
utils := npm.NewNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: config.Install, RunScripts: config.RunScripts}}
err := runNpmExecuteScripts(&npmExecutor, &config, &cpe)
SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: cfg.Install, RunScripts: cfg.RunScripts}}
err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)

assert.NoError(t, err)
})

t.Run("Call with virtualFrameBuffer", func(t *testing.T) {
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, VirtualFrameBuffer: true}
cfg := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, VirtualFrameBuffer: true}
utils := npm.NewNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: config.Install, RunScripts: config.RunScripts, VirtualFrameBuffer: config.VirtualFrameBuffer}}
err := runNpmExecuteScripts(&npmExecutor, &config, &cpe)
SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

npmExecutor := npm.NpmExecutorMock{Utils: utils, Config: npm.NpmConfig{Install: cfg.Install, RunScripts: cfg.RunScripts, VirtualFrameBuffer: cfg.VirtualFrameBuffer}}
err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)

assert.NoError(t, err)
})

t.Run("Test integration with npm pkg", func(t *testing.T) {
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build"}}
cfg := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build"}}

options := npm.ExecutorOptions{DefaultNpmRegistry: config.DefaultNpmRegistry}
options := npm.ExecutorOptions{DefaultNpmRegistry: cfg.DefaultNpmRegistry}

utils := newNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"scripts\": { \"ci-build\": \"\" } }"))
utils.AddFile("package-lock.json", []byte(""))

npmExecutor := npm.Execute{Utils: &utils, Options: options}

err := runNpmExecuteScripts(&npmExecutor, &config, &cpe)
SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)

if assert.NoError(t, err) {
if assert.Equal(t, 4, len(utils.execRunner.Calls)) {
Expand All @@ -126,17 +156,42 @@ func TestNpmExecuteScripts(t *testing.T) {
})

t.Run("Call with createBOM", func(t *testing.T) {
config := npmExecuteScriptsOptions{CreateBOM: true, RunScripts: []string{"ci-build", "ci-test"}}
cfg := npmExecuteScriptsOptions{CreateBOM: true, RunScripts: []string{"ci-build", "ci-test"}}

options := npm.ExecutorOptions{DefaultNpmRegistry: config.DefaultNpmRegistry}
options := npm.ExecutorOptions{DefaultNpmRegistry: cfg.DefaultNpmRegistry}

utils := newNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))

SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

npmExecutor := npm.Execute{Utils: &utils, Options: options}
err := runNpmExecuteScripts(&npmExecutor, &config, &cpe)
err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)

assert.NoError(t, err)
})

t.Run("Call with production", func(t *testing.T) {
cfg := npmExecuteScriptsOptions{Production: true, RunScripts: []string{"ci-build", "ci-test"}}

options := npm.ExecutorOptions{DefaultNpmRegistry: cfg.DefaultNpmRegistry}

utils := newNpmMockUtilsBundle()
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))

SetConfigOptions(ConfigCommandOptions{
OpenFile: config.OpenPiperFile,
})

npmExecutor := npm.Execute{Utils: &utils, Options: options}
err := runNpmExecuteScripts(&npmExecutor, &cfg, &cpe)
assert.NoError(t, err)

v := os.Getenv("NODE_ENV")
assert.Equal(t, "production", v)
})
}
8 changes: 8 additions & 0 deletions resources/metadata/npmExecuteScripts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,14 @@ spec:
- STEPS
- STAGES
- PARAMETERS
- name: production
type: bool
default: false
description: used for omitting installation of dev. dependencies if true
scope:
- STEPS
- STAGES
- PARAMETERS
outputs:
resources:
- name: commonPipelineEnvironment
Expand Down

0 comments on commit f2b236c

Please sign in to comment.