feat: Persist Helmfile version in helmfile.lock for version compatibility check (#1016)
Reslove #698
This commit is contained in:
		
							parent
							
								
									07c42474cc
								
							
						
					
					
						commit
						4b1b19f8a6
					
				
							
								
								
									
										6
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										6
									
								
								Makefile
								
								
								
								
							|  | @ -26,15 +26,15 @@ integration: | ||||||
| .PHONY: integration | .PHONY: integration | ||||||
| 
 | 
 | ||||||
| cross: | cross: | ||||||
| 	env CGO_ENABLED=0 gox -os '!openbsd !freebsd !netbsd' -arch '!arm !mips !mipsle !mips64 !mips64le !s390x' -output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}" -ldflags '-X main.Version=${TAG}' ${TARGETS} | 	env CGO_ENABLED=0 gox -os '!openbsd !freebsd !netbsd' -arch '!arm !mips !mipsle !mips64 !mips64le !s390x' -output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}" -ldflags '-X github.com/roboll/helmfile/pkg/app/version.Version=${TAG}' ${TARGETS} | ||||||
| .PHONY: cross | .PHONY: cross | ||||||
| 
 | 
 | ||||||
| static-linux: | static-linux: | ||||||
| 	env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOFLAGS=-mod=vendor go build -o "dist/helmfile_linux_amd64" -ldflags '-X main.Version=${TAG}' ${TARGETS} | 	env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOFLAGS=-mod=vendor go build -o "dist/helmfile_linux_amd64" -ldflags '-X github.com/roboll/helmfile/pkg/app/version.Version=${TAG}' ${TARGETS} | ||||||
| .PHONY: static-linux | .PHONY: static-linux | ||||||
| 
 | 
 | ||||||
| install: | install: | ||||||
| 	env CGO_ENABLED=0 go install -ldflags '-X main.Version=${TAG}' ${TARGETS} | 	env CGO_ENABLED=0 go install -ldflags '-X github.com/roboll/helmfile/pkg/app/version.Version=${TAG}' ${TARGETS} | ||||||
| .PHONY: install | .PHONY: install | ||||||
| 
 | 
 | ||||||
| clean: | clean: | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										1
									
								
								go.mod
								
								
								
								
							|  | @ -16,6 +16,7 @@ require ( | ||||||
| 	github.com/gosuri/uitable v0.0.3 | 	github.com/gosuri/uitable v0.0.3 | ||||||
| 	github.com/hashicorp/go-getter v1.3.0 | 	github.com/hashicorp/go-getter v1.3.0 | ||||||
| 	github.com/hashicorp/go-retryablehttp v0.6.3 // indirect | 	github.com/hashicorp/go-retryablehttp v0.6.3 // indirect | ||||||
|  | 	github.com/hashicorp/go-version v1.2.0 | ||||||
| 	github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c // indirect | 	github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c // indirect | ||||||
| 	github.com/huandu/xstrings v1.2.0 // indirect | 	github.com/huandu/xstrings v1.2.0 // indirect | ||||||
| 	github.com/imdario/mergo v0.3.6 | 	github.com/imdario/mergo v0.3.6 | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										1
									
								
								go.sum
								
								
								
								
							|  | @ -941,6 +941,7 @@ google.golang.org/api v0.11.0 h1:n/qM3q0/rV2F0pox7o0CvNhlPvZAo7pLbef122cbLJ0= | ||||||
| google.golang.org/api v0.11.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | google.golang.org/api v0.11.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | ||||||
| google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= | google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= | ||||||
| google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | ||||||
|  | google.golang.org/api v0.14.0 h1:uMf5uLi4eQMRrMKhCplNik4U4H8Z6C1br3zOtAa/aDE= | ||||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||||
| google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||||
| google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk= | google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk= | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								main.go
								
								
								
								
							
							
						
						
									
										5
									
								
								main.go
								
								
								
								
							|  | @ -2,6 +2,7 @@ package main | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"github.com/roboll/helmfile/pkg/app/version" | ||||||
| 	"os" | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
|  | @ -14,8 +15,6 @@ import ( | ||||||
| 	"go.uber.org/zap/zapcore" | 	"go.uber.org/zap/zapcore" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var Version string |  | ||||||
| 
 |  | ||||||
| var logger *zap.SugaredLogger | var logger *zap.SugaredLogger | ||||||
| 
 | 
 | ||||||
| func configureLogging(c *cli.Context) error { | func configureLogging(c *cli.Context) error { | ||||||
|  | @ -45,7 +44,7 @@ func main() { | ||||||
| 	cliApp := cli.NewApp() | 	cliApp := cli.NewApp() | ||||||
| 	cliApp.Name = "helmfile" | 	cliApp.Name = "helmfile" | ||||||
| 	cliApp.Usage = "" | 	cliApp.Usage = "" | ||||||
| 	cliApp.Version = Version | 	cliApp.Version = version.Version | ||||||
| 	cliApp.Flags = []cli.Flag{ | 	cliApp.Flags = []cli.Flag{ | ||||||
| 		cli.StringFlag{ | 		cli.StringFlag{ | ||||||
| 			Name:  "helm-binary, b", | 			Name:  "helm-binary, b", | ||||||
|  |  | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | package version | ||||||
|  | 
 | ||||||
|  | var Version string | ||||||
|  | @ -3,7 +3,9 @@ package state | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/Masterminds/semver" | 	"github.com/Masterminds/semver" | ||||||
|  | 	goversion "github.com/hashicorp/go-version" | ||||||
| 	"github.com/r3labs/diff" | 	"github.com/r3labs/diff" | ||||||
|  | 	"github.com/roboll/helmfile/pkg/app/version" | ||||||
| 	"github.com/roboll/helmfile/pkg/helmexec" | 	"github.com/roboll/helmfile/pkg/helmexec" | ||||||
| 	"go.uber.org/zap" | 	"go.uber.org/zap" | ||||||
| 	"gopkg.in/yaml.v2" | 	"gopkg.in/yaml.v2" | ||||||
|  | @ -50,6 +52,7 @@ type ChartRequirements struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type ChartLockedRequirements struct { | type ChartLockedRequirements struct { | ||||||
|  | 	Version              string                    `yaml:"version"` | ||||||
| 	ResolvedDependencies []ResolvedChartDependency `yaml:"dependencies"` | 	ResolvedDependencies []ResolvedChartDependency `yaml:"dependencies"` | ||||||
| 	Digest               string                    `yaml:"digest"` | 	Digest               string                    `yaml:"digest"` | ||||||
| 	Generated            string                    `yaml:"generated"` | 	Generated            string                    `yaml:"generated"` | ||||||
|  | @ -374,6 +377,8 @@ func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *Unre | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	lockedReqs.Version = version.Version | ||||||
|  | 
 | ||||||
| 	updatedLockFileContent, err = yaml.Marshal(lockedReqs) | 	updatedLockFileContent, err = yaml.Marshal(lockedReqs) | ||||||
| 
 | 
 | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -404,6 +409,25 @@ func (m *chartDependencyManager) Resolve(unresolved *UnresolvedDependencies) (*R | ||||||
| 		return nil, false, err | 		return nil, false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Make sure go run main.go works and compatible with old lock files.
 | ||||||
|  | 	if version.Version != "" && lockedReqs.Version != "" { | ||||||
|  | 		lockedVersion, err := goversion.NewVersion(lockedReqs.Version) | ||||||
|  | 
 | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, false, err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		currentVersion, err := goversion.NewVersion(version.Version) | ||||||
|  | 
 | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, false, err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if currentVersion.LessThan(lockedVersion) { | ||||||
|  | 			return nil, false, fmt.Errorf("the lockfile was created by Helmfile %s, which is newer than current %s; Please upgrade to Helmfile %s or greater", lockedVersion.Original(), currentVersion.Original(), lockedVersion.Original()) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	resolved := &ResolvedDependencies{deps: map[string][]ResolvedChartDependency{}} | 	resolved := &ResolvedDependencies{deps: map[string][]ResolvedChartDependency{}} | ||||||
| 	for _, d := range lockedReqs.ResolvedDependencies { | 	for _, d := range lockedReqs.ResolvedDependencies { | ||||||
| 		if err := resolved.add(d); err != nil { | 		if err := resolved.add(d); err != nil { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue