diff --git a/README-zh.md b/README-zh.md index 795db69fa423a8885d43a15c68882122b3e27b5e..ca34bcaa5cc82f275868c5823280fcd27ee8b0d7 100644 --- a/README-zh.md +++ b/README-zh.md @@ -1,6 +1,7 @@ # Jenkins CLI [![Go Report Card](https://goreportcard.com/badge/jenkins-zh/jenkins-cli)](https://goreportcard.com/report/jenkins-zh/jenkins-cli) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=jenkins-zh_jenkins-cli&metric=alert_status)](https://sonarcloud.io/dashboard?id=jenkins-zh_jenkins-cli) Jenkins CLI 可以帮忙你轻松地管理 Jenkins。不管你是一名插件开发者、管理员或者只是一个普通的 Jenkins 用户,它都是为你而生的! diff --git a/README.md b/README.md index 30acc2779f47d936093360de06a4c2ff36f6fb75..3a553a37cc5c43dc2899b32da0ab90eab5f0a04b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Jenkins CLI [![Go Report Card](https://goreportcard.com/badge/jenkins-zh/jenkins-cli)](https://goreportcard.com/report/jenkins-zh/jenkins-cli) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=jenkins-zh_jenkins-cli&metric=alert_status)](https://sonarcloud.io/dashboard?id=jenkins-zh_jenkins-cli) Jenkins CLI allows you manage your Jenkins as an easy way. No matter you're a plugin developer, administrator or just a regular user, it borns for you! diff --git a/app/cmd/config_test.go b/app/cmd/config_test.go new file mode 100644 index 0000000000000000000000000000000000000000..0019d36ec2713744faf27907125240633e261684 --- /dev/null +++ b/app/cmd/config_test.go @@ -0,0 +1,55 @@ +package cmd + +import ( + "github.com/golang/mock/gomock" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Table util test", func() { + var ( + ctrl *gomock.Controller + ) + + BeforeEach(func() { + ctrl = gomock.NewController(GinkgoT()) + config = nil + }) + + AfterEach(func() { + config = nil + ctrl.Finish() + }) + + Context("basic test", func() { + It("getJenkinsNames", func() { + config = &Config{ + JenkinsServers: []JenkinsServer{JenkinsServer{ + Name: "a", + }, JenkinsServer{ + Name: "b", + }}, + } + + names := getJenkinsNames() + Expect(names).To(Equal([]string{"a", "b"})) + + config.JenkinsServers = []JenkinsServer{} + names = getJenkinsNames() + Expect(names).To(Equal([]string{})) + }) + + It("getCurrentJenkins", func() { + config = &Config{} + current := getCurrentJenkins() + Expect(current).To(BeNil()) + + config.Current = "test" + config.JenkinsServers = []JenkinsServer{JenkinsServer{ + Name: "test", + }} + current = getCurrentJenkins() + Expect(current).To(Equal(&config.JenkinsServers[0])) + }) + }) +}) diff --git a/app/cmd/plugin_upload.go b/app/cmd/plugin_upload.go index df8a483d3a3d8fa225c8d5ed819c10ebe8ee1b1c..4611a2df057d8691cd0ac2e2e61d8063f245447f 100644 --- a/app/cmd/plugin_upload.go +++ b/app/cmd/plugin_upload.go @@ -70,7 +70,7 @@ var pluginUploadCmd = &cobra.Command{ log.Fatal(err) } } else if len(args) == 0 { - executePreCmd(cmd, args) + executePreCmd(cmd, args, os.Stdout) path, _ := os.Getwd() dirName := filepath.Base(path) diff --git a/app/cmd/root.go b/app/cmd/root.go index aa746bb634fa546aa8f66b784fa83d27718884dd..c3f13fbe12607b2486ed4d4fdd6c19a9513b67f9 100644 --- a/app/cmd/root.go +++ b/app/cmd/root.go @@ -2,6 +2,7 @@ package cmd import ( "fmt" + "io" "log" "os" "os/exec" @@ -99,10 +100,10 @@ func getCmdPath(cmd *cobra.Command) string { return "" } -func executePreCmd(cmd *cobra.Command, _ []string) { +func executePreCmd(cmd *cobra.Command, _ []string, writer io.Writer) (err error) { config := getConfig() if config == nil { - log.Fatal("Cannot find config file") + err = fmt.Errorf("Cannot find config file") return } @@ -112,15 +113,17 @@ func executePreCmd(cmd *cobra.Command, _ []string) { continue } - execute(preHook.Command) + if err = execute(preHook.Command, writer); err != nil { + return + } } + return } -func execute(command string) { +func execute(command string, writer io.Writer) (err error) { array := strings.Split(command, " ") cmd := exec.Command(array[0], array[1:]...) - cmd.Stdout = os.Stdout - if err := cmd.Run(); err != nil { - log.Fatal(err) - } + cmd.Stdout = writer + err = cmd.Run() + return } diff --git a/app/cmd/root_test.go b/app/cmd/root_test.go index 0ba89208c18ef9a479f85e9794c13f28caef8d2e..4134c8431d3e698c2d6fa7847d6206cd1f56dab5 100644 --- a/app/cmd/root_test.go +++ b/app/cmd/root_test.go @@ -1,6 +1,8 @@ package cmd import ( + "bytes" + "github.com/golang/mock/gomock" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -9,16 +11,22 @@ import ( var _ = Describe("Root cmd test", func() { var ( - ctrl *gomock.Controller - rootCmd *cobra.Command + ctrl *gomock.Controller + rootCmd *cobra.Command + successCmd string + errorCmd string ) BeforeEach(func() { ctrl = gomock.NewController(GinkgoT()) rootCmd = &cobra.Command{Use: "root"} + successCmd = "echo 1" + errorCmd = "exit 1" + config = nil }) AfterEach(func() { + config = nil ctrl.Finish() }) @@ -52,4 +60,108 @@ var _ = Describe("Root cmd test", func() { Expect(path).To(Equal("sub1.sub2")) }) }) + + Context("execute cmd test", func() { + It("basic command", func() { + var buf bytes.Buffer + err := execute(successCmd, &buf) + + Expect(buf.String()).To(Equal("1\n")) + Expect(err).To(BeNil()) + }) + + It("error command", func() { + var buf bytes.Buffer + err := execute(errorCmd, &buf) + + Expect(err).To(HaveOccurred()) + }) + }) + + Context("execute pre cmd", func() { + It("should error", func() { + err := executePreCmd(nil, nil, nil) + Expect(err).To(HaveOccurred()) + }) + + It("basic use case with one preHook, should success", func() { + config = &Config{ + PreHooks: []PreHook{PreHook{ + Path: "test", + Command: successCmd, + }}, + } + + rootCmd := &cobra.Command{} + subCmd := &cobra.Command{ + Use: "test", + } + rootCmd.AddCommand(subCmd) + + var buf bytes.Buffer + err := executePreCmd(subCmd, nil, &buf) + Expect(err).To(BeNil()) + Expect(buf.String()).To(Equal("1\n")) + }) + + It("basic use case with many preHooks, should success", func() { + config = &Config{ + PreHooks: []PreHook{PreHook{ + Path: "test", + Command: successCmd, + }, PreHook{ + Path: "test", + Command: "echo 2", + }, PreHook{ + Path: "fake", + Command: successCmd, + }}, + } + + rootCmd := &cobra.Command{} + subCmd := &cobra.Command{ + Use: "test", + } + rootCmd.AddCommand(subCmd) + + var buf bytes.Buffer + err := executePreCmd(subCmd, nil, &buf) + Expect(err).To(BeNil()) + Expect(buf.String()).To(Equal("1\n2\n")) + }) + + It("basic use case without preHooks, should success", func() { + config = &Config{} + + rootCmd := &cobra.Command{} + subCmd := &cobra.Command{ + Use: "test", + } + rootCmd.AddCommand(subCmd) + + var buf bytes.Buffer + err := executePreCmd(subCmd, nil, &buf) + Expect(err).To(BeNil()) + Expect(buf.String()).To(Equal("")) + }) + + It("basic use case with error command, should success", func() { + config = &Config{ + PreHooks: []PreHook{PreHook{ + Path: "test", + Command: errorCmd, + }}, + } + + rootCmd := &cobra.Command{} + subCmd := &cobra.Command{ + Use: "test", + } + rootCmd.AddCommand(subCmd) + + var buf bytes.Buffer + err := executePreCmd(subCmd, nil, &buf) + Expect(err).To(HaveOccurred()) + }) + }) }) diff --git a/sonar-project.properties b/sonar-project.properties index 137c07e0cdbb8690c84a434178cb430b392c5d9b..025f1361b13dfb119ca046571e5b0fdbbe8de498 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -9,3 +9,5 @@ sonar.sources=. # Encoding of the source code. Default is default system encoding #sonar.sourceEncoding=UTF-8 + +sonar.go.exclusions=**/vendor/**,**/**/*_test.go diff --git a/util/table_test.go b/util/table_test.go index 1e89f2e7526ac26eb1db81f1b38e9021bb8a381b..d5a194bbbefcc6bd35e5a21d01b7e54ebd55aff3 100644 --- a/util/table_test.go +++ b/util/table_test.go @@ -106,4 +106,24 @@ var _ = Describe("Table util test", func() { Expect(buffer.String()).To(Equal(comp)) }) }) + + Context("basic function", func() { + It("shoud success", func() { + var buffer bytes.Buffer + table := CreateTable(&buffer) + + table.Render() + Expect(buffer.String()).To(Equal("")) + + table.AddRow("fake") + buffer.Reset() + table.Render() + Expect(buffer.String()).To(Equal("fake\n")) + + table.Clear() + buffer.Reset() + table.Render() + Expect(buffer.String()).To(Equal("")) + }) + }) })