Files
kubevela/version/version.go
Jerrin Francis 3d86ace196 fix(cli): pin scaffolded go.mod to running vela binary's version (#7097)
`vela def init-module` hardcoded `require github.com/oam-dev/kubevela
  v1.9.0` in the generated go.mod. Scaffolded modules pinned the wrong
  SDK whenever the installed vela tool drifted from v1.9.0, forcing users
  to hand-edit go.mod after scaffolding.

  Add version.ModuleRequireVersion() which returns the build-time
  VelaVersion when it is a valid semver and falls back to a pinned
  default for dev builds where VelaVersion is "UNKNOWN" (plain `go
  build`) or "master" (Makefile default) — both invalid semver that
  would otherwise break `go mod tidy` in the scaffolded module.

Signed-off-by: Jerrin Francis <jerrinfrancis7@gmail.com>
2026-04-19 08:51:17 -07:00

83 lines
2.6 KiB
Go

/*
Copyright 2021 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package version
import "github.com/hashicorp/go-version"
// GitRevision is the commit of repo
var GitRevision = "UNKNOWN"
// VelaVersion is the version of cli.
var VelaVersion = "UNKNOWN"
// defaultModuleRequireVersion is the kubevela SDK version written into
// scaffolded go.mod files when the running binary was built without a release
// version (e.g. VelaVersion is the default "UNKNOWN" or the Makefile's
// "master"). Bump alongside each release.
const defaultModuleRequireVersion = "v1.11.0"
// ModuleRequireVersion returns a semver suitable for a scaffolded go.mod
// `require github.com/oam-dev/kubevela <ver>` line. It prefers the running
// binary's build-time VelaVersion and falls back to defaultModuleRequireVersion
// when VelaVersion is not a valid semver (dev builds without ldflags).
func ModuleRequireVersion() string {
if IsOfficialKubeVelaVersion(VelaVersion) {
return VelaVersion
}
return defaultModuleRequireVersion
}
// IsOfficialKubeVelaVersion checks whether the provided version string follows a KubeVela version pattern
func IsOfficialKubeVelaVersion(versionStr string) bool {
_, err := version.NewSemver(versionStr)
return err == nil
}
// GetOfficialKubeVelaVersion extracts the KubeVela version from the provided string
// More precisely, this method returns the segments and prerelease info w/o metadata
func GetOfficialKubeVelaVersion(versionStr string) (string, error) {
s, err := version.NewSemver(versionStr)
if err != nil {
return "", err
}
v := s.String()
metadata := s.Metadata()
if metadata != "" {
metadata = "+" + metadata
}
return v[:len(v)-len(metadata)], nil
}
// ShouldUseLegacyHelmRepo checks whether the provided version should use the legacy helm repo
func ShouldUseLegacyHelmRepo(ver *version.Version) bool {
if ver.LessThan(version.Must(version.NewVersion("1.8.2"))) {
return true
}
if ver.GreaterThanOrEqual(version.Must(version.NewVersion("1.9.0"))) {
return false
}
// After v1.9.0-beta.1.post1, we use the new helm repo
switch ver.Prerelease() {
case "beta.1.post1", "beta.2", "beta.3":
return false
default:
return true
}
}