Fix regression in the order of processed releases when concurrency is 1 (#992)
Fixes #988
This commit is contained in:
parent
7ec92c0520
commit
f508b9091e
|
|
@ -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
|
||||||
|
|
||||||
`,
|
`,
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue