mirror of
https://github.com/SAP/jenkins-library.git
synced 2025-02-05 13:25:19 +02:00
feat(npmExecuteScripts): added option to skip installing dev. deps. (#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 <anil.keshav@sap.com>
This commit is contained in:
parent
54604fb52d
commit
f2b236c537
@ -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"
|
||||
@ -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 {
|
||||
|
@ -36,6 +36,7 @@ type npmExecuteScriptsOptions struct {
|
||||
RepositoryUsername string `json:"repositoryUsername,omitempty"`
|
||||
BuildSettingsInfo string `json:"buildSettingsInfo,omitempty"`
|
||||
PackBeforePublish bool `json:"packBeforePublish,omitempty"`
|
||||
Production bool `json:"production,omitempty"`
|
||||
}
|
||||
|
||||
type npmExecuteScriptsCommonPipelineEnvironment struct {
|
||||
@ -239,6 +240,7 @@ func addNpmExecuteScriptsFlags(cmd *cobra.Command, stepConfig *npmExecuteScripts
|
||||
cmd.Flags().StringVar(&stepConfig.RepositoryUsername, "repositoryUsername", os.Getenv("PIPER_repositoryUsername"), "Username for the repository to which the project artifacts should be published.")
|
||||
cmd.Flags().StringVar(&stepConfig.BuildSettingsInfo, "buildSettingsInfo", os.Getenv("PIPER_buildSettingsInfo"), "build settings info is typically filled by the step automatically to create information about the build settings that were used during the npm build . This information is typically used for compliance related processes.")
|
||||
cmd.Flags().BoolVar(&stepConfig.PackBeforePublish, "packBeforePublish", false, "used for executing npm pack first, followed by npm publish. This two step maybe required in two cases. case 1) When building multiple npm packages (multiple package.json) please keep this parameter true and also see `buildDescriptorList` or `buildDescriptorExcludeList` to choose which package(s) to publish. case 2)when you are building a single npm (single `package.json` in your repo) / multiple npm (multiple package.json) scoped package(s) and have npm dependencies from the same scope.")
|
||||
cmd.Flags().BoolVar(&stepConfig.Production, "production", false, "used for omitting installation of dev. dependencies if true")
|
||||
|
||||
}
|
||||
|
||||
@ -417,6 +419,15 @@ func npmExecuteScriptsMetadata() config.StepData {
|
||||
Aliases: []config.Alias{},
|
||||
Default: false,
|
||||
},
|
||||
{
|
||||
Name: "production",
|
||||
ResourceRef: []config.ResourceReference{},
|
||||
Scope: []string{"STEPS", "STAGES", "PARAMETERS"},
|
||||
Type: "bool",
|
||||
Mandatory: false,
|
||||
Aliases: []config.Alias{},
|
||||
Default: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
Containers: []config.Container{
|
||||
|
@ -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"
|
||||
@ -32,81 +34,105 @@ 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\": \"\" } }"))
|
||||
@ -114,7 +140,11 @@ func TestNpmExecuteScripts(t *testing.T) {
|
||||
|
||||
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)) {
|
||||
@ -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)
|
||||
})
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user