Fix and enhancement to repository update (#1383)

Changes:

- Prevent Helmfile from unnecessarily running `helm repo add` and `helm repo up` against repositories for unused repositories(repositories of releases filtered out by selector)
- Fixes #1330
This commit is contained in:
KUOKA Yusuke
2020-07-28 10:17:43 +09:00
committed by GitHub
parent ee8ea507a6
commit 1e260e4a5e
7 changed files with 323 additions and 245 deletions
+44 -19
View File
@@ -299,24 +299,57 @@ type RepoUpdater interface {
UpdateRepo() error
}
// SyncRepos will update the given helm releases
func (st *HelmState) SyncRepos(helm RepoUpdater) []error {
errs := []error{}
// getRepositoriesToSync returns the names of repositories to be updated
func (st *HelmState) getRepositoriesToSync() (map[string]bool, error) {
releases, err := st.GetSelectedReleasesWithOverrides()
if err != nil {
return nil, err
}
for _, repo := range st.Repositories {
if err := helm.AddRepo(repo.Name, repo.URL, repo.CaFile, repo.CertFile, repo.KeyFile, repo.Username, repo.Password); err != nil {
errs = append(errs, err)
repositoriesToUpdate := map[string]bool{}
if len(releases) == 0 {
for _, repo := range st.Repositories {
repositoriesToUpdate[repo.Name] = true
}
return repositoriesToUpdate, nil
}
for _, release := range releases {
if release.Installed == nil || *release.Installed {
chart := strings.Split(release.Chart, "/")
if len(chart) == 1 {
continue
}
repositoriesToUpdate[chart[0]] = true
}
}
if len(errs) != 0 {
return errs
return repositoriesToUpdate, nil
}
func (st *HelmState) SyncRepos(helm RepoUpdater, shouldSkip map[string]bool) ([]string, error) {
shouldUpdate, err := st.getRepositoriesToSync()
if err != nil {
return nil, err
}
if err := helm.UpdateRepo(); err != nil {
return []error{err}
var updated []string
for _, repo := range st.Repositories {
if !shouldUpdate[repo.Name] || shouldSkip[repo.Name] {
continue
}
if err := helm.AddRepo(repo.Name, repo.URL, repo.CaFile, repo.CertFile, repo.KeyFile, repo.Username, repo.Password); err != nil {
return nil, err
}
updated = append(updated, repo.Name)
}
return nil
return updated, nil
}
type syncResult struct {
@@ -1462,14 +1495,6 @@ func (st *HelmState) GetSelectedReleasesWithOverrides() ([]ReleaseSpec, error) {
}
}
var extra string
if len(st.Selectors) > 0 {
extra = " matching " + strings.Join(st.Selectors, ",")
}
st.logger.Debugf("%d release(s)%s found in %s\n", len(releases), extra, st.FilePath)
return releases, nil
}
+1 -1
View File
@@ -923,7 +923,7 @@ func TestHelmState_SyncRepos(t *testing.T) {
state := &HelmState{
Repositories: tt.repos,
}
if _ = state.SyncRepos(tt.helm); !reflect.DeepEqual(tt.helm.Repo, tt.want) {
if _, _ = state.SyncRepos(tt.helm, map[string]bool{}); !reflect.DeepEqual(tt.helm.Repo, tt.want) {
t.Errorf("HelmState.SyncRepos() for [%s] = %v, want %v", tt.name, tt.helm.Repo, tt.want)
}
})