Fix regression in the order of processed releases when concurrency is 1 (#992)

Fixes #988
This commit is contained in:
KUOKA Yusuke 2019-11-21 22:29:05 +09:00 committed by GitHub
parent 7ec92c0520
commit f508b9091e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 14 deletions

View File

@ -2159,8 +2159,8 @@ backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0
// Disable concurrency to avoid in-deterministic result // Disable concurrency to avoid in-deterministic result
concurrency: 1, concurrency: 1,
upgraded: []exectest.Release{ upgraded: []exectest.Release{
{Name: "front-proxy", Flags: []string{}},
{Name: "logging", Flags: []string{}}, {Name: "logging", Flags: []string{}},
{Name: "front-proxy", Flags: []string{}},
{Name: "database", Flags: []string{}}, {Name: "database", Flags: []string{}},
{Name: "servicemesh", Flags: []string{}}, {Name: "servicemesh", Flags: []string{}},
{Name: "anotherbackend", Flags: []string{}}, {Name: "anotherbackend", Flags: []string{}},
@ -2314,7 +2314,7 @@ GROUP RELEASES
2 backend-v1, backend-v2 2 backend-v1, backend-v2
3 anotherbackend 3 anotherbackend
4 database, servicemesh 4 database, servicemesh
5 front-proxy, logging 5 logging, front-proxy
processing releases in group 1/5: frontend-v1, frontend-v2, frontend-v3 processing releases in group 1/5: frontend-v1, frontend-v2, frontend-v3
worker 1/1 started worker 1/1 started
@ -2324,21 +2324,21 @@ worker 1/1 started
worker 1/1 finished worker 1/1 finished
processing releases in group 3/5: anotherbackend processing releases in group 3/5: anotherbackend
processing releases in group 4/5: database, servicemesh processing releases in group 4/5: database, servicemesh
processing releases in group 5/5: front-proxy, logging processing releases in group 5/5: logging, front-proxy
processing 5 groups of releases in this order: processing 5 groups of releases in this order:
GROUP RELEASES GROUP RELEASES
1 front-proxy, logging 1 logging, front-proxy
2 database, servicemesh 2 database, servicemesh
3 anotherbackend 3 anotherbackend
4 backend-v1, backend-v2 4 backend-v1, backend-v2
5 frontend-v1, frontend-v2, frontend-v3 5 frontend-v1, frontend-v2, frontend-v3
processing releases in group 1/5: front-proxy, logging processing releases in group 1/5: logging, front-proxy
worker 1/1 started worker 1/1 started
worker 1/1 finished worker 1/1 finished
worker 1/1 started worker 1/1 started
getting deployed release version failed:unexpected list key: {^front-proxy$ --kube-contextdefault}
getting deployed release version failed:unexpected list key: {^logging$ --kube-contextdefault} getting deployed release version failed:unexpected list key: {^logging$ --kube-contextdefault}
getting deployed release version failed:unexpected list key: {^front-proxy$ --kube-contextdefault}
worker 1/1 finished worker 1/1 finished
processing releases in group 2/5: database, servicemesh processing releases in group 2/5: database, servicemesh
worker 1/1 started worker 1/1 started
@ -2368,8 +2368,8 @@ worker 1/1 finished
UPDATED RELEASES: UPDATED RELEASES:
NAME CHART VERSION NAME CHART VERSION
front-proxy stable/envoy
logging charts/fluent-bit logging charts/fluent-bit
front-proxy stable/envoy
database charts/mysql database charts/mysql
servicemesh charts/istio servicemesh charts/istio
anotherbackend charts/anotherbackend anotherbackend charts/anotherbackend
@ -2439,8 +2439,8 @@ releases:
}, },
lists: map[exectest.ListKey]string{}, lists: map[exectest.ListKey]string{},
upgraded: []exectest.Release{ upgraded: []exectest.Release{
{Name: "bar", Flags: []string{}},
{Name: "baz", Flags: []string{}}, {Name: "baz", Flags: []string{}},
{Name: "bar", Flags: []string{}},
{Name: "foo", Flags: []string{}}, {Name: "foo", Flags: []string{}},
}, },
deleted: []exectest.Release{}, deleted: []exectest.Release{},
@ -2491,15 +2491,15 @@ Affected releases are:
processing 2 groups of releases in this order: processing 2 groups of releases in this order:
GROUP RELEASES GROUP RELEASES
1 bar, baz 1 baz, bar
2 foo 2 foo
processing releases in group 1/2: bar, baz processing releases in group 1/2: baz, bar
worker 1/1 started worker 1/1 started
worker 1/1 finished worker 1/1 finished
worker 1/1 started worker 1/1 started
getting deployed release version failed:unexpected list key: {^bar$ --kube-contextdefault}
getting deployed release version failed:unexpected list key: {^baz$ --kube-contextdefault} getting deployed release version failed:unexpected list key: {^baz$ --kube-contextdefault}
getting deployed release version failed:unexpected list key: {^bar$ --kube-contextdefault}
worker 1/1 finished worker 1/1 finished
processing releases in group 2/2: foo processing releases in group 2/2: foo
worker 1/1 started worker 1/1 started
@ -2510,8 +2510,8 @@ worker 1/1 finished
UPDATED RELEASES: UPDATED RELEASES:
NAME CHART VERSION NAME CHART VERSION
bar mychart2
baz mychart3 baz mychart3
bar mychart2
foo mychart1 foo mychart1
`, `,

View File

@ -139,13 +139,15 @@ func SortedReleaseGroups(releases []Release, reverse bool) ([][]Release, error)
func GroupReleasesByDependency(releases []Release) ([][]Release, error) { func GroupReleasesByDependency(releases []Release) ([][]Release, error) {
idToReleases := map[string][]Release{} idToReleases := map[string][]Release{}
idToIndex := map[string]int{}
d := dag.New() d := dag.New()
for _, r := range releases { for i, r := range releases {
id := ReleaseToID(&r.ReleaseSpec) id := ReleaseToID(&r.ReleaseSpec)
idToReleases[id] = append(idToReleases[id], r) idToReleases[id] = append(idToReleases[id], r)
idToIndex[id] = i
// Only compute dependencies from non-filtered releases // Only compute dependencies from non-filtered releases
if !r.Filtered { if !r.Filtered {
@ -182,7 +184,13 @@ func GroupReleasesByDependency(releases []Release) ([][]Release, error) {
} }
// Make the helmfile behavior deterministic for reproducibility and ease of testing // Make the helmfile behavior deterministic for reproducibility and ease of testing
sort.Strings(idsInGroup) // We try to keep the order of definitions to keep backward-compatibility
// See https://github.com/roboll/helmfile/issues/988
sort.Slice(idsInGroup, func(i, j int) bool {
ii := idToIndex[idsInGroup[i]]
ij := idToIndex[idsInGroup[j]]
return ii < ij
})
for _, id := range idsInGroup { for _, id := range idsInGroup {
releases, ok := idToReleases[id] releases, ok := idToReleases[id]