未验证 提交 c0000947 编写于 作者: LinuxSuRen's avatar LinuxSuRen 提交者: GitHub

Add support to open browser with a specific one (#377)

* Add support to open browser with a specific one

* Fix the test errors

* Add auto completion for browser

* Add the missing coverage file
上级 6f50c60a
FROM alpine:3.3
RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories
RUN apk add --no-cache ca-certificates curl
RUN curl -L https://github.com/jenkins-zh/jenkins-cli/releases/download/v0.0.23/jcli-darwin-amd64.tar.gz|tar xzv && \
mv jcli /usr/local/bin/ && \
curl -L https://github.com/jenkins-zh/jenkins-cli/releases/download/v0.0.23/jcli-darwin-amd64.txt -o jcli-darwin-amd64.txt
FROM alpine:3.3
COPY bin bin
RUN ln -s bin/linux/jcli /usr/local/bin/jcli
ENTRYPOINT ["jcli"]
FROM alpine:3.3
RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories
RUN apk add --no-cache ca-certificates curl
RUN curl -L https://github.com/jenkins-zh/jenkins-cli/releases/download/v0.0.23/jcli-windows-386.tar.gz|tar xzv && \
mv jcli.exe /usr/local/bin/jcli.exe && \
curl -L https://github.com/jenkins-zh/jenkins-cli/releases/download/v0.0.23/jcli-windows-386.txt -o jcli-windows-386.txt
...@@ -75,7 +75,10 @@ go-bindata-download-darwin: ...@@ -75,7 +75,10 @@ go-bindata-download-darwin:
gen-data-darwin: go-bindata-download-darwin gen-data-darwin: go-bindata-download-darwin
cd app/i18n && ../../bin/go-bindata -o bindata.go -pkg i18n jcli/zh_CN/LC_MESSAGES/ cd app/i18n && ../../bin/go-bindata -o bindata.go -pkg i18n jcli/zh_CN/LC_MESSAGES/
verify: dep tools verify: dep tools lint
lint:
go vet ./... go vet ./...
golint -set_exit_status app/cmd/... golint -set_exit_status app/cmd/...
golint -set_exit_status app/helper/... golint -set_exit_status app/helper/...
...@@ -92,12 +95,12 @@ fmt: ...@@ -92,12 +95,12 @@ fmt:
test: test:
mkdir -p bin mkdir -p bin
go test ./util -v -count=1 go test ./util -v -count=1
go test ./client -v -count=1 -coverprofile coverage.out
go test ./app -v -count=1 go test ./app -v -count=1
go test ./app/cmd -v -count=1
go test ./app/health -v -count=1 go test ./app/health -v -count=1
go test ./app/helper -v -count=1 go test ./app/helper -v -count=1
go test ./app/i18n -v -count=1 go test ./app/i18n -v -count=1
go test ./client -v -count=1 go test ./app/cmd -v -count=1
dep: dep:
go get github.com/AlecAivazis/survey/v2 go get github.com/AlecAivazis/survey/v2
......
...@@ -2,6 +2,7 @@ package cmd ...@@ -2,6 +2,7 @@ package cmd
import ( import (
"fmt" "fmt"
"os"
"github.com/jenkins-zh/jenkins-cli/app/i18n" "github.com/jenkins-zh/jenkins-cli/app/i18n"
...@@ -12,21 +13,37 @@ import ( ...@@ -12,21 +13,37 @@ import (
// CASCOpenOption is the option of casc open cmd // CASCOpenOption is the option of casc open cmd
type CASCOpenOption struct { type CASCOpenOption struct {
ExecContext util.ExecContext ExecContext util.ExecContext
Browser string
} }
var cascOpenOption CASCOpenOption var cascOpenOption CASCOpenOption
func init() { func init() {
cascCmd.AddCommand(cascOpenCmd) cascCmd.AddCommand(cascOpenCmd)
cascOpenCmd.Flags().StringVarP(&cascOpenOption.Browser, "browser", "b", "",
i18n.T("Open Jenkins with a specific browser"))
} }
var cascOpenCmd = &cobra.Command{ var cascOpenCmd = &cobra.Command{
Use: "open", Use: "open",
Short: i18n.T("Open Configuration as Code page in browser"), Short: i18n.T("Open Configuration as Code page in browser"),
Long: i18n.T("Open Configuration as Code page in browser"), Long: i18n.T("Open Configuration as Code page in browser"),
RunE: func(_ *cobra.Command, _ []string) error { PreRun: func(_ *cobra.Command, _ []string) {
jenkins := getCurrentJenkinsFromOptionsOrDie() if cascOpenOption.Browser == "" {
return util.Open(fmt.Sprintf("%s/configuration-as-code", jenkins.URL), cascOpenOption.ExecContext) cascOpenOption.Browser = os.Getenv("BROWSER")
}
},
RunE: func(_ *cobra.Command, _ []string) (err error) {
jenkins := getCurrentJenkinsFromOptions()
if jenkins == nil {
err = fmt.Errorf("cannot found Jenkins by %s", rootOptions.Jenkins)
return
}
browser := cascOpenOption.Browser
err = util.Open(fmt.Sprintf("%s/configuration-as-code", jenkins.URL), browser, cascOpenOption.ExecContext)
return
}, },
Annotations: map[string]string{ Annotations: map[string]string{
since: "v0.0.24", since: "v0.0.24",
......
...@@ -305,6 +305,7 @@ type HookOption struct { ...@@ -305,6 +305,7 @@ type HookOption struct {
SkipPostHook bool SkipPostHook bool
} }
// Deprecated, please replace this with getCurrentJenkinsAndClient
func getCurrentJenkinsAndClientOrDie(jclient *client.JenkinsCore) (jenkins *JenkinsServer) { func getCurrentJenkinsAndClientOrDie(jclient *client.JenkinsCore) (jenkins *JenkinsServer) {
jenkins = getCurrentJenkinsFromOptionsOrDie() jenkins = getCurrentJenkinsFromOptionsOrDie()
jclient.URL = jenkins.URL jclient.URL = jenkins.URL
......
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"github.com/jenkins-zh/jenkins-cli/app/i18n" "github.com/jenkins-zh/jenkins-cli/app/i18n"
"github.com/jenkins-zh/jenkins-cli/util" "github.com/jenkins-zh/jenkins-cli/util"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"os"
) )
// OpenOption is the open cmd option // OpenOption is the open cmd option
...@@ -12,6 +13,8 @@ type OpenOption struct { ...@@ -12,6 +13,8 @@ type OpenOption struct {
CommonOption CommonOption
InteractiveOption InteractiveOption
Browser string
Config bool Config bool
} }
...@@ -21,8 +24,17 @@ func init() { ...@@ -21,8 +24,17 @@ func init() {
rootCmd.AddCommand(openCmd) rootCmd.AddCommand(openCmd)
openCmd.Flags().BoolVarP(&openOption.Config, "config", "c", false, openCmd.Flags().BoolVarP(&openOption.Config, "config", "c", false,
i18n.T("Open the configuration page of Jenkins")) i18n.T("Open the configuration page of Jenkins"))
openCmd.Flags().StringVarP(&openOption.Browser, "browser", "b", "",
i18n.T("Open Jenkins with a specific browser"))
openOption.SetFlag(openCmd) openOption.SetFlag(openCmd)
openOption.Stdio = GetSystemStdio() openOption.Stdio = GetSystemStdio()
err := openCmd.RegisterFlagCompletionFunc("browser", func(cmd *cobra.Command, args []string, toComplete string) (strings []string, directive cobra.ShellCompDirective) {
return []string{"Google-Chrome", "Safari", "Microsoft-Edge", "Firefox"}, cobra.ShellCompDirectiveDefault
})
if err != nil {
rootCmd.Println(err)
}
} }
var openCmd = &cobra.Command{ var openCmd = &cobra.Command{
...@@ -30,6 +42,11 @@ var openCmd = &cobra.Command{ ...@@ -30,6 +42,11 @@ var openCmd = &cobra.Command{
Short: i18n.T("Open your Jenkins with a browser"), Short: i18n.T("Open your Jenkins with a browser"),
Long: i18n.T(`Open your Jenkins with a browser`), Long: i18n.T(`Open your Jenkins with a browser`),
Example: `jcli open -n [config name]`, Example: `jcli open -n [config name]`,
PreRun: func(_ *cobra.Command, _ []string) {
if openOption.Browser == "" {
openOption.Browser = os.Getenv("BROWSER")
}
},
RunE: func(_ *cobra.Command, args []string) (err error) { RunE: func(_ *cobra.Command, args []string) (err error) {
var jenkins *JenkinsServer var jenkins *JenkinsServer
...@@ -56,7 +73,8 @@ var openCmd = &cobra.Command{ ...@@ -56,7 +73,8 @@ var openCmd = &cobra.Command{
if openOption.Config { if openOption.Config {
url = fmt.Sprintf("%s/configure", url) url = fmt.Sprintf("%s/configure", url)
} }
err = util.Open(url, openOption.ExecContext) browser := openOption.Browser
err = util.Open(url, browser, openOption.ExecContext)
} else { } else {
err = fmt.Errorf("no URL found with Jenkins %s", configName) err = fmt.Errorf("no URL found with Jenkins %s", configName)
} }
......
...@@ -2,6 +2,8 @@ package cmd ...@@ -2,6 +2,8 @@ package cmd
import ( import (
"fmt" "fmt"
"github.com/jenkins-zh/jenkins-cli/app/i18n"
"os"
"github.com/jenkins-zh/jenkins-cli/util" "github.com/jenkins-zh/jenkins-cli/util"
"github.com/spf13/cobra" "github.com/spf13/cobra"
...@@ -10,23 +12,37 @@ import ( ...@@ -10,23 +12,37 @@ import (
// PluginOpenOption is the option of plugin open cmd // PluginOpenOption is the option of plugin open cmd
type PluginOpenOption struct { type PluginOpenOption struct {
ExecContext util.ExecContext ExecContext util.ExecContext
Browser string
} }
var pluginOpenOption PluginOpenOption var pluginOpenOption PluginOpenOption
func init() { func init() {
pluginCmd.AddCommand(pluginOpenCmd) pluginCmd.AddCommand(pluginOpenCmd)
pluginOpenCmd.Flags().StringVarP(&pluginOpenOption.Browser, "browser", "b", "",
i18n.T("Open Jenkins with a specific browser"))
} }
var pluginOpenCmd = &cobra.Command{ var pluginOpenCmd = &cobra.Command{
Use: "open", Use: "open",
Short: "Open update center server in browser", Short: "Open update center server in browser",
Long: `Open update center server in browser`, Long: `Open update center server in browser`,
PreRun: func(_ *cobra.Command, _ []string) {
if pluginOpenOption.Browser == "" {
pluginOpenOption.Browser = os.Getenv("BROWSER")
}
},
RunE: func(_ *cobra.Command, _ []string) (err error) { RunE: func(_ *cobra.Command, _ []string) (err error) {
jenkins := getCurrentJenkinsFromOptionsOrDie() jenkins := getCurrentJenkinsFromOptions()
if jenkins == nil {
err = fmt.Errorf("cannot found Jenkins by %s", rootOptions.Jenkins)
return
}
if jenkins.URL != "" { if jenkins.URL != "" {
err = util.Open(fmt.Sprintf("%s/pluginManager", jenkins.URL), pluginOpenOption.ExecContext) browser := pluginOpenOption.Browser
err = util.Open(fmt.Sprintf("%s/pluginManager", jenkins.URL), browser, pluginOpenOption.ExecContext)
} else { } else {
err = fmt.Errorf("no URL fond from %s", jenkins.Name) err = fmt.Errorf("no URL fond from %s", jenkins.Name)
} }
......
...@@ -3,11 +3,12 @@ package util ...@@ -3,11 +3,12 @@ package util
import ( import (
"os/exec" "os/exec"
"runtime" "runtime"
"strings"
"syscall" "syscall"
) )
// Open a URL in a browser // Open a URL in a browser
func Open(url string, cmdContext ExecContext) error { func Open(url string, browser string, cmdContext ExecContext) error {
var cmd string var cmd string
var args []string var args []string
...@@ -17,6 +18,10 @@ func Open(url string, cmdContext ExecContext) error { ...@@ -17,6 +18,10 @@ func Open(url string, cmdContext ExecContext) error {
args = []string{"/c", "start"} args = []string{"/c", "start"}
case "darwin": case "darwin":
cmd = "Open" cmd = "Open"
if browser != "" {
browser = strings.ReplaceAll(browser, "-", " ")
args = append(args, "-a", browser)
}
default: // "linux", "freebsd", "openbsd", "netbsd" default: // "linux", "freebsd", "openbsd", "netbsd"
cmd = "xdg-Open" cmd = "xdg-Open"
} }
......
...@@ -9,7 +9,7 @@ import ( ...@@ -9,7 +9,7 @@ import (
var _ = Describe("Test open browser", func() { var _ = Describe("Test open browser", func() {
It("should success", func() { It("should success", func() {
err := Open("fake://url", FakeExecCommandSuccess) err := Open("fake://url", "", FakeExecCommandSuccess)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
}) })
}) })
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册