@nx-boat-tools/helm v0.1.0-alpha.2
Nx Boat Tools - Helm
The helm is a key tool for any boat! The helm plugin adds Helm support to existing Nx projects.
💡 How to install
npm install -D @nx-boat-tools/helm
# OR
yarn add -D @nx-boat-tools/helm🏃 Executors
copyValues
The copyValues executor copies all of the values files in the helm directory of a project to the project's dist directory.
Available options:
| name | type | default | description |
|---|---|---|---|
projectHelmPath | string | Required. The path to the helm directory of a project | |
outputPath | string | Required. The dist path of the project where the values files should be copied to |
Example:
The following workspace configuration illustrates a possible helm copyValues target for a given project.
//workspace.json
{
//...
"projects": {
"example": {
//...
"targets": {
"copyHelmValues": {
"executor": "@nx-boat-tools/helm:copyValues",
"options": {
"projectHelmPath": "apps/example/helm",
"outputPath": "dist/apps/example/helm/values"
}
}
}
}
}
}To run this we just need to execute the copyHelmValues target...
nx copyHelmValues example
# OR
nx run example:copyHelmValuesThis would result in copying the all the values files from apps/example/helm to dist/apps/example/helm/values. This will not include apps/example/helm/chart or any other nested folders in the project helm directory
installLocalChart
Used for local helm charts, the installLocalChart executor runs a Helm upgrade command to install a helm chart from the filesystem.
Available options:
| name | type | default | description |
|---|---|---|---|
projectHelmPath | string | Required. The path to the helm directory of a project | |
valuesFilePaths | string[] | The path to any values files to use with the chart | |
dryRun | boolean | false | Whether or not to perform a dry run instead of actually installing the helm chart |
Example:
The following workspace configuration illustrates a possible helm installLocalChart target for a given project.
//workspace.json
{
//...
"projects": {
"example": {
//...
"targets": {
"installHelmChart": {
"executor": "@nx-boat-tools/helm:installLocalChart",
"options": {
"projectHelmPath": "apps/example/helm",
"valuesFilePaths": "apps/example/helm/values.yaml"
},
"configurations": {
"dev": {
"valuesFilePaths": "apps/example/helm/values-dev.yaml"
}
}
}
}
}
}
}To run this we just need to execute the installHelmChart target...
nx installHelmChart example
# OR
nx run example:installHelmChartThis would result in installing the helm chart located in the project's helm directory and would use the values.yaml values file.
installRepoChart
Used for repo helm charts, the installRepoChart executor runs a Helm upgrade command to install a helm chart from a repository.
Available options:
| name | type | default | description |
|---|---|---|---|
repository | string | Required. The name of the repository containing your chart | |
chart | string | Required. The name of the chart to use (without the repository) | |
valuesFilePaths | string[] | The path to any values files to use with the chart | |
dryRun | boolean | false | Whether or not to perform a dry run instead of actually installing the helm chart |
Example:
The following workspace configuration illustrates a possible helm installRepoChart target for a given project.
//workspace.json
{
//...
"projects": {
"example": {
//...
"targets": {
"installHelmChart": {
"executor": "@nx-boat-tools/helm:installRepoChart",
"options": {
"repository": "bitnami",
"chart": "mysql",
"valuesFilePaths": "apps/example/helm/values.yaml"
},
"configurations": {
"dev": {
"valuesFilePaths": "apps/example/helm/values-dev.yaml"
}
}
}
}
}
}
}To run this we just need to execute the installHelmChart target...
nx installHelmChart example
# OR
nx run example:installHelmChartThis would result in installing the mysql helm chart from the bitnami helm repository and would use the values.yaml values file.
lint
Only for local helm charts, the lint executor will call the helm lint command to verify that the chart is well-formed.
Available options:
| name | type | default | description |
|---|---|---|---|
projectHelmPath | string | Required. The path to the helm directory of a project |
Example:
The following workspace configuration illustrates a possible helm lint target for a given project.
//workspace.json
{
//...
"projects": {
"example": {
//...
"targets": {
"lintHelmChart": {
"executor": "@nx-boat-tools/helm:lint",
"options": {
"projectHelmPath": "apps/example/helm"
}
}
}
}
}
}To verify the local helm chart, we just need to execute the lintHelmChart target...
nx lintHelmChart example
# OR
nx run lintHelmChart:packagepackage
Only for local helm charts, the package executor will call the helm package command to create a versioned chart archive file.
Available options:
| name | type | default | description |
|---|---|---|---|
projectHelmPath | string | Required. The path to the helm directory of a project | |
outputPath | string | Required. The dist path of the project where the chart archive file should be created |
Example:
The following workspace configuration illustrates a possible helm package target for a given project.
//workspace.json
{
//...
"projects": {
"example": {
//...
"targets": {
"package": {
"executor": "@nx-boat-tools/helm:package",
"options": {
"projectHelmPath": "apps/example/helm",
"outputPath": "dist/apps/example/helm/chart"
}
}
}
}
}
}To create the chart archive file we just need to execute the package target...
nx package example
# OR
nx run example:packageBoth of the above would result in a chart archive file being created at dist/apps/example/helm/chart/example-X.X.X.tgz where X.X.X is the versions specified in the project's package.json. If no version exists then the filename would just be dist/apps/example/helm/chart/example.tgz
portForward
The portForward executor will run a kubectl portForward command so the helm chart can be tested locally.
Available options:
| name | type | default | description |
|---|---|---|---|
resourceName | string | Required. The kubernetes resource to forward to | |
hostPort | integer | Required. The port to map to on the host | |
containerPort | integer | Required. The port exposed by the container |
Example:
The following workspace configuration illustrates a possible helm portForward target for a given project.
//workspace.json
{
//...
"projects": {
"example": {
//...
"targets": {
"portForwardToMinikube": {
"executor": "@nx-boat-tools/helm:portForward",
"options": {
"resourceName": "service/example/",
"hostPort": 8080,
"containerPort": 80
}
}
}
}
}
}To create the chart archive file we just need to execute the portForwardToMinikube target...
nx portForwardToMinikube example
# OR
nx run example:portForwardToMinikubeBoth of the above would allow the service to be accessed via http://localhost:8080
uninstall
The uninstall executor will call the helm uninstall command to remove the helm deployment for the project.
Available options:
| name | type | default | description |
|---|---|---|---|
dryRun | boolean | false | Whether or not to perform a dry run instead of actually installing the helm chart |
Example:
The following workspace configuration illustrates a possible helm uninstall target for a given project.
//workspace.json
{
//...
"projects": {
"example": {
//...
"targets": {
"uninstallHelmChart": {
"executor": "@nx-boat-tools/helm:uninstall"
}
}
}
}
}To verify the local helm chart, we just need to execute the uninstallHelmChart target...
nx uninstallHelmChart example
# OR
nx run uninstallHelmChart:package✍️ Generators
local-chart
The local-chart generator is for creating a local helm chart for an existing project.
Available options:
| name | type | default | description |
|---|---|---|---|
project | string | Required. The name of the project to add helm to. | |
createValues | boolean | true | Whether or not to copy the values file from the chart to use for deployment |
environments | string? | undefined | When createValues is set to true, this is a comma seperated list of environment names that can be used to create a copy for each environment specified |
runBuildTarget | string | An optional build target to call before running the helm chart | |
runResourceName | string | The name of the resource to port-forward to within minikube) | |
runHostPort | number | The host port to use when port-forwarding to minikube | |
runContainerPort | number | The container port to use when port-forwarding to minikube |
Generated files:
The generated files should mostly reflect the same files you'd get from running helm create. A helm folder is added within the project directory and it will contain the chart directory and as well as any values files that were created.
Updates to project configuration:
The project's entry in the project configuration will be updated as follows:
build- If abuildtarget existed previously then it will be renamed to tobuildSrc. A newbuildwill then be added and is achain-executewith the following stages and targets:🚩 Note: If no
buildtarget exists before running thelocal-chartgenerator the no root stage will be added.- The
rootstage:buildSrc- This is the previous build target and we want it to run first
- The
helmChartstage:lintHelmChart- This calls the dockerlinttarget to test the helm chart
- The
package- If apackagetarget existed previously then it will be renamed to topackageSrc. A newpackagewill then be added and is achain-executewith the following stages and targets:🚩 Note: If no
packagetarget exists before running thelocal-chartgenerator the no root stage will be added.- The
rootstage:packageSrc- This is the previous package target and we want it to run first
- The
helmChartstage:copyHelmValues- This calls the helmcopyValuestarget to copy any values files to the dist directory.packageHelmChart- this calls the helmpackageexecutor to create a chart archive file in the dist directory
- The
runHelmChart- this calls achain-executewith the following stages and targets:- The
buildstage (only if a build target was specified):- The build target specified is added as a regular target of the stage.
- The
rootstage:installHelmChart- This calls the helminstallLocalCharttarget to install the helm chart into kubernetesportForwardToMinikube- this calls the helmportForwardexecutor to allow the chart to be tested locallyuninstallHelmChart- this calls the helmuninstallexecutor to uninstall the chart from kubernetes
ℹ️ Since the build target is added as a regular target to a
build stageand all run targets are added as post targets on therootstage, the build target will always run first.- The
The following is a full example of what's added to the project configuration for a project when adding helm to it:
//workspace.json BEFORE
{
//...
"projects": {
"my-app": {
"root": "apps/my-app",
"projectType": "application",
"sourceRoot": "apps/my-app/src",
"targets": {
"build": {
"executor": "@nrwl/node:package"
//...
}
},
"tags": ""
}
}
}//workspace.json AFTER
{
//...
"projects": {
"my-app": {
"root": "apps/my-app",
"projectType": "application",
"sourceRoot": "apps/my-app/src",
"targets": {
"build": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"targets": ["buildSrc"],
"stages": {
"helmChart": {
"targets": ["lintHelmChart"]
}
}
}
},
"buildSrc": {
"executor": "@nrwl/node:package"
//...
},
"copyHelmValues": {
"executor": "@nx-boat-tools/helm:copyValues",
"options": {
"projectHelmPath": "apps/my-app/helm",
"distPath": "dist/apps/my-app/helm/values"
}
},
"installHelmChart": {
"executor": "@nx-boat-tools/helm:installLocalChart",
"options": {
"projectHelmPath": "apps/my-app/helm",
"valuesFilePaths": ["apps/my-app/helm/values.yaml"]
}
},
"lintHelmChart": {
"executor": "@nx-boat-tools/helm:lint",
"options": {
"projectHelmPath": "apps/my-app/helm"
}
},
"package": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"targets": ["packageSrc"],
"stages": {
"helmChart": {
"targets": ["copyHelmValues", "packageHelmChart"]
}
}
}
},
"packageHelmChart": {
"executor": "@nx-boat-tools/helm:package",
"options": {
"projectHelmPath": "apps/my-app/helm",
"distPath": "dist/apps/my-app/helm/chart"
}
},
"packageSrc": {
"executor": "@nrwl/node:package"
//...
},
"portForwardToMinikube": {
"executor": "@nx-boat-tools/helm:portForward",
"options": {
"resourceName": "service/my-app",
"hostPort": 8080,
"containerPort": 80
}
},
"runHelmChart": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"postTargets": [
"installHelmChart",
"portForwardToMinikube",
"uninstallHelmChart"
]
}
},
"uninstallHelmChart": {
"executor": "@nx-boat-tools/helm:uninstall",
"options": {}
}
},
"tags": ""
}
}
}Adding local-chart to a project
The following illustrates how to add a local helm chart to a project:
#Add a helm chart to a project named my-project with a single values file, values.yaml
nx g @nx-dev-tools/helm:local-chart --project=my-project --createValues=true
#Add a helm chart to a project named my-project with two values files, values-dev.yaml and values-prod.yaml
nx g @nx-dev-tools/helm:local-chart --project=my-project --createValues=true --environments=dev,prodrepo-chart
The repo-chart generator is for adding a helm chart from a repository to your project.
Available options:
| name | type | default | description |
|---|---|---|---|
project | string | Required. The name of the project to add helm to. | |
repository | string | Required. The name of the repository containing the chart | |
chart | string | Required. The name of the chart to use (without the repository) | |
environments | string? | undefined | This is a comma seperated list of environment names that can be used to create a copy for each environment specified |
runBuildTarget | string | An optional build target to call before running the helm chart | |
runResourceName | string | The name of the resource to port-forward to within minikube) | |
runHostPort | number | The host port to use when port-forwarding to minikube | |
runContainerPort | number | The container port to use when port-forwarding to minikube |
Generated files:
A helm folder is added within the project directory containing the values files that were created.
Updates to project configuration:
The project's entry in the project configuration will be updated as follows:
package- If apackagetarget existed previously then it will be renamed to topackageSrc. A newpackagewill then be added and is achain-executewith the following stages and targets:🚩 Note: If no
packagetarget exists before running therepo-chartgenerator the no root stage will be added.- The
rootstage:packageSrc- This is the previous package target and we want it to run first
- The
helmChartstage:copyHelmValues- This calls the helmcopyValuestarget to copy any values files to the dist directory.
- The
runHelmChart- this calls achain-executewith the following stages and targets:- The
buildstage (only if a build target was specified):- The build target specified is added as a regular target of the stage.
- The
rootstage:installHelmChart- This calls the helminstallRepoCharttarget to install the helm chart into kubernetesportForwardToMinikube- this calls the helmportForwardexecutor to allow the chart to be tested locallyuninstallHelmChart- this calls the helmuninstallexecutor to uninstall the chart from kubernetes
ℹ️ Since the build target is added as a regular target to a
build stageand all run targets are added as post targets on therootstage, the build target will always run first.- The
The following is a full example of what's added to the project configuration for a project when adding helm to it:
//workspace.json BEFORE
{
//...
"projects": {
"my-app": {
"root": "apps/my-app",
"projectType": "application",
"sourceRoot": "apps/my-app/src",
"targets": {
"build": {
"executor": "@nrwl/node:package"
//...
}
},
"tags": ""
}
}
}//workspace.json AFTER
{
//...
"projects": {
"my-app": {
"root": "apps/my-app",
"projectType": "application",
"sourceRoot": "apps/my-app/src",
"targets": {
"build": {
"executor": "@nrwl/node:package"
//...
},
"copyHelmValues": {
"executor": "@nx-boat-tools/helm:copyValues",
"options": {
"projectHelmPath": "apps/my-app/helm",
"distPath": "dist/apps/my-app/helm/values"
}
},
"installHelmChart": {
"executor": "@nx-boat-tools/helm:installRepoChart",
"options": {
"repository": "bitnami",
"chart": "mysql",
"valuesFilePaths": ["apps/my-app/helm/values.yaml"]
}
},
"package": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"targets": ["packageSrc"],
"stages": {
"helmChart": {
"targets": ["copyHelmValues"]
}
}
}
},
"packageSrc": {
"executor": "@nrwl/node:package"
//...
},
"portForwardToMinikube": {
"executor": "@nx-boat-tools/helm:portForward",
"options": {
"resourceName": "service/my-app",
"hostPort": 8080,
"containerPort": 80
}
},
"runHelmChart": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"postTargets": [
"installHelmChart",
"portForwardToMinikube",
"uninstallHelmChart"
]
}
},
"uninstallHelmChart": {
"executor": "@nx-boat-tools/helm:uninstall",
"options": {}
}
},
"tags": ""
}
}
}Adding repo-chart to a project
The following illustrates how to add a support for a remote helm chart to a project:
#Add a helm chart to a project named my-project with a single values file, values.yaml
nx g @nx-dev-tools/helm:repo-chart --project=my-project --repo=bitnami --chart=mysql
#Add a helm chart to a project named my-project with two values files, values-dev.yaml and values-prod.yaml
nx g @nx-dev-tools/helm:repo-chart --project=my-project --repo=bitnami --chart=mysql --environments=dev,prodlocal-chart-project
The local-chart-project generator is for creating new project containing a local helm chart.
Available options:
| name | type | default | description |
|---|---|---|---|
name | string | Required. The name of the project that's being created. | |
tags | string? | undefined | Tags to be used when adding the project to the workspace.json. More information about tags can be found here |
directory | string? | undefined | This can be used to nest the project into additional folders inside of the apps or libs folder. Insead of going to apps/{projectName}, for example, the project can be created at apps/{directoryValue}/{projectName} |
createValues | boolean | true | Whether or not to copy the values file from the chart to use for deployment |
environments | string? | undefined | When createValues is set to true, this is a comma seperated list of environment names that can be used to create a copy for each environment specified |
standaloneConfig | boolean | the workspace default | Should the project use package.json? If false, the project config is inside workspace.json |
runBuildTarget | string | An optional build target to call before running the helm chart | |
runResourceName | string | The name of the resource to port-forward to within minikube) | |
runHostPort | number | The host port to use when port-forwarding to minikube | |
runContainerPort | number | The container port to use when port-forwarding to minikube |
Generated files:
Other than the addition of a package.json file for the project, the generated files should mostly reflect the same files you'd get from running helm create. The project will contain a helm folder which will contain the chart directory and as well as any values files that were created.
Updates to project configuration:
The project is added to the project configuration with the following high-level targets defined:
build- This calls achain-executewith the following stages and targets:- The
helmChartstage:lintHelmChart- This calls the dockerlinttarget to test the helm chart
- The
package- This calls achain-executewith the following stages and targets:- The
helmChartstage:copyHelmValues- This calls the helmcopyValuestarget to copy any values files to the dist directory.packageHelmChart- this calls the helmpackageexecutor to create a chart archive file in the dist directory
- The
runHelmChart- this calls achain-executewith the following stages and targets:- The
buildstage (only if a build target was specified):- The build target specified is added as a regular target of the stage.
- The
rootstage:installHelmChart- This calls the helminstallLocalCharttarget to install the helm chart into kubernetesportForwardToMinikube- this calls the helmportForwardexecutor to allow the chart to be tested locallyuninstallHelmChart- this calls the helmuninstallexecutor to uninstall the chart from kubernetes
ℹ️ Since the build target is added as a regular target to a
build stageand all run targets are added as post targets on therootstage, the build target will always run first.- The
version- This updates the project version utilizing the @jscutlery/semver community plugin.
The following is a full example of what's added to the project configuration when adding a helm local-chart project:
//workspace.json
{
//...
"projects": {
"my-app": {
"root": "apps/my-app",
"projectType": "application",
"sourceRoot": "apps/my-app/src",
"targets": {
"build": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"stages": {
"helmChart": {
"targets": ["lintHelmChart"]
}
}
}
},
"copyHelmValues": {
"executor": "@nx-boat-tools/helm:copyValues",
"options": {
"projectHelmPath": "apps/my-app/helm",
"distPath": "dist/apps/my-app/helm/values"
}
},
"installHelmChart": {
"executor": "@nx-boat-tools/helm:installLocalChart",
"options": {
"projectHelmPath": "apps/my-app/helm",
"valuesFilePaths": ["apps/my-app/helm/values.yaml"]
}
},
"lintHelmChart": {
"executor": "@nx-boat-tools/helm:lint",
"options": {
"projectHelmPath": "apps/my-app/helm"
}
},
"package": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"stages": {
"helmChart": {
"targets": ["copyHelmValues", "packageHelmChart"]
}
}
}
},
"packageHelmChart": {
"executor": "@nx-boat-tools/helm:package",
"options": {
"projectHelmPath": "apps/my-app/helm",
"distPath": "dist/apps/my-app/helm/chart"
}
},
"portForwardToMinikube": {
"executor": "@nx-boat-tools/helm:portForward",
"options": {
"resourceName": "service/my-app",
"hostPort": 8080,
"containerPort": 80
}
},
"runHelmChart": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"postTargets": [
"installHelmChart",
"portForwardToMinikube",
"uninstallHelmChart"
]
}
},
"uninstallHelmChart": {
"executor": "@nx-boat-tools/helm:uninstall",
"options": {}
},
"version": {
"executor": "@@jscutlery/semver:version",
"options": {
"commitMessageFormat": "chore(${projectName}): release version ${version}"
}
}
},
"tags": ""
}
}
}Using local-chart-project to create a project
The following illustrates how to create a local helm chart project:
#Create a project named my-project with a local helm chart and a single values file, values.yaml
nx g @nx-dev-tools/helm:local-chart-project my-project --createValues=true
#Create a project named my-project with a local helm chart and two values files, values-dev.yaml and values-prod.yaml
nx g @nx-dev-tools/helm:local-chart-project my-project --createValues=true --environments=dev,prodrepo-chart-project
The repo-chart-project generator is for creating new project utilizing a helm chart from a repository.
Available options:
| name | type | default | description |
|---|---|---|---|
name | string | Required. The name of the project that's being created. | |
tags | string? | undefined | Tags to be used when adding the project to the workspace.json. More information about tags can be found here |
directory | string? | undefined | This can be used to nest the project into additional folders inside of the apps or libs folder. Insead of going to apps/{projectName}, for example, the project can be created at apps/{directoryValue}/{projectName} |
repository | string | Required. The name of the repository containing the chart | |
chart | string | Required. The name of the chart to use (without the repository) | |
environments | string? | undefined | This is a comma seperated list of environment names that can be used to create a copy for each environment specified |
standaloneConfig | boolean | the workspace default | Should the project use package.json? If false, the project config is inside workspace.json |
runBuildTarget | string | An optional build target to call before running the helm chart | |
runResourceName | string | The name of the resource to port-forward to within minikube) | |
runHostPort | number | The host port to use when port-forwarding to minikube | |
runContainerPort | number | The container port to use when port-forwarding to minikube |
Generated files:
Other than the addition of a package.json file for the project, a helm folder is added within the project directory containing the values files that were created.
Updates to project configuration:
The project is added to the project configuration with the following high-level targets defined:
package- This calls achain-executewith the following stages and targets:- The
helmChartstage:copyHelmValues- This calls the helmcopyValuestarget to copy any values files to the dist directory.
- The
runHelmChart- this calls achain-executewith the following stages and targets:- The
buildstage (only if a build target was specified):- The build target specified is added as a regular target of the stage.
- The
rootstage:installHelmChart- This calls the helminstallRepoCharttarget to install the helm chart into kubernetesportForwardToMinikube- this calls the helmportForwardexecutor to allow the chart to be tested locallyuninstallHelmChart- this calls the helmuninstallexecutor to uninstall the chart from kubernetes
ℹ️ Since the build target is added as a regular target to a
build stageand all run targets are added as post targets on therootstage, the build target will always run first.- The
version- This updates the project version utilizing the @jscutlery/semver community plugin.
The following is a full example of what's added to the project configuration when adding a helm repo-chart project:
//workspace.json
{
//...
"projects": {
"my-app": {
"root": "apps/my-app",
"projectType": "application",
"sourceRoot": "apps/my-app/src",
"targets": {
"copyHelmValues": {
"executor": "@nx-boat-tools/helm:copyValues",
"options": {
"projectHelmPath": "apps/my-app/helm",
"distPath": "dist/apps/my-app/helm/values"
}
},
"installHelmChart": {
"executor": "@nx-boat-tools/helm:installRepoChart",
"options": {
"repository": "bitnami",
"chart": "mysql",
"valuesFilePaths": ["apps/my-app/helm/values.yaml"]
}
},
"package": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"stages": {
"helmChart": {
"targets": ["copyHelmValues"]
}
}
}
},
"portForwardToMinikube": {
"executor": "@nx-boat-tools/helm:portForward",
"options": {
"resourceName": "service/my-app",
"hostPort": 8080,
"containerPort": 80
}
},
"runHelmChart": {
"executor": "@nx-boat-tools/common:chain-execute",
"options": {
"postTargets": [
"installHelmChart",
"portForwardToMinikube",
"uninstallHelmChart"
]
}
},
"uninstallHelmChart": {
"executor": "@nx-boat-tools/helm:uninstall",
"options": {}
},
"version": {
"executor": "@@jscutlery/semver:version",
"options": {
"commitMessageFormat": "chore(${projectName}): release version ${version}"
}
}
},
"tags": ""
}
}
}Using repo-chart-project to create a project
The following illustrates how to create a repository helm chart project:
#Create a project named my-project with a repo helm chart and a single values file, values.yaml
nx g @nx-dev-tools/helm:repo-chart-project my-project --createValues=true
#Create a project named my-project with a repo helm chart and two values files, values-dev.yaml and values-prod.yaml
nx g @nx-dev-tools/helm:repo-chart-project my-project --createValues=true --environments=dev,prod