From 8c967397e319808cb29ae9823622b0a26f1a8db2 Mon Sep 17 00:00:00 2001 From: HyoBin Kim Date: Thu, 15 Feb 2024 11:03:16 +0900 Subject: [PATCH 1/4] [Feature] Add Verison Flag to CLI Added a 'version' variable to store version information Implemented 'printVersion', 'runVersionCheck' function to print the current version using the '--version' flag Signed-off-by: HyoBin Kim --- main.go | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 2c479095..03a233cb 100644 --- a/main.go +++ b/main.go @@ -21,6 +21,10 @@ import ( "go.containerssh.io/libcontainerssh/service" ) +var ( + version = "0.5.0" +) + // Main is a helper function to start a standard ContainerSSH instance. It should be used as the outer-most function // and should never be used as an embedding technique. func Main() { @@ -37,7 +41,7 @@ func Main() { logger = logger.WithLabel("module", "core") - configFile, actionDumpConfig, actionLicenses, actionHealthCheck := getArguments() + configFile, actionDumpConfig, actionLicenses, actionHealthCheck, actionVersionCheck := getArguments() if configFile == "" { configFile = "config.yaml" @@ -81,6 +85,8 @@ func Main() { runActionLicenses(configuredLogger) case actionHealthCheck: runHealthCheck(cfg, configuredLogger) + case actionVersionCheck: + runVersionCheck(configuredLogger) default: runContainerSSH(loggerFactory, configuredLogger, cfg, configFile) } @@ -94,7 +100,13 @@ func runHealthCheck(cfg config.AppConfig, logger log.Logger) { logger.Info(message.NewMessage(message.MCoreHealthCheckSuccessful, "Health check successful.")) os.Exit(0) } - +func runVersionCheck(logger log.Logger) { + if err := printVersion(os.Stdout); err != nil { + logger.Critical(err) + os.Exit(1) + } + os.Exit(0) +} func runActionLicenses(logger log.Logger) { if err := printLicenses(os.Stdout); err != nil { logger.Critical(err) @@ -142,11 +154,12 @@ func runContainerSSH( os.Exit(0) } -func getArguments() (string, bool, bool, bool) { +func getArguments() (string, bool, bool, bool, bool) { configFile := "" actionDumpConfig := false actionLicenses := false healthCheck := false + VersionCheck := false flag.StringVar( &configFile, "config", @@ -171,8 +184,14 @@ func getArguments() (string, bool, bool, bool) { false, "Run health check", ) + flag.BoolVar( + &VersionCheck, + "version", + false, + "Run version check", + ) flag.Parse() - return configFile, actionDumpConfig, actionLicenses, healthCheck + return configFile, actionDumpConfig, actionLicenses, healthCheck, VersionCheck } func startServices(cfg config.AppConfig, loggerFactory log.LoggerFactory) error { @@ -305,6 +324,17 @@ func healthCheck(cfg config.AppConfig, logger log.Logger) error { return nil } +func printVersion(writer io.Writer) error { + var buffer bytes.Buffer + buffer.WriteString("Containerssh Version:") + buffer.WriteString(version) + buffer.WriteString("\n") + if _, err := writer.Write(buffer.Bytes()); err != nil { + return fmt.Errorf("failed to write Version information (%w)", err) + } + return nil +} + func printLicenses(writer io.Writer) error { var buffer bytes.Buffer From a2cba115317ef2db39acca652b01a4884ae70490 Mon Sep 17 00:00:00 2001 From: okestro-hbkim <51896679+Kim-Hyo-Bin@users.noreply.github.com> Date: Fri, 16 Feb 2024 10:52:27 +0900 Subject: [PATCH 2/4] Update main.go Co-authored-by: Nikos Tsipinakis Signed-off-by: okestro-hbkim <51896679+Kim-Hyo-Bin@users.noreply.github.com> --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 03a233cb..6cf1eca1 100644 --- a/main.go +++ b/main.go @@ -326,7 +326,7 @@ func healthCheck(cfg config.AppConfig, logger log.Logger) error { func printVersion(writer io.Writer) error { var buffer bytes.Buffer - buffer.WriteString("Containerssh Version:") + buffer.WriteString("v") buffer.WriteString(version) buffer.WriteString("\n") if _, err := writer.Write(buffer.Bytes()); err != nil { From 41a66be72041e3a44e60bbb05bebfb036ea8f7f3 Mon Sep 17 00:00:00 2001 From: HyoBin Kim Date: Fri, 16 Feb 2024 15:19:03 +0900 Subject: [PATCH 3/4] [Feature] Get version buildinfo package debug using ReadBuildInfo() for relative version info Signed-off-by: HyoBin Kim --- main.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 6cf1eca1..059b93bb 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "os" "os/signal" "path/filepath" + "runtime/debug" "strings" "syscall" "time" @@ -21,10 +22,6 @@ import ( "go.containerssh.io/libcontainerssh/service" ) -var ( - version = "0.5.0" -) - // Main is a helper function to start a standard ContainerSSH instance. It should be used as the outer-most function // and should never be used as an embedding technique. func Main() { @@ -326,8 +323,18 @@ func healthCheck(cfg config.AppConfig, logger log.Logger) error { func printVersion(writer io.Writer) error { var buffer bytes.Buffer - buffer.WriteString("v") - buffer.WriteString(version) + var libcontainersshVersion string + bi, ok := debug.ReadBuildInfo() + if !ok { + return fmt.Errorf("read build info %t", ok) + } + for _, dep := range bi.Deps { + if dep.Path == "go.containerssh.io/libcontainerssh" { + libcontainersshVersion = dep.Version + } + } + buffer.WriteString("libcontainerssh version ") + buffer.WriteString(libcontainersshVersion) buffer.WriteString("\n") if _, err := writer.Write(buffer.Bytes()); err != nil { return fmt.Errorf("failed to write Version information (%w)", err) From 4d5d2dd9dc522bbad8dd13d6bf4af56f5891ffcf Mon Sep 17 00:00:00 2001 From: HyoBin Kim Date: Wed, 28 Feb 2024 18:39:24 +0900 Subject: [PATCH 4/4] [feature] add more buildinfo add more build info debug options revision, goversion.. etc Signed-off-by: HyoBin Kim --- main.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 059b93bb..7e54856a 100644 --- a/main.go +++ b/main.go @@ -323,19 +323,34 @@ func healthCheck(cfg config.AppConfig, logger log.Logger) error { func printVersion(writer io.Writer) error { var buffer bytes.Buffer - var libcontainersshVersion string + var libcontainersshVersion, buildRevision, buildTime, buildArch, buildmodified string bi, ok := debug.ReadBuildInfo() if !ok { return fmt.Errorf("read build info %t", ok) } + fmt.Printf("%+v\n", bi) for _, dep := range bi.Deps { if dep.Path == "go.containerssh.io/libcontainerssh" { libcontainersshVersion = dep.Version + break } } - buffer.WriteString("libcontainerssh version ") - buffer.WriteString(libcontainersshVersion) - buffer.WriteString("\n") + for _, setting := range bi.Settings { + if setting.Key == "vcs.revision" { + buildRevision = setting.Value + } else if setting.Key == "vcs.time" { + buildTime = setting.Value + } else if setting.Key == "GOARCH" { + buildArch = setting.Value + } else if setting.Key == "modified" { + buildmodified = setting.Value + } + } + stringGolangVersion := bi.GoVersion + " - " + buildArch + "\n" + stringLibcontainersshVersion := fmt.Sprintf("libcontainerssh version : %s\n", libcontainersshVersion) + stringBuildRevision := fmt.Sprintf("build revision: %s(%s) {{%s}}\n", buildRevision, buildTime, buildmodified) + stringConcateBuildInfo := stringGolangVersion + stringLibcontainersshVersion + stringBuildRevision + buffer.WriteString(stringConcateBuildInfo) if _, err := writer.Write(buffer.Bytes()); err != nil { return fmt.Errorf("failed to write Version information (%w)", err) }