Skip to content

Commit 3a825c1

Browse files
refactor: remove duplication, add runtime fallbacks and unit tests.
1 parent f292f90 commit 3a825c1

File tree

3 files changed

+108
-26
lines changed

3 files changed

+108
-26
lines changed

cmd/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func Run() {
5555
c, err := cli.New(
5656
cli.WithCommandName("kubebuilder"),
5757
cli.WithVersion(versionString()),
58-
cli.WithCliVersion(getKubebuilderVersion()),
58+
cli.WithCliVersion(getKubeBuilderVersion()),
5959
cli.WithPlugins(
6060
golangv4.Plugin{},
6161
gov4Bundle,

cmd/version.go

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,58 +17,91 @@ limitations under the License.
1717
package cmd
1818

1919
import (
20+
"encoding/json"
2021
"fmt"
22+
"runtime"
2123
"runtime/debug"
2224
)
2325

2426
const unknown = "unknown"
2527

26-
// var needs to be used instead of const as ldflags is used to fill this
27-
// information in the release process
28+
// These are filled via ldflags during build
2829
var (
2930
kubeBuilderVersion = unknown
3031
kubernetesVendorVersion = "1.33.0"
3132
goos = unknown
3233
goarch = unknown
33-
gitCommit = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD)
34-
35-
buildDate = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ')
34+
gitCommit = "$Format:%H$"
35+
buildDate = "1970-01-01T00:00:00Z"
3636
)
3737

38-
// version contains all the information related to the CLI version
39-
type version struct {
38+
// VersionInfo holds all CLI version-related information
39+
type VersionInfo struct {
4040
KubeBuilderVersion string `json:"kubeBuilderVersion"`
4141
KubernetesVendor string `json:"kubernetesVendor"`
4242
GitCommit string `json:"gitCommit"`
4343
BuildDate string `json:"buildDate"`
44-
GoOs string `json:"goOs"`
44+
GoOS string `json:"goOs"`
4545
GoArch string `json:"goArch"`
4646
}
4747

48-
// versionString returns the Full CLI version
49-
func versionString() string {
48+
// resolveBuildInfo ensures dynamic fields are populated
49+
func resolveBuildInfo() {
5050
if kubeBuilderVersion == unknown {
5151
if info, ok := debug.ReadBuildInfo(); ok && info.Main.Version != "" {
5252
kubeBuilderVersion = info.Main.Version
5353
}
5454
}
55-
56-
return fmt.Sprintf("Version: %#v", version{
57-
kubeBuilderVersion,
58-
kubernetesVendorVersion,
59-
gitCommit,
60-
buildDate,
61-
goos,
62-
goarch,
63-
})
55+
if goos == unknown {
56+
goos = runtime.GOOS
57+
}
58+
if goarch == unknown {
59+
goarch = runtime.GOARCH
60+
}
61+
if gitCommit == "$Format:%H$" || gitCommit == "" {
62+
gitCommit = unknown
63+
}
6464
}
6565

66-
// getKubebuilderVersion returns only the CLI version string
67-
func getKubebuilderVersion() string {
68-
if kubeBuilderVersion == unknown {
69-
if info, ok := debug.ReadBuildInfo(); ok && info.Main.Version != "" {
70-
kubeBuilderVersion = info.Main.Version
71-
}
66+
// getVersionInfo returns populated VersionInfo
67+
func getVersionInfo() VersionInfo {
68+
resolveBuildInfo()
69+
return VersionInfo{
70+
KubeBuilderVersion: kubeBuilderVersion,
71+
KubernetesVendor: kubernetesVendorVersion,
72+
GitCommit: gitCommit,
73+
BuildDate: buildDate,
74+
GoOS: goos,
75+
GoArch: goarch,
7276
}
77+
}
78+
79+
// versionString returns a human-friendly string version
80+
func versionString() string {
81+
v := getVersionInfo()
82+
return fmt.Sprintf(`KubeBuilder Version: %s
83+
Kubernetes Vendor: %s
84+
Git Commit: %s
85+
Build Date: %s
86+
Go OS/Arch: %s/%s`,
87+
v.KubeBuilderVersion,
88+
v.KubernetesVendor,
89+
v.GitCommit,
90+
v.BuildDate,
91+
v.GoOS,
92+
v.GoArch,
93+
)
94+
}
95+
96+
// getKubeBuilderVersion returns just the CLI version
97+
func getKubeBuilderVersion() string {
98+
resolveBuildInfo()
7399
return kubeBuilderVersion
74100
}
101+
102+
// versionJSON returns version as JSON string
103+
func versionJSON() string {
104+
v := getVersionInfo()
105+
b, _ := json.MarshalIndent(v, "", " ")
106+
return string(b)
107+
}

cmd/version_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package cmd
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestVersionStringIncludesExpectedFields(t *testing.T) {
11+
output := versionString()
12+
13+
assert.Contains(t, output, "KubeBuilder Version:")
14+
assert.Contains(t, output, "Kubernetes Vendor:")
15+
assert.Contains(t, output, "Git Commit:")
16+
assert.Contains(t, output, "Build Date:")
17+
assert.Contains(t, output, "Go OS/Arch:")
18+
}
19+
20+
func TestVersionJSONFormatAndKeys(t *testing.T) {
21+
jsonStr := versionJSON()
22+
23+
var result map[string]string
24+
err := json.Unmarshal([]byte(jsonStr), &result)
25+
assert.NoError(t, err)
26+
27+
assert.Contains(t, result, "kubeBuilderVersion")
28+
assert.Contains(t, result, "kubernetesVendor")
29+
assert.Contains(t, result, "gitCommit")
30+
assert.Contains(t, result, "buildDate")
31+
assert.Contains(t, result, "goOs")
32+
assert.Contains(t, result, "goArch")
33+
}
34+
35+
func TestGetVersionInfoFieldsArePopulated(t *testing.T) {
36+
v := getVersionInfo()
37+
38+
assert.NotEmpty(t, v.KubeBuilderVersion)
39+
assert.NotEmpty(t, v.KubernetesVendor)
40+
assert.NotEmpty(t, v.GitCommit)
41+
assert.NotEmpty(t, v.BuildDate)
42+
assert.NotEmpty(t, v.GoOS)
43+
assert.NotEmpty(t, v.GoArch)
44+
45+
assert.NotEqual(t, "unknown", v.KubeBuilderVersion, "KubeBuilderVersion should not be 'unknown'")
46+
assert.NotEqual(t, "unknown", v.GoOS, "GoOS should not be 'unknown'")
47+
assert.NotEqual(t, "unknown", v.GoArch, "GoArch should not be 'unknown'")
48+
assert.NotEqual(t, "$Format:%H$", v.GitCommit, "GitCommit should not be default placeholder")
49+
}

0 commit comments

Comments
 (0)