Add the ability to specify a lock file (#432)
Allow configuring the lockfile in the state. This makes it possible for example maintain a lock per environment. Signed-off-by: Lassi Pölönen <lassi.polonen@iki.fi> Signed-off-by: Lassi Pölönen <lassi.polonen@iki.fi>
This commit is contained in:
		
							parent
							
								
									2594dc1524
								
							
						
					
					
						commit
						0f44cfacc4
					
				|  | @ -312,3 +312,21 @@ releases: | ||||||
|   - chart: oci://my-oci-registry/helm-repo/envoy |   - chart: oci://my-oci-registry/helm-repo/envoy | ||||||
|     version: 1.5 |     version: 1.5 | ||||||
| ``` | ``` | ||||||
|  | 
 | ||||||
|  | ### Lockfile per environment | ||||||
|  | 
 | ||||||
|  | In some cases it can be handy for CI/CD pipelines to be able to roll out updates gradually for environments, such as staging and production while using the same | ||||||
|  | set of charts. This can be achieved by using `lockFilePath` in combination with environments, such as: | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | environments: | ||||||
|  |   staging: | ||||||
|  |   production | ||||||
|  | 
 | ||||||
|  | --- | ||||||
|  | lockFilePath: .helmfile.{{ .Environment.Name}}.lock | ||||||
|  | 
 | ||||||
|  | releases: | ||||||
|  | - name: myapp | ||||||
|  |   chart: charts/myapp | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | @ -169,6 +169,10 @@ repositories: | ||||||
| # Path to alternative helm binary (--helm-binary) | # Path to alternative helm binary (--helm-binary) | ||||||
| helmBinary: path/to/helm3 | helmBinary: path/to/helm3 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | # Path to alternative lock file. The default is <state file name>.lock, i.e for helmfile.yaml it's helmfile.lock. | ||||||
|  | lockFilePath: path/to/lock.file | ||||||
|  | 
 | ||||||
| # Default values to set for args along with dedicated keys that can be set by contributors, cli args take precedence over these. | # Default values to set for args along with dedicated keys that can be set by contributors, cli args take precedence over these. | ||||||
| # In other words, unset values results in no flags passed to helm. | # In other words, unset values results in no flags passed to helm. | ||||||
| # See the helm usage (helm SUBCOMMAND -h) for more info on default values when those flags aren't provided. | # See the helm usage (helm SUBCOMMAND -h) for more info on default values when those flags aren't provided. | ||||||
|  | @ -568,6 +572,8 @@ All the other `helmfile` sub-commands like `sync` use chart versions recorded in | ||||||
| 
 | 
 | ||||||
| For example, the lock file for a helmfile state file named `helmfile.1.yaml` will be `helmfile.1.lock`. The lock file for a local chart would be `requirements.lock`, which is the same as `helm`. | For example, the lock file for a helmfile state file named `helmfile.1.yaml` will be `helmfile.1.lock`. The lock file for a local chart would be `requirements.lock`, which is the same as `helm`. | ||||||
| 
 | 
 | ||||||
|  | The lock file can be changed using `lockFilePath` in helm state, which makes it possible to for example have a different lock file per environment via templating. | ||||||
|  | 
 | ||||||
| It is recommended to version-control all the lock files, so that they can be used in the production deployment pipeline for extra reproducibility. | It is recommended to version-control all the lock files, so that they can be used in the production deployment pipeline for extra reproducibility. | ||||||
| 
 | 
 | ||||||
| To bring in chart updates systematically, it would also be a good idea to run `helmfile deps` regularly, test it, and then update the lock files in the version-control system. | To bring in chart updates systematically, it would also be a good idea to run `helmfile deps` regularly, test it, and then update the lock files in the version-control system. | ||||||
|  |  | ||||||
|  | @ -36,6 +36,8 @@ type desiredStateLoader struct { | ||||||
| 	remote      *remote.Remote | 	remote      *remote.Remote | ||||||
| 	logger      *zap.SugaredLogger | 	logger      *zap.SugaredLogger | ||||||
| 	valsRuntime vals.Evaluator | 	valsRuntime vals.Evaluator | ||||||
|  | 
 | ||||||
|  | 	lockFilePath string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ld *desiredStateLoader) Load(f string, opts LoadOpts) (*state.HelmState, error) { | func (ld *desiredStateLoader) Load(f string, opts LoadOpts) (*state.HelmState, error) { | ||||||
|  | @ -163,7 +165,7 @@ func (ld *desiredStateLoader) loadFileWithOverrides(inheritedEnv, overrodeEnv *e | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (a *desiredStateLoader) underlying() *state.StateCreator { | func (a *desiredStateLoader) underlying() *state.StateCreator { | ||||||
| 	c := state.NewCreator(a.logger, a.fs, a.valsRuntime, a.getHelm, a.overrideHelmBinary, a.remote, a.enableLiveOutput) | 	c := state.NewCreator(a.logger, a.fs, a.valsRuntime, a.getHelm, a.overrideHelmBinary, a.remote, a.enableLiveOutput, a.lockFilePath) | ||||||
| 	c.LoadFile = a.loadFile | 	c.LoadFile = a.loadFile | ||||||
| 	return c | 	return c | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -145,7 +145,7 @@ func (st *HelmState) mergeLockedDependencies() (*HelmState, error) { | ||||||
| 		return st, nil | 		return st, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	depMan := NewChartDependencyManager(filename, st.logger) | 	depMan := NewChartDependencyManager(filename, st.logger, st.LockFile) | ||||||
| 
 | 
 | ||||||
| 	if st.fs.ReadFile != nil { | 	if st.fs.ReadFile != nil { | ||||||
| 		depMan.readFile = st.fs.ReadFile | 		depMan.readFile = st.fs.ReadFile | ||||||
|  | @ -258,7 +258,7 @@ func getUnresolvedDependenciess(st *HelmState) (string, *UnresolvedDependencies, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func updateDependencies(st *HelmState, shell helmexec.DependencyUpdater, unresolved *UnresolvedDependencies, filename, wd string) (*HelmState, error) { | func updateDependencies(st *HelmState, shell helmexec.DependencyUpdater, unresolved *UnresolvedDependencies, filename, wd string) (*HelmState, error) { | ||||||
| 	depMan := NewChartDependencyManager(filename, st.logger) | 	depMan := NewChartDependencyManager(filename, st.logger, st.LockFile) | ||||||
| 
 | 
 | ||||||
| 	_, err := depMan.Update(shell, wd, unresolved) | 	_, err := depMan.Update(shell, wd, unresolved) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -271,6 +271,8 @@ func updateDependencies(st *HelmState, shell helmexec.DependencyUpdater, unresol | ||||||
| type chartDependencyManager struct { | type chartDependencyManager struct { | ||||||
| 	Name string | 	Name string | ||||||
| 
 | 
 | ||||||
|  | 	lockFilePath string | ||||||
|  | 
 | ||||||
| 	logger *zap.SugaredLogger | 	logger *zap.SugaredLogger | ||||||
| 
 | 
 | ||||||
| 	readFile  func(string) ([]byte, error) | 	readFile  func(string) ([]byte, error) | ||||||
|  | @ -278,17 +280,22 @@ type chartDependencyManager struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // nolint: golint
 | // nolint: golint
 | ||||||
| func NewChartDependencyManager(name string, logger *zap.SugaredLogger) *chartDependencyManager { | func NewChartDependencyManager(name string, logger *zap.SugaredLogger, lockFilePath string) *chartDependencyManager { | ||||||
| 	return &chartDependencyManager{ | 	return &chartDependencyManager{ | ||||||
| 		Name:      name, | 		Name:         name, | ||||||
| 		readFile:  os.ReadFile, | 		readFile:     os.ReadFile, | ||||||
| 		writeFile: os.WriteFile, | 		writeFile:    os.WriteFile, | ||||||
| 		logger:    logger, | 		logger:       logger, | ||||||
|  | 		lockFilePath: lockFilePath, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *chartDependencyManager) lockFileName() string { | func (m *chartDependencyManager) lockFileName() string { | ||||||
| 	return fmt.Sprintf("%s.lock", m.Name) | 	if m.lockFilePath != "" { | ||||||
|  | 		return m.lockFilePath | ||||||
|  | 	} else { | ||||||
|  | 		return fmt.Sprintf("%s.lock", m.Name) | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *chartDependencyManager) Update(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) { | func (m *chartDependencyManager) Update(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) { | ||||||
|  | @ -334,9 +341,9 @@ func (m *chartDependencyManager) updateHelm2(shell helmexec.DependencyUpdater, w | ||||||
| 
 | 
 | ||||||
| func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *UnresolvedDependencies, shell helmexec.DependencyUpdater, wd string) (*ResolvedDependencies, error) { | func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *UnresolvedDependencies, shell helmexec.DependencyUpdater, wd string) (*ResolvedDependencies, error) { | ||||||
| 	// Generate `requirements.lock` of the temporary local chart by coping `<basename>.lock`
 | 	// Generate `requirements.lock` of the temporary local chart by coping `<basename>.lock`
 | ||||||
| 	lockFile := m.lockFileName() | 	lockFilePath := m.lockFileName() | ||||||
| 
 | 
 | ||||||
| 	originalLockFileContent, err := m.readBytes(lockFile) | 	originalLockFileContent, err := m.readBytes(lockFilePath) | ||||||
| 	if err != nil && !os.IsNotExist(err) { | 	if err != nil && !os.IsNotExist(err) { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | @ -394,7 +401,7 @@ func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *Unre | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Commit the lock file if and only if everything looks ok
 | 	// Commit the lock file if and only if everything looks ok
 | ||||||
| 	if err := m.writeBytes(lockFile, updatedLockFileContent); err != nil { | 	if err := m.writeBytes(lockFilePath, updatedLockFileContent); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -58,9 +58,11 @@ type StateCreator struct { | ||||||
| 	enableLiveOutput bool | 	enableLiveOutput bool | ||||||
| 
 | 
 | ||||||
| 	remote *remote.Remote | 	remote *remote.Remote | ||||||
|  | 
 | ||||||
|  | 	lockFile string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewCreator(logger *zap.SugaredLogger, fs *filesystem.FileSystem, valsRuntime vals.Evaluator, getHelm func(*HelmState) helmexec.Interface, overrideHelmBinary string, remote *remote.Remote, enableLiveOutput bool) *StateCreator { | func NewCreator(logger *zap.SugaredLogger, fs *filesystem.FileSystem, valsRuntime vals.Evaluator, getHelm func(*HelmState) helmexec.Interface, overrideHelmBinary string, remote *remote.Remote, enableLiveOutput bool, lockFile string) *StateCreator { | ||||||
| 	return &StateCreator{ | 	return &StateCreator{ | ||||||
| 		logger: logger, | 		logger: logger, | ||||||
| 
 | 
 | ||||||
|  | @ -73,6 +75,8 @@ func NewCreator(logger *zap.SugaredLogger, fs *filesystem.FileSystem, valsRuntim | ||||||
| 		enableLiveOutput:   enableLiveOutput, | 		enableLiveOutput:   enableLiveOutput, | ||||||
| 
 | 
 | ||||||
| 		remote: remote, | 		remote: remote, | ||||||
|  | 
 | ||||||
|  | 		lockFile: lockFile, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -84,6 +88,8 @@ func (c *StateCreator) Parse(content []byte, baseDir, file string) (*HelmState, | ||||||
| 	state.FilePath = file | 	state.FilePath = file | ||||||
| 	state.basePath = baseDir | 	state.basePath = baseDir | ||||||
| 
 | 
 | ||||||
|  | 	state.LockFile = c.lockFile | ||||||
|  | 
 | ||||||
| 	decoder := yaml.NewDecoder(bytes.NewReader(content)) | 	decoder := yaml.NewDecoder(bytes.NewReader(content)) | ||||||
| 
 | 
 | ||||||
| 	decoder.KnownFields(c.Strict) | 	decoder.KnownFields(c.Strict) | ||||||
|  |  | ||||||
|  | @ -83,7 +83,7 @@ func (testEnv stateTestEnv) MustLoadStateWithEnableLiveOutput(t *testing.T, file | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	r := remote.NewRemote(logger, testFs.Cwd, testFs.ToFileSystem()) | 	r := remote.NewRemote(logger, testFs.Cwd, testFs.ToFileSystem()) | ||||||
| 	state, err := NewCreator(logger, testFs.ToFileSystem(), nil, nil, "", r, enableLiveOutput). | 	state, err := NewCreator(logger, testFs.ToFileSystem(), nil, nil, "", r, enableLiveOutput, ""). | ||||||
| 		ParseAndLoad([]byte(yamlContent), filepath.Dir(file), file, envName, true, nil) | 		ParseAndLoad([]byte(yamlContent), filepath.Dir(file), file, envName, true, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("unexpected error: %v", err) | 		t.Fatalf("unexpected error: %v", err) | ||||||
|  | @ -153,7 +153,7 @@ releaseNamespace: mynamespace | ||||||
| 	env := environment.Environment{ | 	env := environment.Environment{ | ||||||
| 		Name: "production", | 		Name: "production", | ||||||
| 	} | 	} | ||||||
| 	state, err := NewCreator(logger, testFs.ToFileSystem(), nil, nil, "", r, false). | 	state, err := NewCreator(logger, testFs.ToFileSystem(), nil, nil, "", r, false, ""). | ||||||
| 		ParseAndLoad(yamlContent, filepath.Dir(yamlFile), yamlFile, "production", true, &env) | 		ParseAndLoad(yamlContent, filepath.Dir(yamlFile), yamlFile, "production", true, &env) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("unexpected error: %v", err) | 		t.Fatalf("unexpected error: %v", err) | ||||||
|  | @ -240,7 +240,7 @@ overrideNamespace: myns | ||||||
| 	testFs.Cwd = "/example/path/to" | 	testFs.Cwd = "/example/path/to" | ||||||
| 
 | 
 | ||||||
| 	r := remote.NewRemote(logger, testFs.Cwd, testFs.ToFileSystem()) | 	r := remote.NewRemote(logger, testFs.Cwd, testFs.ToFileSystem()) | ||||||
| 	state, err := NewCreator(logger, testFs.ToFileSystem(), nil, nil, "", r, false). | 	state, err := NewCreator(logger, testFs.ToFileSystem(), nil, nil, "", r, false, ""). | ||||||
| 		ParseAndLoad(yamlContent, filepath.Dir(yamlFile), yamlFile, "production", true, nil) | 		ParseAndLoad(yamlContent, filepath.Dir(yamlFile), yamlFile, "production", true, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatalf("unexpected error: %v", err) | 		t.Fatalf("unexpected error: %v", err) | ||||||
|  |  | ||||||
|  | @ -79,6 +79,8 @@ type ReleaseSetSpec struct { | ||||||
| 	// non-existent path. The default behavior is to print a warning. Note the
 | 	// non-existent path. The default behavior is to print a warning. Note the
 | ||||||
| 	// differing default compared to other MissingFileHandlers.
 | 	// differing default compared to other MissingFileHandlers.
 | ||||||
| 	MissingFileHandler string `yaml:"missingFileHandler,omitempty"` | 	MissingFileHandler string `yaml:"missingFileHandler,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	LockFile string `yaml:"lockFilePath,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // HelmState structure for the helmfile
 | // HelmState structure for the helmfile
 | ||||||
|  |  | ||||||
|  | @ -2030,6 +2030,56 @@ func TestHelmState_ResolveDeps_NoLockFile(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestHelmState_ResolveDeps_NoLockFile_WithCustomLockFile(t *testing.T) { | ||||||
|  | 	logger := helmexec.NewLogger(io.Discard, "debug") | ||||||
|  | 	state := &HelmState{ | ||||||
|  | 		basePath: "/src", | ||||||
|  | 		FilePath: "/src/helmfile.yaml", | ||||||
|  | 		ReleaseSetSpec: ReleaseSetSpec{ | ||||||
|  | 			LockFile: "custom-lock-file", | ||||||
|  | 			Releases: []ReleaseSpec{ | ||||||
|  | 				{ | ||||||
|  | 					Chart: "./..", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Chart: "../examples", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Chart: "../../helmfile", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Chart: "published", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Chart: "published/deeper", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Chart: "stable/envoy", | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			Repositories: []RepositorySpec{ | ||||||
|  | 				{ | ||||||
|  | 					Name: "stable", | ||||||
|  | 					URL:  "https://kubernetes-charts.storage.googleapis.com", | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		logger: logger, | ||||||
|  | 		fs: &filesystem.FileSystem{ | ||||||
|  | 			ReadFile: func(f string) ([]byte, error) { | ||||||
|  | 				if f != "custom-lock-file" { | ||||||
|  | 					return nil, fmt.Errorf("stub: unexpected file: %s", f) | ||||||
|  | 				} | ||||||
|  | 				return nil, os.ErrNotExist | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err := state.ResolveDeps() | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Errorf("unexpected error: %v", err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| func TestHelmState_ReleaseStatuses(t *testing.T) { | func TestHelmState_ReleaseStatuses(t *testing.T) { | ||||||
| 	tests := []struct { | 	tests := []struct { | ||||||
| 		name     string | 		name     string | ||||||
|  |  | ||||||
|  | @ -134,13 +134,8 @@ func TestHelmfileTemplateWithBuildCommand(t *testing.T) { | ||||||
| 					if !c.IsDir() { | 					if !c.IsDir() { | ||||||
| 						t.Fatalf("%s is not a directory", c) | 						t.Fatalf("%s is not a directory", c) | ||||||
| 					} | 					} | ||||||
|  | 					chartName, chartVersion := execHelmShowChart(t, chartPath) | ||||||
| 					tgzFile := execHelmPackage(t, chartPath) | 					tgzFile := execHelmPackage(t, chartPath) | ||||||
| 
 |  | ||||||
| 					// Extract chart version from the name of chart package archival
 |  | ||||||
| 					chartName := c.Name() |  | ||||||
| 					chartNameWithVersion := strings.TrimSuffix(filepath.Base(tgzFile), filepath.Ext(tgzFile)) |  | ||||||
| 					chartVersion := strings.TrimPrefix(chartNameWithVersion, fmt.Sprintf("%s-", chartName)) |  | ||||||
| 
 |  | ||||||
| 					chartDigest, err := execHelmPush(t, tgzFile, fmt.Sprintf("oci://localhost:%d/myrepo", hostPort)) | 					chartDigest, err := execHelmPush(t, tgzFile, fmt.Sprintf("oci://localhost:%d/myrepo", hostPort)) | ||||||
| 					require.NoError(t, err, "Unable to run helm push to local registry: %v", err) | 					require.NoError(t, err, "Unable to run helm push to local registry: %v", err) | ||||||
| 
 | 
 | ||||||
|  | @ -235,6 +230,23 @@ func execDocker(t *testing.T, args ...string) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func execHelmShowChart(t *testing.T, localChart string) (string, string) { | ||||||
|  | 	t.Helper() | ||||||
|  | 
 | ||||||
|  | 	name, version := "", "" | ||||||
|  | 	out := execHelm(t, "show", "chart", localChart) | ||||||
|  | 	sc := bufio.NewScanner(strings.NewReader(out)) | ||||||
|  | 	for sc.Scan() { | ||||||
|  | 		if strings.HasPrefix(sc.Text(), "name:") { | ||||||
|  | 			name = strings.TrimPrefix(sc.Text(), "name: ") | ||||||
|  | 		} | ||||||
|  | 		if strings.HasPrefix(sc.Text(), "version:") { | ||||||
|  | 			version = strings.TrimPrefix(sc.Text(), "version: ") | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return name, version | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func execHelmPackage(t *testing.T, localChart string) string { | func execHelmPackage(t *testing.T, localChart string) string { | ||||||
| 	t.Helper() | 	t.Helper() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | apiVersion: v2 | ||||||
|  | name: raw | ||||||
|  | description: A Helm chart for Kubernetes | ||||||
|  | type: application | ||||||
|  | version: 0.0.1 | ||||||
|  | appVersion: "1.16.0" | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | A copy of chart ../raw, but older version to test locking. | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | *.tgz | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | # Patterns to ignore when building packages. | ||||||
|  | # This supports shell glob matching, relative path matching, and | ||||||
|  | # negation (prefixed with !). Only one pattern per line. | ||||||
|  | .DS_Store | ||||||
|  | # Common VCS dirs | ||||||
|  | .git/ | ||||||
|  | .gitignore | ||||||
|  | .bzr/ | ||||||
|  | .bzrignore | ||||||
|  | .hg/ | ||||||
|  | .hgignore | ||||||
|  | .svn/ | ||||||
|  | # Common backup files | ||||||
|  | *.swp | ||||||
|  | *.bak | ||||||
|  | *.tmp | ||||||
|  | *.orig | ||||||
|  | *~ | ||||||
|  | # Various IDEs | ||||||
|  | .project | ||||||
|  | .idea/ | ||||||
|  | *.tmproj | ||||||
|  | .vscode/ | ||||||
							
								
								
									
										6
									
								
								test/e2e/template/helmfile/testdata/charts/raw-0.1.0/templates/resources.yaml
								
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										6
									
								
								test/e2e/template/helmfile/testdata/charts/raw-0.1.0/templates/resources.yaml
								
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | {{- range $i, $r := $.Values.templates }} | ||||||
|  | {{- if gt $i 0 }} | ||||||
|  | --- | ||||||
|  | {{- end }} | ||||||
|  | {{- (tpl $r $) }} | ||||||
|  | {{- end }} | ||||||
|  | @ -0,0 +1,48 @@ | ||||||
|  | templates: [] | ||||||
|  | 
 | ||||||
|  | ## | ||||||
|  | ## Example: Uncomment the below and run `helm template ./`: | ||||||
|  | ## | ||||||
|  | # | ||||||
|  | # templates: | ||||||
|  | # - | | ||||||
|  | #   apiVersion: v1 | ||||||
|  | #   kind: ConfigMap | ||||||
|  | #   metadata: | ||||||
|  | #     name: {{ .Release.Name }}-1 | ||||||
|  | #     namespace: {{ .Release.Namespace }} | ||||||
|  | #   data: | ||||||
|  | #     foo: {{ .Values.foo }} | ||||||
|  | # - | | ||||||
|  | #   apiVersion: v1 | ||||||
|  | #   kind: ConfigMap | ||||||
|  | #   metadata: | ||||||
|  | #     name: {{ .Release.Name }}-2 | ||||||
|  | #     namespace: {{ .Release.Namespace }} | ||||||
|  | #   data: | ||||||
|  | #     foo: {{ .Values.foo }} | ||||||
|  | # values: | ||||||
|  | #   foo: FOO | ||||||
|  | # | ||||||
|  | ## | ||||||
|  | ## Expected Output: | ||||||
|  | ## | ||||||
|  | # | ||||||
|  | # --- | ||||||
|  | # # Source: raw/templates/resources.yaml | ||||||
|  | # apiVersion: v1 | ||||||
|  | # kind: ConfigMap | ||||||
|  | # metadata: | ||||||
|  | #   name: release-name-1 | ||||||
|  | #   namespace: default | ||||||
|  | # data: | ||||||
|  | #   foo: | ||||||
|  | # --- | ||||||
|  | # # Source: raw/templates/resources.yaml | ||||||
|  | # apiVersion: v1 | ||||||
|  | # kind: ConfigMap | ||||||
|  | # metadata: | ||||||
|  | #   name: release-name-2 | ||||||
|  | #   namespace: default | ||||||
|  | # data: | ||||||
|  | #   foo: | ||||||
|  | @ -4,7 +4,7 @@ repositories: | ||||||
| 
 | 
 | ||||||
| releases: | releases: | ||||||
| - name: foo | - name: foo | ||||||
|   chart: ../../charts/raw |   chart: ../../charts/raw-0.1.0 | ||||||
|   values: |   values: | ||||||
|   - templates: |   - templates: | ||||||
|     - | |     - | | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ repositories: | ||||||
| 
 | 
 | ||||||
| releases: | releases: | ||||||
| - name: foo | - name: foo | ||||||
|   chart: ../../charts/raw |   chart: ../../charts/raw-0.1.0 | ||||||
|   values: |   values: | ||||||
|   - templates: |   - templates: | ||||||
|     - | |     - | | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| releases: | releases: | ||||||
| - name: foo | - name: foo | ||||||
|   chart: ../../charts/raw |   chart: ../../charts/raw-0.1.0 | ||||||
|   values: |   values: | ||||||
|   - templates: |   - templates: | ||||||
|     - | |     - | | ||||||
|  |  | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | localChartRepoServer: | ||||||
|  |   enabled: true | ||||||
|  |   port: 18080 | ||||||
|  | chartifyTempDir: temp1 | ||||||
|  | helmfileArgs: | ||||||
|  | - --environment | ||||||
|  | - prod | ||||||
|  | - template | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | repositories: | ||||||
|  | - name: myrepo | ||||||
|  |   url: http://localhost:18080/ | ||||||
|  | 
 | ||||||
|  | environments: | ||||||
|  |   prod: | ||||||
|  |   staging: | ||||||
|  | 
 | ||||||
|  | --- | ||||||
|  | lockFilePath: test-lock-file-{{ .Environment.Name }} | ||||||
|  | 
 | ||||||
|  | releases: | ||||||
|  | - name: raw | ||||||
|  |   chart: myrepo/raw | ||||||
|  |   values: | ||||||
|  |   - templates: | ||||||
|  |     - | | ||||||
|  |       chartVersion: {{`{{ .Chart.Version }}`}} | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | Adding repo myrepo http://localhost:18080/ | ||||||
|  | "myrepo" has been added to your repositories | ||||||
|  | 
 | ||||||
|  | Templating release=raw, chart=myrepo/raw | ||||||
|  | --- | ||||||
|  | # Source: raw/templates/resources.yaml | ||||||
|  | chartVersion: 0.0.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										7
									
								
								test/e2e/template/helmfile/testdata/snapshot/templated_lockfile/test-lock-file-prod
								
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										7
									
								
								test/e2e/template/helmfile/testdata/snapshot/templated_lockfile/test-lock-file-prod
								
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,7 @@ | ||||||
|  | version: 0.0.0-dev | ||||||
|  | dependencies: | ||||||
|  |   - name: raw | ||||||
|  |     repository: http://localhost:18080/ | ||||||
|  |     version: 0.0.1 | ||||||
|  | digest: sha256:5401817b653c4eeb186cbfbb8d77dda6b72f84a548fc9cd128cbd478d5b2e705 | ||||||
|  | generated: "2022-10-12T20:17:15.98786845+03:00" | ||||||
		Loading…
	
		Reference in New Issue