1
0
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:
Jk1484 2023-11-10 15:04:00 +05:00 committed by GitHub
parent 54604fb52d
commit f2b236c537
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 105 additions and 24 deletions

View File

@ -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 {

View File

@ -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{

View File

@ -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)
})
}

View File

@ -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