diff --git a/Makefile b/Makefile index b05a62e9e..e5b3e626d 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ # VERSION is based on a date stamp plus the last commit VERSION?=v$(shell date +%Y%m%d)-$(shell git describe --tags --match "v*") BUILD=$(shell date +%FT%T%z) -LDFLAG_LOCATION=sigs.k8s.io/descheduler/cmd/descheduler/app +LDFLAG_LOCATION=sigs.k8s.io/descheduler/pkg/version ARCHS = amd64 arm64 LDFLAGS=-ldflags "-X ${LDFLAG_LOCATION}.version=${VERSION} -X ${LDFLAG_LOCATION}.buildDate=${BUILD}" diff --git a/cmd/descheduler/app/version.go b/cmd/descheduler/app/version.go index a59f92336..43bb283d2 100644 --- a/cmd/descheduler/app/version.go +++ b/cmd/descheduler/app/version.go @@ -18,77 +18,19 @@ package app import ( "fmt" - "regexp" - "runtime" - "strings" "github.com/spf13/cobra" + "sigs.k8s.io/descheduler/pkg/version" ) -var ( - // version is a constant representing the version tag that - // generated this build. It should be set during build via -ldflags. - version string - // buildDate in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ') - //It should be set during build via -ldflags. - buildDate string -) - -// Info holds the information related to descheduler app version. -type Info struct { - Major string `json:"major"` - Minor string `json:"minor"` - GitVersion string `json:"gitVersion"` - BuildDate string `json:"buildDate"` - GoVersion string `json:"goVersion"` - Compiler string `json:"compiler"` - Platform string `json:"platform"` -} - -// Get returns the overall codebase version. It's for detecting -// what code a binary was built from. -func Get() Info { - majorVersion, minorVersion := splitVersion(version) - return Info{ - Major: majorVersion, - Minor: minorVersion, - GitVersion: version, - BuildDate: buildDate, - GoVersion: runtime.Version(), - Compiler: runtime.Compiler, - Platform: fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH), - } -} - func NewVersionCommand() *cobra.Command { var versionCmd = &cobra.Command{ Use: "version", Short: "Version of descheduler", Long: `Prints the version of descheduler.`, Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("Descheduler version %+v\n", Get()) + fmt.Printf("Descheduler version %+v\n", version.Get()) }, } return versionCmd } - -// splitVersion splits the git version to generate major and minor versions needed. -func splitVersion(version string) (string, string) { - if version == "" { - return "", "" - } - - // Version from an automated container build environment for a tag. For example v20200521-v0.18.0. - m1, _ := regexp.MatchString(`^v\d{8}-v\d+\.\d+\.\d+$`, version) - - // Version from an automated container build environment(not a tag) or a local build. For example v20201009-v0.18.0-46-g939c1c0. - m2, _ := regexp.MatchString(`^v\d{8}-v\d+\.\d+\.\d+-\w+-\w+$`, version) - - if m1 || m2 { - semVer := strings.Split(version, "-")[1] - return strings.Trim(strings.Split(semVer, ".")[0], "v"), strings.Split(semVer, ".")[1] + "+" - } - - // Something went wrong - return "", "" -} diff --git a/pkg/version/version.go b/pkg/version/version.go new file mode 100644 index 000000000..ab0291503 --- /dev/null +++ b/pkg/version/version.go @@ -0,0 +1,80 @@ +/* +Copyright 2017 The Kubernetes 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 ( + "fmt" + "regexp" + "runtime" + "strings" +) + +var ( + // version is a constant representing the version tag that + // generated this build. It should be set during build via -ldflags. + version string + // buildDate in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ') + //It should be set during build via -ldflags. + buildDate string +) + +// Info holds the information related to descheduler app version. +type Info struct { + Major string `json:"major"` + Minor string `json:"minor"` + GitVersion string `json:"gitVersion"` + BuildDate string `json:"buildDate"` + GoVersion string `json:"goVersion"` + Compiler string `json:"compiler"` + Platform string `json:"platform"` +} + +// Get returns the overall codebase version. It's for detecting +// what code a binary was built from. +func Get() Info { + majorVersion, minorVersion := splitVersion(version) + return Info{ + Major: majorVersion, + Minor: minorVersion, + GitVersion: version, + BuildDate: buildDate, + GoVersion: runtime.Version(), + Compiler: runtime.Compiler, + Platform: fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH), + } +} + +// splitVersion splits the git version to generate major and minor versions needed. +func splitVersion(version string) (string, string) { + if version == "" { + return "", "" + } + + // Version from an automated container build environment for a tag. For example v20200521-v0.18.0. + m1, _ := regexp.MatchString(`^v\d{8}-v\d+\.\d+\.\d+$`, version) + + // Version from an automated container build environment(not a tag) or a local build. For example v20201009-v0.18.0-46-g939c1c0. + m2, _ := regexp.MatchString(`^v\d{8}-v\d+\.\d+\.\d+-\w+-\w+$`, version) + + if m1 || m2 { + semVer := strings.Split(version, "-")[1] + return strings.Trim(strings.Split(semVer, ".")[0], "v"), strings.Split(semVer, ".")[1] + "+" + } + + // Something went wrong + return "", "" +}