From 7137f8b2b54793a7ea28753fe3644e5e84fe70ef Mon Sep 17 00:00:00 2001 From: aryansharma9917 Date: Fri, 20 Feb 2026 00:33:39 +0530 Subject: [PATCH 1/5] Add deployment status command to inspect Helm release and pod state --- pkg/deploy/status.go | 71 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 pkg/deploy/status.go diff --git a/pkg/deploy/status.go b/pkg/deploy/status.go new file mode 100644 index 0000000..3246ffb --- /dev/null +++ b/pkg/deploy/status.go @@ -0,0 +1,71 @@ +package deploy + +import ( + "fmt" + "os/exec" + "strings" +) + +func Status(envName string) error { + + environment, err := LoadEnvironment(envName) + if err != nil { + return err + } + + ns := environment.K8s.Namespace + ctx := environment.K8s.Context + release := environment.Helm.Release + + fmt.Println("Deployment Status") + fmt.Println("-----------------") + fmt.Println("Environment:", envName) + fmt.Println("Namespace:", ns) + fmt.Println("Release:", release) + fmt.Println() + + // Helm Status + args := []string{ + "status", + release, + "-n", + ns, + } + + if ctx != "" { + args = append(args, "--kube-context", ctx) + } + + cmd := exec.Command("helm", args...) + out, err := cmd.CombinedOutput() + if err != nil { + fmt.Println("Helm status not available") + } else { + fmt.Println(string(out)) + } + + // Pods + fmt.Println("Pods:") + podArgs := []string{ + "get", + "pods", + "-n", + ns, + "-o", + "wide", + } + + if ctx != "" { + podArgs = append(podArgs, "--context", ctx) + } + + podCmd := exec.Command("kubectl", podArgs...) + podsOut, err := podCmd.CombinedOutput() + if err != nil { + fmt.Println("Unable to fetch pods") + } else { + fmt.Println(strings.TrimSpace(string(podsOut))) + } + + return nil +} From 0175dcd0428d7c2c6750b01e92522e51d1a3eb98 Mon Sep 17 00:00:00 2001 From: aryansharma9917 Date: Fri, 20 Feb 2026 00:33:45 +0530 Subject: [PATCH 2/5] Expose deploy status subcommand in CLI --- cmd/deploy_status.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 cmd/deploy_status.go diff --git a/cmd/deploy_status.go b/cmd/deploy_status.go new file mode 100644 index 0000000..0edb68a --- /dev/null +++ b/cmd/deploy_status.go @@ -0,0 +1,28 @@ +package cmd + +import ( + "fmt" + + "github.com/aryansharma9917/codewise-cli/pkg/deploy" + "github.com/spf13/cobra" +) + +var statusEnv string + +var deployStatusCmd = &cobra.Command{ + Use: "status", + Short: "Show deployment status for an environment", + RunE: func(cmd *cobra.Command, args []string) error { + + if statusEnv == "" { + return fmt.Errorf("please provide --env") + } + + return deploy.Status(statusEnv) + }, +} + +func init() { + deployCmd.AddCommand(deployStatusCmd) + deployStatusCmd.Flags().StringVar(&statusEnv, "env", "", "Environment name") +} From ba9a343a30351e4f4132b77b5d3b58f3a5b8effb Mon Sep 17 00:00:00 2001 From: aryansharma9917 Date: Fri, 20 Feb 2026 00:40:42 +0530 Subject: [PATCH 3/5] Add Helm rollback support with rollout verification --- pkg/deploy/rollback.go | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 pkg/deploy/rollback.go diff --git a/pkg/deploy/rollback.go b/pkg/deploy/rollback.go new file mode 100644 index 0000000..11419c9 --- /dev/null +++ b/pkg/deploy/rollback.go @@ -0,0 +1,49 @@ +package deploy + +import ( + "fmt" + "os/exec" +) + +func Rollback(envName string, revision int) error { + + environment, err := LoadEnvironment(envName) + if err != nil { + return err + } + + ns := environment.K8s.Namespace + ctx := environment.K8s.Context + release := environment.Helm.Release + + fmt.Println("Starting rollback...") + fmt.Println("Environment:", envName) + fmt.Println("Release:", release) + fmt.Println("Revision:", revision) + fmt.Println() + + args := []string{ + "rollback", + release, + fmt.Sprintf("%d", revision), + "-n", + ns, + } + + if ctx != "" { + args = append(args, "--kube-context", ctx) + } + + cmd := exec.Command("helm", args...) + cmd.Stdout = nil + cmd.Stderr = nil + + if err := cmd.Run(); err != nil { + return fmt.Errorf("rollback failed") + } + + fmt.Println("Rollback executed successfully.") + fmt.Println("Verifying rollout...") + + return MonitorRollout(environment) +} From 8b214aded3b8877a1673a069f9e8550bae037c2a Mon Sep 17 00:00:00 2001 From: aryansharma9917 Date: Fri, 20 Feb 2026 00:40:48 +0530 Subject: [PATCH 4/5] Expose deploy rollback subcommand --- cmd/deploy_rollback.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 cmd/deploy_rollback.go diff --git a/cmd/deploy_rollback.go b/cmd/deploy_rollback.go new file mode 100644 index 0000000..6f57816 --- /dev/null +++ b/cmd/deploy_rollback.go @@ -0,0 +1,34 @@ +package cmd + +import ( + "fmt" + + "github.com/aryansharma9917/codewise-cli/pkg/deploy" + "github.com/spf13/cobra" +) + +var rollbackEnv string +var rollbackRevision int + +var deployRollbackCmd = &cobra.Command{ + Use: "rollback", + Short: "Rollback a deployment to a previous Helm revision", + RunE: func(cmd *cobra.Command, args []string) error { + + if rollbackEnv == "" { + return fmt.Errorf("please provide --env") + } + + if rollbackRevision <= 0 { + return fmt.Errorf("please provide a valid --revision") + } + + return deploy.Rollback(rollbackEnv, rollbackRevision) + }, +} + +func init() { + deployCmd.AddCommand(deployRollbackCmd) + deployRollbackCmd.Flags().StringVar(&rollbackEnv, "env", "", "Environment name") + deployRollbackCmd.Flags().IntVar(&rollbackRevision, "revision", 0, "Helm revision to rollback to") +} From 512c682b9bbd5076e6b9b7c4e211c0728ab8a2ab Mon Sep 17 00:00:00 2001 From: aryansharma9917 Date: Fri, 20 Feb 2026 00:43:52 +0530 Subject: [PATCH 5/5] Update deployment replicas to create new Helm revision for rollback testing --- helm/chart/templates/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/chart/templates/deployment.yaml b/helm/chart/templates/deployment.yaml index 03b19c0..20e1eb5 100644 --- a/helm/chart/templates/deployment.yaml +++ b/helm/chart/templates/deployment.yaml @@ -6,7 +6,7 @@ metadata: app: {{ .Release.Name }} spec: - replicas: 1 + replicas: 2 selector: matchLabels: