Merge pull request #3652 from jwcesign/fix-version-parse-v2
feat: Fix version parse
This commit is contained in:
commit
d4f69f221a
|
|
@ -63,11 +63,11 @@ func init() {
|
|||
klog.Infof("No default release version found. build version: %s", version.Get().String())
|
||||
releaseVer = &version.ReleaseVersion{} // initialize to avoid panic
|
||||
}
|
||||
karmadaRelease = releaseVer.PatchRelease()
|
||||
karmadaRelease = releaseVer.ReleaseVersion()
|
||||
|
||||
DefaultKarmadaDeschedulerImage = fmt.Sprintf("docker.io/karmada/karmada-descheduler:%s", releaseVer.PatchRelease())
|
||||
DefaultKarmadaSchedulerEstimatorImage = fmt.Sprintf("docker.io/karmada/karmada-scheduler-estimator:%s", releaseVer.PatchRelease())
|
||||
DefaultKarmadaSearchImage = fmt.Sprintf("docker.io/karmada/karmada-search:%s", releaseVer.PatchRelease())
|
||||
DefaultKarmadaDeschedulerImage = fmt.Sprintf("docker.io/karmada/karmada-descheduler:%s", releaseVer.ReleaseVersion())
|
||||
DefaultKarmadaSchedulerEstimatorImage = fmt.Sprintf("docker.io/karmada/karmada-scheduler-estimator:%s", releaseVer.ReleaseVersion())
|
||||
DefaultKarmadaSearchImage = fmt.Sprintf("docker.io/karmada/karmada-search:%s", releaseVer.ReleaseVersion())
|
||||
}
|
||||
|
||||
// KarmadaDeschedulerImage get karmada descheduler image
|
||||
|
|
|
|||
|
|
@ -149,5 +149,5 @@ func initExample(parentCommand string) string {
|
|||
klog.Infof("No default release version found. build version: %s", version.Get().String())
|
||||
releaseVer = &version.ReleaseVersion{}
|
||||
}
|
||||
return fmt.Sprintf(initExamples, parentCommand, releaseVer.FirstMinorRelease())
|
||||
return fmt.Sprintf(initExamples, parentCommand, releaseVer.ReleaseVersion())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,14 +75,14 @@ func init() {
|
|||
klog.Infof("No default release version found. build version: %s", version.Get().String())
|
||||
releaseVer = &version.ReleaseVersion{} // initialize to avoid panic
|
||||
}
|
||||
karmadaRelease = releaseVer.PatchRelease()
|
||||
karmadaRelease = releaseVer.ReleaseVersion()
|
||||
|
||||
DefaultCrdURL = fmt.Sprintf("https://github.com/karmada-io/karmada/releases/download/%s/crds.tar.gz", releaseVer.FirstMinorRelease())
|
||||
DefaultCrdURL = fmt.Sprintf("https://github.com/karmada-io/karmada/releases/download/%s/crds.tar.gz", releaseVer.ReleaseVersion())
|
||||
DefaultInitImage = "docker.io/alpine:3.15.1"
|
||||
DefaultKarmadaSchedulerImage = fmt.Sprintf("docker.io/karmada/karmada-scheduler:%s", releaseVer.PatchRelease())
|
||||
DefaultKarmadaControllerManagerImage = fmt.Sprintf("docker.io/karmada/karmada-controller-manager:%s", releaseVer.PatchRelease())
|
||||
DefualtKarmadaWebhookImage = fmt.Sprintf("docker.io/karmada/karmada-webhook:%s", releaseVer.PatchRelease())
|
||||
DefaultKarmadaAggregatedAPIServerImage = fmt.Sprintf("docker.io/karmada/karmada-aggregated-apiserver:%s", releaseVer.PatchRelease())
|
||||
DefaultKarmadaSchedulerImage = fmt.Sprintf("docker.io/karmada/karmada-scheduler:%s", releaseVer.ReleaseVersion())
|
||||
DefaultKarmadaControllerManagerImage = fmt.Sprintf("docker.io/karmada/karmada-controller-manager:%s", releaseVer.ReleaseVersion())
|
||||
DefualtKarmadaWebhookImage = fmt.Sprintf("docker.io/karmada/karmada-webhook:%s", releaseVer.ReleaseVersion())
|
||||
DefaultKarmadaAggregatedAPIServerImage = fmt.Sprintf("docker.io/karmada/karmada-aggregated-apiserver:%s", releaseVer.ReleaseVersion())
|
||||
}
|
||||
|
||||
// CommandInitOption holds all flags options for init.
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ func NewCmdRegister(parentCommand string) *cobra.Command {
|
|||
flags.StringSliceVar(&opts.BootstrapToken.CACertHashes, "discovery-token-ca-cert-hash", []string{}, "For token-based discovery, validate that the root CA public key matches this hash (format: \"<type>:<value>\").")
|
||||
flags.BoolVar(&opts.BootstrapToken.UnsafeSkipCAVerification, "discovery-token-unsafe-skip-ca-verification", false, "For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning.")
|
||||
flags.DurationVar(&opts.Timeout, "discovery-timeout", DefaultDiscoveryTimeout, "The timeout to discovery karmada apiserver client.")
|
||||
flags.StringVar(&opts.KarmadaAgentImage, "karmada-agent-image", fmt.Sprintf("docker.io/karmada/karmada-agent:%s", releaseVer.PatchRelease()), "Karmada agent image.")
|
||||
flags.StringVar(&opts.KarmadaAgentImage, "karmada-agent-image", fmt.Sprintf("docker.io/karmada/karmada-agent:%s", releaseVer.ReleaseVersion()), "Karmada agent image.")
|
||||
flags.Int32Var(&opts.KarmadaAgentReplicas, "karmada-agent-replicas", 1, "Karmada agent replicas.")
|
||||
flags.Int32Var(&opts.CertExpirationSeconds, "cert-expiration-seconds", DefaultCertExpirationSeconds, "The expiration time of certificate.")
|
||||
flags.BoolVar(&opts.DryRun, "dry-run", false, "Run the command in dry-run mode, without making any server requests.")
|
||||
|
|
|
|||
|
|
@ -2,10 +2,16 @@ package version
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
|
||||
utilversion "k8s.io/apimachinery/pkg/util/version"
|
||||
)
|
||||
|
||||
var (
|
||||
// gitVersionSplitRE is a regexp to split a git version string.
|
||||
gitVersionSplitRE = regexp.MustCompile("-[0-9]+-g[0-9a-z]{7}")
|
||||
)
|
||||
|
||||
// ReleaseVersion represents a released version.
|
||||
type ReleaseVersion struct {
|
||||
*utilversion.Version
|
||||
|
|
@ -14,8 +20,9 @@ type ReleaseVersion struct {
|
|||
// ParseGitVersion parses a git version string, such as:
|
||||
// - v1.1.0-73-g7e6d4f69
|
||||
// - v1.1.0
|
||||
// - v1.1.0-alpha.1-3-gf20c721a
|
||||
func ParseGitVersion(gitVersion string) (*ReleaseVersion, error) {
|
||||
v, err := utilversion.ParseGeneric(gitVersion)
|
||||
v, err := utilversion.ParseSemantic(gitVersion)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -25,22 +32,29 @@ func ParseGitVersion(gitVersion string) (*ReleaseVersion, error) {
|
|||
}, nil
|
||||
}
|
||||
|
||||
// FirstMinorRelease returns the minor release but the patch releases always be 0(vx.y.0). e.g:
|
||||
// - v1.2.1-12-g2eb92858 --> v1.2.0
|
||||
// - v1.2.3-12-g2e860210 --> v1.2.0
|
||||
func (r *ReleaseVersion) FirstMinorRelease() string {
|
||||
// ReleaseVersion returns the parsed version in the following format:
|
||||
// - v1.2.1-12-g2eb92858 --> v1.2.1
|
||||
// - v1.2.3-12-g2e860210 --> v1.2.3
|
||||
// - v1.3.0-alpha.1-12-g2e860210 --> v1.3.0-alpha.1
|
||||
// It could be patch release or pre-release
|
||||
func (r *ReleaseVersion) ReleaseVersion() string {
|
||||
if r.Version == nil {
|
||||
return "<nil>"
|
||||
}
|
||||
|
||||
return fmt.Sprintf("v%d.%d.0", r.Version.Major(), r.Version.Minor())
|
||||
filteredVersion := removeGitVersionCommits(r.String())
|
||||
return fmt.Sprintf("v%s", filteredVersion)
|
||||
}
|
||||
|
||||
// PatchRelease returns the stable version with format "vx.y.z".
|
||||
func (r *ReleaseVersion) PatchRelease() string {
|
||||
if r.Version == nil {
|
||||
return "<nil>"
|
||||
}
|
||||
// removeGitVersionCommits removes the git commit info from the version
|
||||
// The git version looks like: v1.0.4-14-g2414721
|
||||
// the current head of my "parent" branch is based on v1.0.4,
|
||||
// but since it has a few commits on top of that, describe has added the number of additional commits ("14")
|
||||
// and an abbreviated object name for the commit itself ("2414721") at the end.
|
||||
func removeGitVersionCommits(gitVersion string) string {
|
||||
// This match the commit info part of the git version
|
||||
// If the gitVersion is empty, it will return an empty string
|
||||
matches := gitVersionSplitRE.Split(gitVersion, 2)
|
||||
|
||||
return fmt.Sprintf("v%d.%d.%d", r.Version.Major(), r.Version.Minor(), r.Version.Patch())
|
||||
return matches[0]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,29 +6,13 @@ func TestReleaseVersion(t *testing.T) {
|
|||
tests := []struct {
|
||||
name string
|
||||
gitVersion string
|
||||
expectFirstMinorRelease string
|
||||
expectPatchRelease string
|
||||
expectReleaseVersion string
|
||||
expectError bool
|
||||
}{
|
||||
{
|
||||
name: "first minor release",
|
||||
gitVersion: "v1.1.0",
|
||||
expectFirstMinorRelease: "v1.1.0",
|
||||
expectPatchRelease: "v1.1.0",
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
name: "subsequent minor release",
|
||||
gitVersion: "v1.1.1",
|
||||
expectFirstMinorRelease: "v1.1.0",
|
||||
expectPatchRelease: "v1.1.1",
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
name: "normal git version",
|
||||
gitVersion: "v1.1.1-6-gf20c721a",
|
||||
expectFirstMinorRelease: "v1.1.0",
|
||||
expectPatchRelease: "v1.1.1",
|
||||
expectReleaseVersion: "v1.1.1",
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
|
|
@ -36,6 +20,12 @@ func TestReleaseVersion(t *testing.T) {
|
|||
gitVersion: "vx.y.z-6-gf20c721a",
|
||||
expectError: true,
|
||||
},
|
||||
{
|
||||
name: "prerelease alpha version",
|
||||
gitVersion: "v1.7.0-alpha.1-3-gf20c721a",
|
||||
expectReleaseVersion: "v1.7.0-alpha.1",
|
||||
expectError: false,
|
||||
},
|
||||
}
|
||||
|
||||
for i := range tests {
|
||||
|
|
@ -54,106 +44,8 @@ func TestReleaseVersion(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
if rv.FirstMinorRelease() != tc.expectFirstMinorRelease {
|
||||
t.Fatalf("expect first minor release: %s, but got: %s", tc.expectFirstMinorRelease, rv.FirstMinorRelease())
|
||||
}
|
||||
|
||||
if rv.PatchRelease() != tc.expectPatchRelease {
|
||||
t.Fatalf("expect patch release: %s, but got: %s", tc.expectPatchRelease, rv.PatchRelease())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestReleaseVersion_FirstMinorRelease(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
gitVersion string
|
||||
ignoreError bool
|
||||
expect string
|
||||
}{
|
||||
{
|
||||
name: "invalid version should dump nil",
|
||||
gitVersion: "",
|
||||
ignoreError: true,
|
||||
expect: "<nil>",
|
||||
},
|
||||
{
|
||||
name: "standard semantic version",
|
||||
gitVersion: "v1.2.1",
|
||||
ignoreError: false,
|
||||
expect: "v1.2.0",
|
||||
},
|
||||
{
|
||||
name: "standard semantic version suffixed with commits",
|
||||
gitVersion: "v1.2.3-12-g2e860210",
|
||||
ignoreError: false,
|
||||
expect: "v1.2.0",
|
||||
},
|
||||
}
|
||||
|
||||
for i := range tests {
|
||||
tc := tests[i]
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
rv, err := ParseGitVersion(tc.gitVersion)
|
||||
if err != nil {
|
||||
if tc.ignoreError {
|
||||
// initialize to avoid panic because just focus on the version inside ReleaseVersion.
|
||||
rv = &ReleaseVersion{Version: nil}
|
||||
} else {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if rv.FirstMinorRelease() != tc.expect {
|
||||
t.Fatalf("expect first minor release: %s, but got: %s", tc.expect, rv.FirstMinorRelease())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestReleaseVersion_PatchRelease(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
gitVersion string
|
||||
ignoreError bool
|
||||
expect string
|
||||
}{
|
||||
{
|
||||
name: "invalid version should dump nil",
|
||||
gitVersion: "",
|
||||
ignoreError: true,
|
||||
expect: "<nil>",
|
||||
},
|
||||
{
|
||||
name: "standard semantic version",
|
||||
gitVersion: "v1.2.1",
|
||||
ignoreError: false,
|
||||
expect: "v1.2.1",
|
||||
},
|
||||
{
|
||||
name: "standard semantic version suffixed with commits",
|
||||
gitVersion: "v1.2.3-12-g2e860210",
|
||||
ignoreError: false,
|
||||
expect: "v1.2.3",
|
||||
},
|
||||
}
|
||||
|
||||
for i := range tests {
|
||||
tc := tests[i]
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
rv, err := ParseGitVersion(tc.gitVersion)
|
||||
if err != nil {
|
||||
if tc.ignoreError {
|
||||
// initialize to avoid panic because just focus on the version inside ReleaseVersion.
|
||||
rv = &ReleaseVersion{Version: nil}
|
||||
} else {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if rv.PatchRelease() != tc.expect {
|
||||
t.Fatalf("expect patch release: %s, but got: %s", tc.expect, rv.PatchRelease())
|
||||
if rv.ReleaseVersion() != tc.expectReleaseVersion {
|
||||
t.Fatalf("expect patch release: %s, but got: %s", tc.expectReleaseVersion, rv.ReleaseVersion())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue