Merge pull request #3652 from jwcesign/fix-version-parse-v2

feat: Fix version parse
This commit is contained in:
karmada-bot 2023-06-16 15:08:44 +08:00 committed by GitHub
commit d4f69f221a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 54 additions and 148 deletions

View File

@ -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

View File

@ -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())
}

View File

@ -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.

View File

@ -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.")

View File

@ -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]
}

View File

@ -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())
}
})
}