[dubboctl] add version command (#746)

diff --git a/dubboctl/cmd/root.go b/dubboctl/cmd/root.go
index e643c40..4cafabe 100644
--- a/dubboctl/cmd/root.go
+++ b/dubboctl/cmd/root.go
@@ -28,6 +28,7 @@
 	"github.com/apache/dubbo-kubernetes/dubboctl/pkg/sdk"
 	"github.com/apache/dubbo-kubernetes/dubboctl/pkg/util"
 	"github.com/apache/dubbo-kubernetes/dubboctl/pkg/validate"
+	"github.com/apache/dubbo-kubernetes/dubboctl/pkg/version"
 	"github.com/apache/dubbo-kubernetes/operator/cmd/cluster"
 	"github.com/spf13/cobra"
 	"net/http"
@@ -123,10 +124,6 @@
 	rootCmd.AddCommand(validateCmd)
 	hideFlags(validateCmd, ChartFlag)
 
-	// versionCmd := version.NewVersionCommand(ctx)
-	// rootCmd.AddCommand(versionCmd)
-	// hideFlags(versionCmd, ChartFlag)
-
 	createCmd := CreateCmd(ctx, rootCmd, factory)
 	rootCmd.AddCommand(createCmd)
 	hideFlags(createCmd, ChartFlag)
@@ -139,8 +136,9 @@
 	rootCmd.AddCommand(imageCmd)
 	hideFlags(imageCmd, ChartFlag)
 
-	return rootCmd
+	rootCmd.AddCommand(version.NewVersionCommand())
 
+	return rootCmd
 }
 
 func hideFlags(origin *cobra.Command, hide ...string) {
diff --git a/dubboctl/pkg/version/version.go b/dubboctl/pkg/version/version.go
index f984a60..41b9f77 100644
--- a/dubboctl/pkg/version/version.go
+++ b/dubboctl/pkg/version/version.go
@@ -18,13 +18,23 @@
 package version
 
 import (
-	"github.com/apache/dubbo-kubernetes/dubboctl/pkg/cli"
-	dubboVersion "github.com/apache/dubbo-kubernetes/pkg/version"
+	"fmt"
+	"github.com/apache/dubbo-kubernetes/pkg/version"
 	"github.com/spf13/cobra"
+	"github.com/spf13/pflag"
+	"os"
 )
 
-func NewVersionCommand(_ cli.Context) *cobra.Command {
+func NewVersionCommand() *cobra.Command {
 	var versionCmd *cobra.Command
-	versionCmd = dubboVersion.CobraCommandWithOptions()
+	versionCmd = version.CobraCommandWithOptions()
+	versionCmd.Flags().VisitAll(func(flag *pflag.Flag) {
+		if flag.Name == "short" {
+			err := flag.Value.Set("true")
+			if err != nil {
+				fmt.Fprintf(os.Stdout, "set flag %q as true failed due to error %v", flag.Name, err)
+			}
+		}
+	})
 	return versionCmd
 }
diff --git a/pkg/version/cobra.go b/pkg/version/cobra.go
index dccc244..50ff6be 100644
--- a/pkg/version/cobra.go
+++ b/pkg/version/cobra.go
@@ -18,25 +18,17 @@
 package version
 
 import (
-	"encoding/json"
-	"errors"
 	"fmt"
 	"github.com/spf13/cobra"
-	"sigs.k8s.io/yaml"
 )
 
 type Version struct {
-	ClientVersion *BuildInfo `json:"clientVersion,omitempty" yaml:"clientVersion,omitempty"`
+	ClientVersion *BuildVersion `json:"clientVersion,omitempty" yaml:"clientVersion,omitempty"`
 }
 
-var (
-	Info BuildInfo
-)
-
 func CobraCommandWithOptions() *cobra.Command {
 	var (
 		short   bool
-		output  string
 		version Version
 	)
 	ves := &cobra.Command{
@@ -44,33 +36,14 @@
 		Short: "Display the information of the currently built version",
 		Long:  "The version command displays the information of the currently built version.",
 		RunE: func(cmd *cobra.Command, args []string) error {
-			if output != "" && output != "yaml" && output != "json" {
-				return errors.New(`--output must be 'yaml' or 'json'`)
+			version.ClientVersion = &Cobra
+			if short {
+				_, _ = fmt.Fprintf(cmd.OutOrStdout(), "client version: %s\n", version.ClientVersion.Version)
 			}
-			version.ClientVersion = &Info
-			switch output {
-			case "":
-				if short {
-					_, _ = fmt.Fprintf(cmd.OutOrStdout(), "client version: %s\n", version.ClientVersion.Version)
-
-				} else {
-					_, _ = fmt.Fprintf(cmd.OutOrStdout(), "client version: %s\n", version.ClientVersion.LongForm())
-				}
-			case "yaml":
-				if marshaled, err := yaml.Marshal(&version); err == nil {
-					_, _ = fmt.Fprintln(cmd.OutOrStdout(), string(marshaled))
-				}
-			case "json":
-				if marshaled, err := json.MarshalIndent(&version, "", "  "); err == nil {
-					_, _ = fmt.Fprintln(cmd.OutOrStdout(), string(marshaled))
-				}
-			}
-
 			return nil
 		},
 	}
 
 	ves.Flags().BoolVarP(&short, "short", "s", false, "Use --short=false to generate full version information")
-	ves.Flags().StringVarP(&output, "output", "o", "", "One of 'yaml' or 'json'.")
 	return ves
 }
diff --git a/pkg/version/version.go b/pkg/version/version.go
index 56dce90..8ae9ffe 100644
--- a/pkg/version/version.go
+++ b/pkg/version/version.go
@@ -24,26 +24,28 @@
 )
 
 var (
-	buildVersion = "unknown"
+	buildVersion     = "unknown"
+	buildGitRevision = "unknown"
+	buildStatus      = "unknown"
+	buildTag         = "unknown"
 )
 
-// type BuildInfo struct {
-//	Version string `json:"version"`
-// }
-
-func (b BuildInfo) String() string {
-	return fmt.Sprintf("%v", b.Version)
+type BuildVersion struct {
+	Version       string `json:"version"`
+	GitRevision   string `json:"revision"`
+	GolangVersion string `json:"golang_version"`
+	BuildStatus   string `json:"status"`
+	GitTag        string `json:"tag"`
 }
 
-func (b BuildInfo) LongForm() string {
-	return fmt.Sprintf("%#v", b)
+func (b BuildVersion) String() string {
+	return fmt.Sprintf("%v-%v-%v",
+		b.Version,
+		b.GitRevision,
+		b.BuildStatus)
 }
 
-func init() {
-	Info = BuildInfo{
-		Version: buildVersion,
-	}
-}
+var Cobra BuildVersion
 
 var (
 	Product      = "Dubbo"
@@ -127,4 +129,12 @@
 		BuildDate:    buildDate,
 		BasedOnDubbo: basedOndubbo,
 	}
+
+	Cobra = BuildVersion{
+		Version:       buildVersion,
+		GitRevision:   buildGitRevision,
+		GolangVersion: runtime.Version(),
+		BuildStatus:   buildStatus,
+		GitTag:        buildTag,
+	}
 }