From f7b59d21ac444fdd3d6a1a156df98cfb61103fe6 Mon Sep 17 00:00:00 2001 From: Carlos Alvarez Date: Sun, 21 Dec 2025 14:45:53 -0300 Subject: [PATCH 1/7] feat: adicionar flag `tag` para o comando `girus create cluster` --- cmd/create.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/create.go b/cmd/create.go index fdff4fd..866755d 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -17,6 +17,7 @@ import ( "github.com/badtuxx/girus-cli/internal/lab" "github.com/badtuxx/girus-cli/internal/repo" "github.com/badtuxx/girus-cli/internal/templates" + "github.com/badtuxx/girus-cli/utils" "github.com/fatih/color" "github.com/spf13/cobra" ) @@ -30,6 +31,7 @@ var ( skipPortForward bool skipBrowser bool repoIndexURL string + tag string ) var createCmd = &cobra.Command{ @@ -871,6 +873,7 @@ func init() { createClusterCmd.Flags().BoolVarP(&verboseMode, "verbose", "v", false, "Modo detalhado com output completo em vez da barra de progresso") createClusterCmd.Flags().BoolVarP(&skipPortForward, "skip-port-forward", "", false, "Não perguntar sobre configurar port-forwarding") createClusterCmd.Flags().BoolVarP(&skipBrowser, "skip-browser", "", false, "Não abrir o navegador automaticamente") + createClusterCmd.Flags().StringVar(&tag, "tag", "latest", "Define quais tags do frontend e backend serão usadas na criação do cluster") createClusterCmd.Flags().StringVarP(&containerEngine, "container-engine", "e", "docker", "Engine de container (docker ou podman)") From 13ece1f4721276beec9a99b958ee2957fbba0bd4 Mon Sep 17 00:00:00 2001 From: Carlos Alvarez Date: Sun, 21 Dec 2025 14:47:21 -0300 Subject: [PATCH 2/7] =?UTF-8?q?chore:=20Simplificar=20comandos=20que=20n?= =?UTF-8?q?=C3=A3o=20tem=20shorthands?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/create.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index 866755d..678d5ad 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -871,8 +871,8 @@ func init() { // Flags para createClusterCmd createClusterCmd.Flags().StringVarP(&deployFile, "file", "f", "", "Arquivo YAML para deployment do Girus (opcional)") createClusterCmd.Flags().BoolVarP(&verboseMode, "verbose", "v", false, "Modo detalhado com output completo em vez da barra de progresso") - createClusterCmd.Flags().BoolVarP(&skipPortForward, "skip-port-forward", "", false, "Não perguntar sobre configurar port-forwarding") - createClusterCmd.Flags().BoolVarP(&skipBrowser, "skip-browser", "", false, "Não abrir o navegador automaticamente") + createClusterCmd.Flags().BoolVar(&skipPortForward, "skip-port-forward", false, "Não perguntar sobre configurar port-forwarding") + createClusterCmd.Flags().BoolVar(&skipBrowser, "skip-browser", false, "Não abrir o navegador automaticamente") createClusterCmd.Flags().StringVar(&tag, "tag", "latest", "Define quais tags do frontend e backend serão usadas na criação do cluster") createClusterCmd.Flags().StringVarP(&containerEngine, "container-engine", "e", "docker", "Engine de container (docker ou podman)") From 73248a8411752fc04c492b85c4c7d3481491d302 Mon Sep 17 00:00:00 2001 From: Carlos Alvarez Date: Sun, 21 Dec 2025 14:47:44 -0300 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20criar=20pacote=20`utils`=20com=20es?= =?UTF-8?q?pecifica=C3=A7=C3=A3o=20para=20deployments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/deployments.go | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 utils/deployments.go diff --git a/utils/deployments.go b/utils/deployments.go new file mode 100644 index 0000000..716366d --- /dev/null +++ b/utils/deployments.go @@ -0,0 +1,11 @@ +package utils + +type deployment struct { + Name string + ContainerName string + DockerHubImage string +} + +var Deployments = []deployment{ + {Name: "deployment/girus-frontend", ContainerName: "frontend", DockerHubImage: "linuxtips/girus-frontend"}, + {Name: "deployment/girus-backend", ContainerName: "backend", DockerHubImage: "linuxtips/girus-backend"}} From 6ecb511773a45d40f0437b401a851b41ce177752 Mon Sep 17 00:00:00 2001 From: Carlos Alvarez Date: Sun, 21 Dec 2025 14:51:21 -0300 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20criar=20fun=C3=A7=C3=A3o=20para=20a?= =?UTF-8?q?tualizar=20imagens=20dos=20deployments=20"girus-frontend"=20e?= =?UTF-8?q?=20"girus-backend"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/create.go | 17 +++++++++++++++++ internal/k8s/k8s.go | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/cmd/create.go b/cmd/create.go index 678d5ad..d1ce2cf 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -42,6 +42,19 @@ var createCmd = &cobra.Command{ }, } +func setDeploymentTag(tag string, verboseMode bool) error { + fmt.Println(headerColor("Sobreescrevendo imagem dos deployments")) + + for _, deploy := range utils.Deployments { + image := fmt.Sprintf("%s:%s", deploy.DockerHubImage, tag) + if err := k8s.UpdateContainerImage("girus", deploy.Name, deploy.ContainerName, image, verboseMode); err != nil { + return err + } + } + + return nil +} + var createClusterCmd = &cobra.Command{ Use: "cluster", Short: "Cria o cluster Girus", @@ -700,6 +713,10 @@ Por padrão, o deployment embutido no binário é utilizado.`, } } + if err := setDeploymentTag(tag, verboseMode); err != nil { + fmt.Println(err) + os.Exit(1) + } // Reiniciar o backend para carregar os templates fmt.Println("\n" + headerColor(common.T("Reiniciando o backend para carregar os templates...", "Reiniciando el backend para cargar las plantillas..."))) restartCmd := exec.Command("kubectl", "rollout", "restart", "deployment/girus-backend", "-n", "girus") diff --git a/internal/k8s/k8s.go b/internal/k8s/k8s.go index 15720e4..bea518c 100644 --- a/internal/k8s/k8s.go +++ b/internal/k8s/k8s.go @@ -26,6 +26,7 @@ import ( var ( green = color.New(color.FgGreen).SprintFunc() bold = color.New(color.Bold).SprintFunc() + k = "kubectl" ) // KubernetesClient wraper do cliente Kubernetes @@ -356,6 +357,23 @@ func (k *KubernetesClient) CreateDeployment(ctx context.Context, namespace, name return nil } +// Atualiza imagem de um container específico dentro de um deployment. +func UpdateContainerImage(namespace, deployment, containerName, image string, verboseMode bool) error { + updateArgs := []string{"set", "image", deployment, fmt.Sprintf("%s=%s", containerName, image), "-n", namespace} + commandString := fmt.Sprint(strings.Join(updateArgs, " ")) + if verboseMode { + fmt.Printf("Executando comando %s %s\n", k, commandString) + } + + kubectlUpdateCmd := exec.Command(k, updateArgs...) + var stderr bytes.Buffer + kubectlUpdateCmd.Stderr = &stderr + if err := kubectlUpdateCmd.Run(); err != nil { + return fmt.Errorf("falha ao reiniciar deployment [%s] no namespace [%s]: %s", deployment, namespace, stderr.String()) + } + return nil +} + // waitForPodsReady espera até que os pods do Girus (backend e frontend) estejam prontos func WaitForPodsReady(namespace string, timeout time.Duration) error { // Criar formatadores de cores From 55c3b20d77f9296fb980fe26384da667ef69154d Mon Sep 17 00:00:00 2001 From: Carlos Alvarez Date: Sun, 21 Dec 2025 17:32:47 -0300 Subject: [PATCH 5/7] fix: atualizar mensagem de erro --- internal/k8s/k8s.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/k8s/k8s.go b/internal/k8s/k8s.go index bea518c..9f30177 100644 --- a/internal/k8s/k8s.go +++ b/internal/k8s/k8s.go @@ -369,7 +369,7 @@ func UpdateContainerImage(namespace, deployment, containerName, image string, ve var stderr bytes.Buffer kubectlUpdateCmd.Stderr = &stderr if err := kubectlUpdateCmd.Run(); err != nil { - return fmt.Errorf("falha ao reiniciar deployment [%s] no namespace [%s]: %s", deployment, namespace, stderr.String()) + return fmt.Errorf("falha ao atualizar imagem do deployment [%s] no namespace [%s]: %s", deployment, namespace, stderr.String()) } return nil } From 3a03a9ce1ef48e4e711132e48f5af807b1f80d38 Mon Sep 17 00:00:00 2001 From: Carlos Alvarez Date: Mon, 5 Jan 2026 21:55:06 -0300 Subject: [PATCH 6/7] =?UTF-8?q?chore:=20n=C3=A3o=20atualizar=20imagens=20q?= =?UTF-8?q?ue=20j=C3=A1=20est=C3=A3o=20na=20"latest"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/create.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/create.go b/cmd/create.go index d1ce2cf..417b804 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -44,6 +44,9 @@ var createCmd = &cobra.Command{ func setDeploymentTag(tag string, verboseMode bool) error { fmt.Println(headerColor("Sobreescrevendo imagem dos deployments")) + if tag == "latest" { + return nil + } for _, deploy := range utils.Deployments { image := fmt.Sprintf("%s:%s", deploy.DockerHubImage, tag) From 813a0be97f1bad21443325c31f59a27e9db27cad Mon Sep 17 00:00:00 2001 From: Carlos Alvarez Date: Mon, 5 Jan 2026 21:55:32 -0300 Subject: [PATCH 7/7] feat: criar flags para tags do backend e frontend --- cmd/create.go | 27 +++++++++++++++++---------- utils/deployments.go | 9 +++++---- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index 417b804..4fd50c7 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -31,7 +31,8 @@ var ( skipPortForward bool skipBrowser bool repoIndexURL string - tag string + frontendTag string + backendTag string ) var createCmd = &cobra.Command{ @@ -42,17 +43,14 @@ var createCmd = &cobra.Command{ }, } -func setDeploymentTag(tag string, verboseMode bool) error { - fmt.Println(headerColor("Sobreescrevendo imagem dos deployments")) +func setDeploymentTag(tag string, deployment utils.DeploymentMap, verboseMode bool) error { if tag == "latest" { return nil } - for _, deploy := range utils.Deployments { - image := fmt.Sprintf("%s:%s", deploy.DockerHubImage, tag) - if err := k8s.UpdateContainerImage("girus", deploy.Name, deploy.ContainerName, image, verboseMode); err != nil { - return err - } + image := fmt.Sprintf("%s:%s", deployment.DockerHubImage, tag) + if err := k8s.UpdateContainerImage("girus", deployment.Name, deployment.ContainerName, image, verboseMode); err != nil { + return err } return nil @@ -716,7 +714,15 @@ Por padrão, o deployment embutido no binário é utilizado.`, } } - if err := setDeploymentTag(tag, verboseMode); err != nil { + fmt.Println(headerColor("Sobreescrevendo imagem dos deployments...")) + backendDeployment := utils.Deployments["backend"] + if err := setDeploymentTag(backendTag, backendDeployment, verboseMode); err != nil { + fmt.Println(err) + os.Exit(1) + } + + frontendDeployment := utils.Deployments["frontend"] + if err := setDeploymentTag(frontendTag, frontendDeployment, verboseMode); err != nil { fmt.Println(err) os.Exit(1) } @@ -893,7 +899,8 @@ func init() { createClusterCmd.Flags().BoolVarP(&verboseMode, "verbose", "v", false, "Modo detalhado com output completo em vez da barra de progresso") createClusterCmd.Flags().BoolVar(&skipPortForward, "skip-port-forward", false, "Não perguntar sobre configurar port-forwarding") createClusterCmd.Flags().BoolVar(&skipBrowser, "skip-browser", false, "Não abrir o navegador automaticamente") - createClusterCmd.Flags().StringVar(&tag, "tag", "latest", "Define quais tags do frontend e backend serão usadas na criação do cluster") + createClusterCmd.Flags().StringVar(&frontendTag, "frontend-tag", "latest", "Define tag do frontend a ser usada na criação do cluster") + createClusterCmd.Flags().StringVar(&backendTag, "backend-tag", "latest", "Define tag do backend a ser usada na criação do cluster") createClusterCmd.Flags().StringVarP(&containerEngine, "container-engine", "e", "docker", "Engine de container (docker ou podman)") diff --git a/utils/deployments.go b/utils/deployments.go index 716366d..2444a88 100644 --- a/utils/deployments.go +++ b/utils/deployments.go @@ -1,11 +1,12 @@ package utils -type deployment struct { +type DeploymentMap struct { Name string ContainerName string DockerHubImage string } -var Deployments = []deployment{ - {Name: "deployment/girus-frontend", ContainerName: "frontend", DockerHubImage: "linuxtips/girus-frontend"}, - {Name: "deployment/girus-backend", ContainerName: "backend", DockerHubImage: "linuxtips/girus-backend"}} +var Deployments = map[string]DeploymentMap{ + "frontend": {Name: "deployment/girus-frontend", ContainerName: "frontend", DockerHubImage: "linuxtips/girus-frontend"}, + "backend": {Name: "deployment/girus-backend", ContainerName: "backend", DockerHubImage: "linuxtips/girus-backend"}, +}