未验证 提交 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:
gen-data-darwin: go-bindata-download-darwin
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 ./...
golint -set_exit_status app/cmd/...
golint -set_exit_status app/helper/...
......@@ -92,12 +95,12 @@ fmt:
test:
mkdir -p bin
go test ./util -v -count=1
go test ./client -v -count=1 -coverprofile coverage.out
go test ./app -v -count=1
go test ./app/cmd -v -count=1
go test ./app/health -v -count=1
go test ./app/helper -v -count=1
go test ./app/i18n -v -count=1
go test ./client -v -count=1
go test ./app/cmd -v -count=1
dep:
go get github.com/AlecAivazis/survey/v2
......
......@@ -2,6 +2,7 @@ package cmd
import (
"fmt"
"os"
"github.com/jenkins-zh/jenkins-cli/app/i18n"
......@@ -12,21 +13,37 @@ import (
// CASCOpenOption is the option of casc open cmd
type CASCOpenOption struct {
ExecContext util.ExecContext
Browser string
}
var cascOpenOption CASCOpenOption
func init() {
cascCmd.AddCommand(cascOpenCmd)
cascOpenCmd.Flags().StringVarP(&cascOpenOption.Browser, "browser", "b", "",
i18n.T("Open Jenkins with a specific browser"))
}
var cascOpenCmd = &cobra.Command{
Use: "open",
Short: 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 {
jenkins := getCurrentJenkinsFromOptionsOrDie()
return util.Open(fmt.Sprintf("%s/configuration-as-code", jenkins.URL), cascOpenOption.ExecContext)
PreRun: func(_ *cobra.Command, _ []string) {
if cascOpenOption.Browser == "" {
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{
since: "v0.0.24",
......
......@@ -305,6 +305,7 @@ type HookOption struct {
SkipPostHook bool
}
// Deprecated, please replace this with getCurrentJenkinsAndClient
func getCurrentJenkinsAndClientOrDie(jclient *client.JenkinsCore) (jenkins *JenkinsServer) {
jenkins = getCurrentJenkinsFromOptionsOrDie()
jclient.URL = jenkins.URL
......
......@@ -5,6 +5,7 @@ import (
"github.com/jenkins-zh/jenkins-cli/app/i18n"
"github.com/jenkins-zh/jenkins-cli/util"
"github.com/spf13/cobra"
"os"
)
// OpenOption is the open cmd option
......@@ -12,6 +13,8 @@ type OpenOption struct {
CommonOption
InteractiveOption
Browser string
Config bool
}
......@@ -21,8 +24,17 @@ func init() {
rootCmd.AddCommand(openCmd)
openCmd.Flags().BoolVarP(&openOption.Config, "config", "c", false,
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.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{
......@@ -30,6 +42,11 @@ var openCmd = &cobra.Command{
Short: i18n.T("Open your Jenkins with a browser"),
Long: i18n.T(`Open your Jenkins with a browser`),
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) {
var jenkins *JenkinsServer
......@@ -56,7 +73,8 @@ var openCmd = &cobra.Command{
if openOption.Config {
url = fmt.Sprintf("%s/configure", url)
}
err = util.Open(url, openOption.ExecContext)
browser := openOption.Browser
err = util.Open(url, browser, openOption.ExecContext)
} else {
err = fmt.Errorf("no URL found with Jenkins %s", configName)
}
......
......@@ -2,6 +2,8 @@ package cmd
import (
"fmt"
"github.com/jenkins-zh/jenkins-cli/app/i18n"
"os"
"github.com/jenkins-zh/jenkins-cli/util"
"github.com/spf13/cobra"
......@@ -10,23 +12,37 @@ import (
// PluginOpenOption is the option of plugin open cmd
type PluginOpenOption struct {
ExecContext util.ExecContext
Browser string
}
var pluginOpenOption PluginOpenOption
func init() {
pluginCmd.AddCommand(pluginOpenCmd)
pluginOpenCmd.Flags().StringVarP(&pluginOpenOption.Browser, "browser", "b", "",
i18n.T("Open Jenkins with a specific browser"))
}
var pluginOpenCmd = &cobra.Command{
Use: "open",
Short: "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) {
jenkins := getCurrentJenkinsFromOptionsOrDie()
jenkins := getCurrentJenkinsFromOptions()
if jenkins == nil {
err = fmt.Errorf("cannot found Jenkins by %s", rootOptions.Jenkins)
return
}
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 {
err = fmt.Errorf("no URL fond from %s", jenkins.Name)
}
......
......@@ -3,11 +3,12 @@ package util
import (
"os/exec"
"runtime"
"strings"
"syscall"
)
// 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 args []string
......@@ -17,6 +18,10 @@ func Open(url string, cmdContext ExecContext) error {
args = []string{"/c", "start"}
case "darwin":
cmd = "Open"
if browser != "" {
browser = strings.ReplaceAll(browser, "-", " ")
args = append(args, "-a", browser)
}
default: // "linux", "freebsd", "openbsd", "netbsd"
cmd = "xdg-Open"
}
......
......@@ -9,7 +9,7 @@ import (
var _ = Describe("Test open browser", func() {
It("should success", func() {
err := Open("fake://url", FakeExecCommandSuccess)
err := Open("fake://url", "", FakeExecCommandSuccess)
Expect(err).To(BeNil())
})
})
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册